Google Cloud Armor consente di definire regole prioritarie con condizioni e azioni di corrispondenza configurabili in un criterio di sicurezza. Una regola ha effetto, ovvero l'azione configurata viene applicata se la regola è la regola con la priorità più alta le cui condizioni corrispondono agli attributi della richiesta in entrata.
Esistono due tipi di condizioni di corrispondenza:
- Una condizione di corrispondenza di base contiene elenchi di indirizzi IP o elenchi di intervalli di indirizzi IP.
- Una condizione di corrispondenza avanzata contiene un'espressione con più sottoespressioni per trovare una corrispondenza in una serie di attributi di una richiesta in entrata.
La lingua delle regole personalizzate viene utilizzata per scrivere le espressioni nelle condizioni di corrispondenza avanzate per le regole dei criteri di sicurezza. Il linguaggio delle regole personalizzate di Google Cloud Armor è un sottoinsieme del Common Expression Language (CEL) e contiene più operazioni personalizzate.
Un'espressione richiede due componenti:
- Attributi che possono essere controllati nelle espressioni delle regole.
- Operazioni che possono essere eseguite sugli attributi come parte di un'espressione.
Ad esempio, la seguente espressione utilizza gli attributi origin.ip
e 9.9.9.0/24
nell'operazione inIpRange()
. In questo caso, l'espressione restituisce true se origin.ip
è compreso nell'intervallo di indirizzi IP di 9.9.9.0/24
.
inIpRange(origin.ip, '9.9.9.0/24')
Attributi
Gli attributi rappresentano le informazioni di una richiesta in entrata, come l'indirizzo IP di origine o il percorso dell'URL richiesto.
Campo | Tipo | Descrizione del campo |
---|---|---|
origin.ip |
string | L'indirizzo IP di origine della richiesta. |
request.headers |
mappa | Una mappa stringa-stringa delle intestazioni delle richieste HTTP. Se un'intestazione contiene più valori, il valore in questa mappa sarà una stringa separata da virgole di tutti i valori dell'intestazione. Le chiavi in questa mappa sono tutte in minuscolo. Tutte le intestazioni accettate dal bilanciamento del carico HTTP(S) esterno vengono controllate e vengono applicate le stesse limitazioni di intestazione. |
request.method |
string | Il metodo di richiesta HTTP, come GET o POST . |
request.path |
string | Il percorso URL HTTP richiesto. |
request.scheme |
string | Lo schema URL HTTP, come http o https .
I valori per questo attributo sono tutti in minuscolo. |
request.query |
string | La query sull'URL HTTP nel formato name1=value&name2=value2 , come appare nella prima riga della richiesta HTTP. Non viene eseguita alcuna decodifica.
|
origin.region_code |
string | Il codice Unicode del paese associato all'IP di origine, ad esempio US . Se crei una regola o un'espressione che utilizza i codici paese o regione ISO 3166-1 alpha 2, Google Cloud Armor tratta ogni codice in modo indipendente. Le regole e le espressioni di Google Cloud Armor utilizzano esplicitamente tali codici regione per consentire o negare le richieste.
Per ulteriori informazioni, consulta unicode_region_subtag nello standard tecnico Unicode. |
origin.asn |
integer | Il numero di sistema autonomo (ASN) associato all'indirizzo IP di origine. L'ASN univoco globale viene determinato in base all'operatore di rete che supporta i prefissi degli indirizzi IP che contengono l'indirizzo IP di origine. |
Attributi reCAPTCHA Enterprise
In questa sezione sono elencati gli attributi applicabili solo ai token reCAPTCHA Enterprise o ai cookie di esenzione. Una sottoespressione basata su questi attributi restituisce false
se il token reCAPTCHA o il cookie di esenzione da valutare non è disponibile o non è valido (non valido, non corrispondente o scaduto).
Attributi dei cookie di esenzione
Campo | Tipo | Descrizione del campo |
---|---|---|
token.recaptcha_exemption.valid |
bool |
La presenza di un cookie di esenzione reCAPTCHA valido. |
Attributi token azione
Campo | Tipo | Descrizione del campo |
---|---|---|
token.recaptcha_action.score |
float |
Il punteggio di un token azione reCAPTCHA. Un punteggio valido va da 0.0 a 1.0 , dove 0.0 è molto probabilmente un utente illegittimo e 1.0 è molto probabilmente un utente legittimo. |
token.recaptcha_action.captcha_status |
string |
Lo stato captcha di un token di azione reCAPTCHA. Uno stato valido è NONE , PASS o FAIL , dove NONE si riferisce all'assenza di sfide durante la valutazione di reCAPTCHA, per cui il campo captcha manca nel token dell'azione. |
token.recaptcha_action.action |
string |
Il nome dell'azione (fino a 100 caratteri) di un token azione reCAPTCHA. Vedi Nomi delle azioni. |
token.recaptcha_action.valid |
bool |
La presenza di un token dell'azione reCAPTCHA valido. |
Attributi token sessione
Campo | Tipo | Descrizione del campo |
---|---|---|
token.recaptcha_session.score |
float |
Il punteggio di un token sessione di reCAPTCHA. Un punteggio valido va da 0.0 a 1.0 , dove 0.0 è molto probabilmente un utente illegittimo e 1.0 è molto probabilmente un utente legittimo. |
token.recaptcha_session.valid |
bool |
La presenza di un token di sessione reCAPTCHA valido. |
Suite operativa
Nel seguente riferimento vengono descritti gli operatori che puoi utilizzare con gli attributi (rappresentati da x
, y
e k
) per definire le espressioni di regole.
Espressioni | Descrizione |
---|---|
x == "foo" |
Restituisce true se x è uguale al valore letterale della stringa costante specificato. |
x == R"fo'o" |
Restituisce true se x è uguale al valore letterale della stringa non elaborata specificato che non interpreta le sequenze di escape. I valori letterali non elaborati delle stringhe sono comodi per esprimere stringhe che devono utilizzare caratteri di sequenza di escape. |
x == y |
Restituisce true se x è uguale a y. |
x != y |
Restituisce true se x non è uguale a y. |
x + y |
Restituisce la stringa concatenata xy. |
x && y |
Restituisce true se sia x sia y sono veri. |
x || y |
Restituisce true se x, y o entrambe sono vere. |
!x |
Restituisce true se il valore booleano x è falso o restituisce false se il valore booleano x è vero. |
x.contains(y) |
Restituisce true se la stringa x contiene la sottostringa y. |
x.startsWith(y) |
Restituisce true se la stringa x inizia con la sottostringa y. |
x.endsWith(y) |
Restituisce true se la stringa x termina con la sottostringa y. |
x.matches(y) |
Restituisce true se la stringa x corrisponde al pattern RE2 specificato y. Il pattern RE2 viene compilato utilizzando l'opzione RE2::Latin1 che disabilita le funzionalità Unicode. |
inIpRange(x, y) |
Restituisce true se l'indirizzo IP x è incluso nell'intervallo IP y. Le subnet mask per gli indirizzi IPv6 non possono essere più grandi di /64. |
x.lower() |
Restituisce il valore minuscolo della stringa x. |
x.upper() |
Restituisce il valore maiuscolo della stringa x. |
x.base64Decode() |
Restituisce il valore decodificato base64 di x; i caratteri _ - vengono sostituiti rispettivamente con / + .
Restituisce "" (stringa vuota) se x non è un valore di base64 valido. |
has(m['k']) |
Restituisce true se la chiave k è disponibile nella mappa m. |
m['k'] |
Restituisce il valore della chiave k nella mappa da stringa a stringa m se k è disponibile; in caso contrario, restituisce un errore. L'approccio consigliato è
quello di verificare prima la disponibilità utilizzando "has(m['k'])==true" . |
int(x) |
Converte il risultato della stringa di x in un tipo int . Può quindi essere utilizzato per eseguire un confronto di numeri interi utilizzando operatori aritmetici standard come > e <=. Questa operazione funziona solo per i valori che devono essere numeri interi. |
size(x) |
Restituisce la lunghezza della stringa x. |
x.urlDecode() |
Restituisce il valore decodificato url di x; le sequenze di caratteri in formato %## vengono sostituite con gli equivalenti non ASCII e + viene sostituito da uno spazio. Le codifiche non valide vengono restituite così come sono. |
x.urlDecodeUni() |
Restituisce il valore decodificato url di x; oltre a urlDecode() , gestisce anche le sequenze di caratteri Unicode in formato %u### . Le codifiche non valide vengono restituite così come sono. |
x.utf8ToUnicode() |
Restituisce la rappresentazione Unicode minuscolo di una codifica UTF-8 x. |
Espressioni di esempio
Per ognuna di queste espressioni, l'azione intrapresa dipende dal fatto che l'espressione sia inclusa in una regola di negazione o in una regola di autorizzazione.
Consenti o nega l'accesso in base a un intervallo di indirizzi IP in IPv4 o IPv6
La seguente espressione corrisponde alle richieste dall'intervallo di indirizzi IP
9.9.9.0/24
:inIpRange(origin.ip, '9.9.9.0/24')
La seguente espressione corrisponde alle richieste dall'intervallo di indirizzi IP
2001:db8::/32
:inIpRange(origin.ip, '2001:db8::/32')
Consentire o negare il traffico con un cookie specifico
La seguente espressione corrisponde alle richieste che hanno un cookie contenente
80=BLAH
:has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
Consenti o nega il traffico con un'intestazione referer
non vuota
La seguente espressione corrisponde alle richieste che hanno un'intestazione
referer
non vuota:has(request.headers['referer']) && request.headers['referer'] != ""
Consenti o nega il traffico in base all'URL dell'host nell'intestazione
La seguente espressione corrisponde alle richieste a un URL specifico:
request.headers['host'].lower().contains('test.example.com')
Consentire o negare il traffico da una regione specifica
Se la tua applicazione web non è disponibile nella regione AU
, tutte le
richieste da quella regione devono essere bloccate.
In una regola di negazione, utilizza la seguente espressione, che corrisponde alle richieste dalla regione
AU
:origin.region_code == 'AU'
In alternativa, se la tua applicazione web è disponibile solo nella regione AU
, le richieste da tutte le altre regioni devono essere bloccate.
In una regola di negazione, utilizza l'espressione seguente, che corrisponde alle richieste di tutte le aree geografiche diverse da
AU
:origin.region_code != 'AU'
I codici regione si basano sui codici ISO 3166-1 alpha 2. In alcuni casi, un'area geografica corrisponde a un paese, ma non sempre. Ad esempio, il codice US
include tutti gli stati degli Stati Uniti, un distretto e sei aree periferiche.
Consentire o negare il traffico da un ASN specifico
Se la tua applicazione web deve essere bloccata per i clienti serviti da uno specifico operatore di rete, puoi utilizzare il numero ASN dell'operatore di rete per bloccarla.
In una regola di negazione, utilizza la seguente espressione, che corrisponde alle richieste di un ASN specifico:
origin.asn == 123
In alternativa, se la tua applicazione web deve essere disponibile solo per i clienti di un operatore di rete specifico, le richieste di tutti gli altri operatori di rete devono essere bloccate.
In una regola di negazione, utilizza l'espressione seguente, che corrisponde a tutti gli altri operatori di rete diversi da quello che vuoi consentire:
origin.asn != 123
Più espressioni
Per includere più condizioni in una singola regola, combina più espressioni secondarie.
Nell'esempio seguente, le richieste provenienti da
1.2.3.0/24
(ad esempio i tuoi alpha tester) nella regioneAU
corrispondono alla seguente espressione:origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
La seguente espressione corrisponde alle richieste da
1.2.3.4
in cui uno user agent contiene la stringaWordPress
:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
Consenti o nega il traffico per un URI della richiesta che corrisponde a un'espressione regolare
La seguente espressione corrisponde alle richieste che contengono la stringa
bad_path
nell'URI:request.path.matches('/bad_path/')
La seguente espressione corrisponde alle richieste che hanno
Chrome
nel campo intestazioneUser-Agent
:request.headers['user-agent'].matches('Chrome')
La seguente espressione mostra una corrispondenza senza distinzione tra maiuscole e minuscole per l'intestazione
User-Agent
contenentewordpress
; corrisponde aUser-Agent:WordPress/605.1.15
,User-Agent:wordPress
e altre varianti diwordpress
:request.headers['user-agent'].matches('(?i:wordpress)')
Consenti o nega il traffico che contiene uno specifico valore decodificato base64
La seguente espressione corrisponde alle richieste che hanno un valore decodificato base64
myValue
per l'intestazioneuser-id
:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
Consenti o nega il traffico che contiene un valore di stringa di una lunghezza specifica
La seguente espressione corrisponde a richieste che hanno una lunghezza dell'URL superiore a 10 caratteri:
size(request.path) < 10
La seguente espressione corrisponde a richieste che hanno un'intestazione
x-data
di lunghezza superiore o uguale a 1024 caratteri:size(request.headers['x-data']) ≥ 1024
Consenti o nega il traffico che non ha content-length
nel corpo HTTP
La seguente espressione corrisponde a richieste con zero
content-length
nel corpo HTTP:int(request.headers["content-length"]) == 0
Consenti o nega il traffico che contiene uno specifico valore codificato nell'URL
L'espressione seguente corrisponde alle richieste con un valore cookie che contiene
%3c
:has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
Consenti o nega il traffico che contiene un valore codificato in URL specifico di una stringa Unicode
La seguente espressione corrisponde a richieste che hanno un valore cookie pari a
Match%2BValue
oMatch%u002BValue
:has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
Consenti o nega il traffico che contiene una stringa Unicode specifica di un testo UTF-8
La seguente espressione corrisponde a richieste che hanno un valore cookie pari a
¬
:has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
Regole WAF preconfigurate
Le regole WAF preconfigurate utilizzano firme statiche preconfigurate, espressioni regolari o entrambe le corrispondenze per corrispondere al corpo POST HTTP, alle intestazioni di richiesta HTTP e ai parametri di ricerca. Le regole WAF preconfigurate disponibili si basano sul set di regole di sicurezza OWASP Modsecurity versione 3.3. Google Cloud Armor fornisce diverse regole WAF predefinite preconfigurate. Per un elenco completo delle regole WAF preconfigurate, consulta la panoramica delle regole WAF preconfigurate di Google Cloud Armor.
Per elencare tutte le regole WAF preconfigurate disponibili, consulta Elencare le regole WAF preconfigurate disponibili.
Per ulteriori informazioni sulle regole WAF preconfigurate, consulta il caso d'uso Mitigare gli attacchi a livello di applicazione utilizzando regole WAF preconfigurate.
Nomi delle regole WAF preconfigurate
Il formato dei nomi delle regole WAF preconfigurate è <attack category>-<ModSecurity CRS version>-<version field>
. La categoria di attacco specifica il tipo di attacchi contro i quali vuoi proteggerti, ad esempio xss
(cross-site scripting) o sqli
(SQL injection).
I campi della versione supportati sono stable
e canary
. Le aggiunte e le
modifiche alle regole vengono rilasciate per prime nella versione canary
. Quando le aggiunte e le modifiche sono considerate sicure e stabili, vengono promosse alla versione stable
.
ID membri delle regole WAF preconfigurate
Una regola WAF preconfigurata contiene diverse espressioni, ciascuna con la sua firma.
Ad esempio, la regola WAF preconfigurata xss-v33-stable
include un'espressione denominata owasp-crs-v030301-id941100-xss
, che corrisponde all'ID regola id941100
per la versione 3.3. Puoi utilizzare le firme per escludere frasi specifiche dall'utilizzo, una funzionalità utile se una determinata espressione attiva sempre un falso positivo. Per ulteriori informazioni, consulta le informazioni per la risoluzione dei falso positivi.
Per informazioni sul set di regole di base e sull'ottimizzazione a diversi livelli di sensibilità, consulta la sezione Regolazione delle regole WAF Google Cloud Armor.
Operatore per regole WAF preconfigurate
Espressioni | Descrizione |
---|---|
evaluatePreconfiguredWaf(string, MAP<string, dyn>) |
Restituisce true se una delle firme WAF all'interno della serie di regole WAF specificata restituisce true. Il primo argomento è il nome della serie di regole WAF, ad esempio xss-v33-stable . Il secondo argomento (facoltativo) è una mappa in cui la chiave è una stringa e il valore viene digitato dinamicamente a seconda della chiave. Lo scopo di questo argomento è ottimizzare le firme WAF valutate. Le chiavi accettate includono:
Le chiavi "opt_out_rule_ids" e "opt_in_rule_ids" si escludono a vicenda. Puoi scegliere di utilizzare "opt_in_rule_ids" se vuoi esaminare e attivare manualmente le nuove firme WAF aggiunte in un secondo momento in una serie di regole esistente. |
evaluatePreconfiguredExpr(string, LIST) |
Restituisce true se una delle espressioni all'interno della regola WAF preconfigurata specifica restituisce true. Il primo argomento è il nome della regola WAF preconfigurata, ad esempio
|
Esempi di regole WAF preconfigurate
L'espressione seguente utilizza la regola WAF preconfigurata
xss-v33-stable
per mitigare gli attacchi XSS:evaluatePreconfiguredExpr('xss-v33-stable')
L'espressione seguente utilizza tutte le espressioni della regola WAF preconfigurata
xss-v33-stable
, ad eccezione degli ID membro941100
e941110
:evaluatePreconfiguredExpr('xss-v33-stable', ['owasp-crs-v030301-id941100-xss', 'owasp-crs-v030301-id941110-xss'])
L'espressione seguente utilizza una regola WAF preconfigurata per mitigare gli attacchi SQL nell'intervallo di indirizzi IP
198.51.100.0/24
:inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredExpr('sqli-v33-stable')
Passaggi successivi
- Configurare criteri, regole ed espressioni di sicurezza
- Perfezionare le regole del web application firewall (WAF)
- Risolvere i problemi