Ogni regola del criterio di sicurezza di Google Cloud Armor ha una priorità, una condizione di corrispondenza e un'azione. Google Cloud Armor esegue l'azione della regola con la priorità più alta che corrisponde a una richiesta. Le regole con una priorità inferiore rispetto alla regola di corrispondenza con la priorità più elevata non vengono valutate, anche se hanno le stesse condizioni di corrispondenza.
Ogni regola del criterio di sicurezza supporta due tipi di condizioni di corrispondenza:
- Una condizione di corrispondenza di base contiene elenchi di indirizzi IP o di intervalli di indirizzi IP. Le condizioni di corrispondenza di base vengono definite utilizzando
Flag
--src-ip-ranges
durante la creazione di una regola utilizzando Google Cloud CLI. - Una condizione di corrispondenza avanzata contiene un'espressione con fino a cinque
subespressioni che possono corrispondere a una serie di attributi di una richiesta in arrivo.
Le condizioni di corrispondenza avanzate vengono definite utilizzando il flag
--expression
quando si crea una regola utilizzando Google Cloud CLI.
Questa pagina illustra le condizioni di corrispondenza avanzate e Google Cloud Armor linguaggio di regole personalizzate che utilizzi per scrivere espressioni nella corrispondenza avanzata le condizioni delle regole del criterio di sicurezza. Le regole personalizzate di Google Cloud Armor è un sottoinsieme del Common Expression Language (CEL). Le espressioni scritte nell'intervallo Il linguaggio delle regole personalizzate di Google Cloud Armor richiede due componenti:
- L'attributo: i dati da esaminare
- L'operazione: come utilizzare i dati
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 9.9.9.0/24
.
inIpRange(origin.ip, '9.9.9.0/24')
Anche se l'espressione di esempio precedente corrisponde solo all'indirizzo IP di origine, quando utilizzi l'espressione di esempio in un criterio di sicurezza di Google Cloud Armor. viene considerata una regola con condizioni di corrispondenza avanzate da un dal punto di vista della quota. Per ulteriori informazioni, consulta Quote e quote di Google Cloud Armor limiti.
Attributi
Gli attributi rappresentano 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. |
origin.user_ip |
string | L'indirizzo IP del client di origine, incluso nella
HTTP-HEADER da un proxy upstream. Prima di utilizzare questa funzionalità
devi configurare l'attributo userIpRequestHeaders[]
opzione nel campo advancedOptionsConfig del criterio di sicurezza
per trovare una corrispondenza con un'origine come True-Client-IP ,
X-Forwarded-For o X-Real-IP .
Se non configuri l'opzione |
origin.tls_ja3_fingerprint |
string | Impronta TLS/SSL di JA3
se il client si connette
HTTPS , HTTP/2 o HTTP/3 . In caso contrario
disponibile, viene restituita una stringa vuota. |
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
minuscole. Tutte le intestazioni accettate dai bilanciatori del carico delle applicazioni esterni
e le limitazioni per la stessa intestazione
. L'approccio consigliato è verificare prima la disponibilità utilizzando
|
request.method |
string | Il metodo di richiesta HTTP, ad esempio GET o POST . |
request.path |
string | Il percorso URL HTTP richiesto. |
request.scheme |
string | Lo schema URL HTTP, ad esempio http o https .
I valori di questo attributo sono tutti in minuscolo. |
request.query |
string | La query URL HTTP nel formato
name1=value&name2=value2 , come appare nella prima riga di
la 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 stai creando 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 questi codici regione per consentire o negare le richieste.
Per saperne di più, consulta unicode_region_subtag nello standard tecnico Unicode. |
origin.asn |
integer | Il numero di sistema autonomo (ASN) associato all'origine Indirizzo IP. L'ASN univoco a livello globale viene determinato in base alla rete che supporti i prefissi dell'indirizzo IP che contengono l'indirizzo IP di origine. |
Attributi reCAPTCHA
In questa sezione vengono elencati gli attributi applicabili solo a
Token reCAPTCHA o cookie di esenzione. Un'espressione secondaria basata su questi attributi restituisce false
se il token reCAPTCHA o il cookie di esenzione da valutare non è disponibile o non è valido per uno dei seguenti motivi:
- Il token non è valido e non può essere decodificato.
- Il token contiene attributi non validi. Ad esempio, il token è stato generato utilizzando una chiave reCAPTCHA che non corrisponda alle chiavi reCAPTCHA associate alla regola.
- Il token è 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 di azione
Campo | Tipo | Descrizione del campo |
---|---|---|
token.recaptcha_action.score |
float |
Il punteggio di un token di azione reCAPTCHA. Un punteggio valido va da
0.0 a 1.0 , dove 0.0 indica molto probabilmente un
account non legittimo e 1.0 un account molto probabilmente
legittimo. |
token.recaptcha_action.captcha_status |
string |
Lo stato del captcha di un token di azione reCAPTCHA. Uno stato valido è
NONE , PASS o FAIL , dove
NONE si riferisce a quando non sono previste sfide durante
test reCAPTCHA, in modo tale che il campo captcha non sia presente nella
token di azione. |
token.recaptcha_action.action |
string |
Il nome dell'azione (fino a 100 caratteri) da un token di azione reCAPTCHA. Consulta Nomi delle azioni. |
token.recaptcha_action.valid |
bool |
La presenza di un token di azione reCAPTCHA valido. |
Attributi token di sessione
Campo | Tipo | Descrizione del campo |
---|---|---|
token.recaptcha_session.score |
float |
Il punteggio di un token di sessione reCAPTCHA. Un punteggio valido va da
0.0 a 1.0 , dove 0.0 indica molto
probabilmente un utente non legittimo e 1.0 indica molto
probabilmente un utente legittimo. |
token.recaptcha_session.valid |
bool |
La presenza di un token di sessione reCAPTCHA valido. |
Operazioni
Il seguente riferimento descrive gli operatori che puoi utilizzare con gli attributi
(rappresentati da x
, y
e k
) per definire le espressioni delle regole.
Espressioni | Descrizione |
---|---|
x == "foo" |
Restituisce true se x è uguale alla stringa letterale costante specificata. |
x == R"fo'o" |
Restituisce true se x è uguale al valore letterale di stringa non elaborato specificato che corrisponde a non interpretare le sequenze di escape. I valori letterali di stringa non elaborata sono comodi che esprimono stringhe che a loro volta 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 true. |
x || y |
Restituisce true se x, y o entrambi sono veri. |
!x |
Restituisce true se il valore booleano x è falso oppure restituisce false se il valore booleano x è vero. |
x.contains(y) |
Restituisce il valore True se la stringa x contiene la sottostringa y. |
x.startsWith(y) |
Restituisce il valore 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 parzialmente al pattern RE2 y specificato. Il pattern RE2 viene compilato utilizzando l'opzione RE2::Latin1 che disattiva le funzionalità Unicode. |
inIpRange(x, y) |
Restituisce true se l'indirizzo IP x è compreso nell'intervallo IP Y. |
x.lower() |
Restituisce il valore minuscolo della stringa x. |
x.upper() |
Restituisce il valore in maiuscolo della stringa x. |
x.base64Decode() |
Restituisce il valore decodificato in base64 di x; i caratteri
_ - vengono prima sostituiti rispettivamente con / + .
Restituisce "" (stringa vuota) se x non è un valore Base64 valido
valore. |
has(m['k']) |
Restituisce true se la chiave k è disponibile nella mappa m. |
m['k'] |
Restituisce il valore associato alla chiave k nella mappa di stringhe a stringhe m se
k è disponibile; in caso contrario, restituisce un errore. L'approccio consigliato è
per verificare prima la disponibilità utilizzando "has(m['k'])==true" . |
int(x) |
Converte il risultato stringa di x in un tipo int . Può quindi essere utilizzato per eseguire un confronto tra numeri interi utilizzando operatori aritmetici standard come > e <=. Questo funziona solo per i valori che dovrebbero essere interi. |
size(x) |
Restituisce la lunghezza della stringa x. |
x.urlDecode() |
Restituisce il valore decodificato dall'URL di x; le sequenze di caratteri in formato
%## vengono sostituite con gli equivalenti non ASCII e
+ viene sostituito con uno spazio. Vengono restituite codifiche non valide
così com'è. |
x.urlDecodeUni() |
Restituisce il valore decodificato in base all'URL di x; oltre a
urlDecode() , gestisce anche le sequenze di caratteri Unicode in
%u### . Le codifiche non valide vengono restituite così come sono. |
x.utf8ToUnicode() |
Restituisce la rappresentazione Unicode in minuscolo di una codifica UTF-8 x |
Espressioni di esempio
Per ciascuna di queste espressioni, l'azione intrapresa dipende dal fatto che l'espressione sia inclusa in una regola di rifiuto 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 da
198.51.100.0/24
Intervallo di indirizzi IP:inIpRange(origin.ip, '198.51.100.0/24')
La seguente espressione corrisponde alle richieste provenienti dall'intervallo di indirizzi IP
2001:db8::/32
:inIpRange(origin.ip, '2001:db8::/32')
Consentire o negare l'accesso in base a un intervallo di indirizzi IP client personalizzato dietro un proxy upstream
Se hai configurato l'operatore origin.user_ip
, puoi trovare corrispondenze in base a
i valori dell'intestazione specificati nei
advancedOptionsConfig.userIpRequestHeaders[]
.
La seguente espressione corrisponde alle richieste che hanno avuto origine dalla Intervallo di indirizzi IP
192.0.2.0/24
:inIpRange(origin.user_ip, '192.0.2.0/24')
La seguente espressione corrisponde alle richieste originate dall'intervallo di indirizzi IP
2001:db8::/32
:inIpRange(origin.user_ip, '2001:db8::/32')
Consentire o negare il traffico con un cookie specifico
La seguente espressione corrisponde a richieste che hanno un cookie contenente
80=BLAH
:has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
Consentire o negare il traffico con un'intestazione referer
non vuota
La seguente espressione corrisponde alle richieste con un'intestazione
referer
non vuota:has(request.headers['referer']) && request.headers['referer'] != ""
Consentire o negare il traffico in base all'URL 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 provenienti da questa regione devono essere bloccate.
In una regola di negazione, utilizza la seguente espressione che corrisponde alle richieste provenienti
AU
regione: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 rifiuto, utilizza la seguente espressione, che corrisponde alle richieste provenienti da tutte le regioni diverse dalla regione
AU
:origin.region_code != 'AU'
I codici regione si basano sui codici ISO 3166-1 alpha 2. In alcuni casi, una regione corrisponde a un paese, ma non sempre
anche se non l'ha creata in prima persona. 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 una specifica puoi utilizzare il numero ASN dell'operatore di rete da bloccare.
In una regola di negazione, utilizza la seguente espressione che corrisponde alle richieste da un ASN specifico:
origin.asn == 123
In alternativa, se la tua applicazione web deve essere solo disponibile 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 rifiuto, utilizza la seguente espressione, che corrisponde a tutti gli altri operatori di rete diversi da quello che ti interessa consentire:
origin.asn != 123
Più espressioni
Per includere più condizioni in una singola regola, combina più subespressioni.
Nell'esempio seguente, le richieste provenienti da
1.2.3.0/24
(ad esempio i tuoi tester alpha) nella regioneAU
corrispondono alla seguente espressione:origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
La seguente espressione corrisponde alle richieste di
1.2.3.4
in cui un utente l'agente contiene la stringaWordPress
:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
Consentire o negare il traffico per un URI richiesta che corrisponde a un'espressione regolare
La seguente espressione corrisponde alle richieste che contengono la stringa
example_path
nell'URI:request.path.matches('/example_path/')
La seguente espressione corrisponde alle richieste che hanno
Chrome
nell'elemento Campo intestazioneUser-Agent
:request.headers['user-agent'].matches('Chrome')
La seguente espressione mostra la 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 un valore decodificato Base64 specifico
La seguente espressione corrisponde a richieste con decodifica in base64 valore di
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 stringa di una lunghezza specifica
La seguente espressione corrisponde alle richieste con una lunghezza dell'URL maggiore più di 10 caratteri:
size(request.path) > 10
La seguente espressione corrisponde alle richieste con una lunghezza dell'intestazione
x-data
superiore o uguale a 1024 caratteri:size(request.headers['x-data']) >= 1024
Consenti o rifiuta il traffico che non ha content-length
nel corpo HTTP
La seguente espressione corrisponde alle richieste che hanno un valore
content-length
pari a zero nel corpo HTTP:int(request.headers["content-length"]) == 0
Consentire o negare il traffico che contiene un valore di codifica URL specifico
La seguente espressione corrisponde a richieste che hanno un valore di cookie contenente
%3c
:has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
Consentire o negare il traffico che contiene un valore codificato URL specifico di una stringa Unicode
La seguente espressione corrisponde alle richieste con un valore del cookie uguale a
Match%2BValue
oMatch%u002BValue
:has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
Consentire o negare il traffico che contiene una stringa Unicode specifica di un testo UTF-8
La seguente espressione corrisponde alle richieste con un valore del cookie uguale a
¬
:has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
Consentire o negare il traffico in base a un'impronta JA3 nota
La seguente espressione corrisponde alle richieste che hanno un'impronta JA3 uguale a
e7d705a3286e19ea42f587b344ee6865
:origin.tls_ja3_fingerprint == 'e7d705a3286e19ea42f587b344ee6865'
Consenti o nega il traffico in base a un elenco di impronte JA3
La seguente espressione corrisponde alle richieste che hanno un'impronta JA3 uguale a una delle seguenti impronte JA3:
e7d705a3286e19ea42f587b344ee6865
f8a5929f8949e846267b582072e35f84
8f8b62163873a62234c14f15e7b88340
origin.tls_ja3_fingerprint == 'e7d705a3286e19ea42f587b344ee6865' || origin.tls_ja3_fingerprint == 'f8a5929f8949e846267b582072e35f84' || origin.tls_ja3_fingerprint == '8f8b62163873a62234c14f15e7b88340'
Regole WAF preconfigurate
Le regole WAF preconfigurate utilizzano firme statiche preconfigurate, espressioni regolari o in modo che corrispondano al corpo HTTP POST, alle intestazioni delle richieste HTTP e parametri di ricerca. Le regole WAF preconfigurate disponibili si basano sul set di regole di base OWASP Modsecurity Versione 3.3. Google Cloud Armor fornisce diverse regole WAF preconfigurate predefinite. Per un elenco completo delle regole WAF preconfigurate, consulta Panoramica delle regole WAF preconfigurate di Google Cloud Armor.
Per elencare tutte le regole WAF preconfigurate disponibili, consulta Elenco di 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
I nomi delle regole WAF preconfigurate hanno il formato
<attack category>-<ModSecurity CRS version>-<version field>
. La
categoria di attacco specifica il tipo di attacchi da cui vuoi proteggerti,
ad esempio xss
(cross-site scripting) o sqli
(SQL injection).
I campi delle versioni supportate sono stable
e canary
. Aggiunte e
le modifiche alle regole vengono rilasciate prima nella versione canary
. Quando
aggiunte e 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 propria firma.
Ad esempio, la regola WAF preconfigurata xss-v33-stable
include un'espressione
denominato owasp-crs-v030301-id941100-xss
, che corrisponde all'ID regola id941100
per la versione 3.3. Puoi utilizzare le firme per escludere l'utilizzo di espressioni specifiche, il che è utile se una determinata espressione attiva costantemente un falso positivo. Per ulteriori informazioni, consulta il
positivi
informazioni sulla risoluzione dei problemi.
Per informazioni sul set di regole di base e sull'ottimizzazione sui livelli di sensibilità, consulta Ottimizzazione delle regole WAF di Google Cloud Armor.
Operatore per le regole WAF preconfigurate
Espressioni | Descrizione |
---|---|
evaluatePreconfiguredWaf(string, MAP<string, dyn>) |
Restituisce true se una delle firme WAF all'interno del insieme di regole WAF specificato restituisce true. Il primo argomento è il nome del WAF
una serie di regole, ad esempio xss-v33-stable . Il secondo argomento
(facoltativo) è una mappa in cui la chiave è una stringa e il valore è
digitato dinamicamente in base alla chiave. Lo scopo di questo argomento è
per ottimizzare le firme WAF valutate. Le chiavi accettate includono:
Le chiavi "opt_out_rule_ids" e "opt_in_rule_ids" sono reciprocamente esclusivi. Puoi scegliere di utilizzare "opt_in_rule_ids" se vuoi esaminare e attivare manualmente le nuove firme WAF aggiunte in un secondo momento in un insieme di regole esistente. |
evaluatePreconfiguredExpr(string, LIST) |
Restituisce true se una delle espressioni all'interno della regola WAF preconfigurata specificata restituisce true. Il primo argomento è il nome della regola WAF preconfigurata, ad esempio
|
Esempi di regole WAF preconfigurate
La seguente espressione utilizza la regola WAF preconfigurata
xss-v33-stable
per mitigare gli attacchi XSS:evaluatePreconfiguredExpr('xss-v33-stable')
La seguente espressione utilizza tutte le espressioni della regola WAF preconfigurata
xss-v33-stable
tranne gli ID membro941100
e941110
:evaluatePreconfiguredExpr('xss-v33-stable', ['owasp-crs-v030301-id941100-xss', 'owasp-crs-v030301-id941110-xss'])
La seguente espressione utilizza una regola WAF preconfigurata per mitigare gli attacchi SQLi dall'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
- Ottimizzare le regole del web application firewall (WAF)
- Risolvere i problemi