Configurazione degli attributi del linguaggio delle regole personalizzate

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 massima priorità che corrisponde a una richiesta. Regole con una priorità inferiore rispetto alla priorità più alta regola di corrispondenza non viene valutata, 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 elenchi di IP di indirizzi IP esterni. 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 composta da massimo cinque sottoespressioni che possono corrispondere a una varietà di attributi di una richiesta in entrata. Le condizioni di corrispondenza avanzate vengono definite utilizzando il flag --expression quando creando 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 userIpRequestHeaders[], se l'intestazione configurata contiene valori di indirizzo IP non validi o se l'intestazione configurata non è presente, il valore predefinito di origin.user_ip è origin.ip. Per ulteriori informazioni, consulta securityPolicy come riferimento delle risorse.

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 è separato da virgole stringa di tutti i valori dell'intestazione. In questa mappa le chiavi sono tutte minuscolo. Tutte le intestazioni accettate dai bilanciatori del carico delle applicazioni esterni e le limitazioni per la stessa intestazione .

L'approccio consigliato consiste nel verificare innanzitutto la disponibilità utilizzando has(), ad esempio has(request.headers['header-key']) && request.headers['header-key'] != 'header-value'.

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 per questo attributo sono tutti minuscoli.
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 paese Unicode associato all'IP di origine, ad esempio come US. Se crei una regola o un'espressione che utilizza ISO 3166-1 alpha 2 i codici paese o regione, Google Cloud Armor tratta ogni codice in modo indipendente. Le regole e le espressioni di Google Cloud Armor in modo esplicito e utilizzare questi codici regione per consentire o rifiutare 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. Una sottoespressione in base a questi attributi restituisce false se il token reCAPTCHA o esenzione il cookie 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.
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 Da 0.0 a 1.0, dove 0.0 è molto probabilmente è un utente illegittimo e 1.0 è molto probabile che utente 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 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 la sezione 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 Da 0.0 a 1.0, dove 0.0 è molto probabilmente è un utente illegittimo e 1.0 è molto probabile che utente legittimo.
token.recaptcha_session.valid bool La presenza di un token di sessione reCAPTCHA valido.

Operazioni

Di seguito sono descritti gli operatori che puoi utilizzare con gli attributi (rappresentato da x, y e k) per definire espressioni di regola.

Espressioni Descrizione
x == "foo" Restituisce true se x è uguale al valore letterale della stringa 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 è diverso da y.
x + y Restituisce la stringa concatenata xy.
x && y Restituisce true se x e y sono veri.
x || y Restituisce true se x, y o entrambi sono veri.
!x Restituisce true se il valore booleano x è falso oppure 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 parzialmente al valore specificato RE2 pattern y. Il pattern RE2 viene compilato utilizzando il comando RE2::Latin1 che disattiva le funzionalità Unicode.
inIpRange(x, y) Restituisce true se l'indirizzo IP x è contenuto nell'intervallo IP Y. Le subnet mask per gli indirizzi IPv6 non possono superare /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 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 nella chiave k nella mappa stringa-stringa m se k è disponibile; altrimenti 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ò essere utilizzato per fare un confronto di numeri interi mediante calcoli aritmetici standard operatori come > e <=. Questo metodo funziona solo per i valori che dovrebbero essere numeri interi.
size(x) Restituisce la lunghezza della stringa x.
x.urlDecode() Restituisce il valore decodificato in base all'URL di x; sequenze di caratteri in i formati %## vengono sostituiti con gli equivalenti non ASCII e + è stato 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 le è 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 da 198.51.100.0/24 Intervallo di indirizzi IP:

    inIpRange(origin.ip, '198.51.100.0/24')
    
  • La seguente espressione corrisponde alle richieste da 2001:db8::/32 Intervallo di indirizzi IP:

    inIpRange(origin.ip, '2001:db8::/32')
    

Consenti o nega 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 che hanno avuto origine dalla Intervallo di indirizzi IP 2001:db8::/32:

    inIpRange(origin.user_ip, '2001:db8::/32')
    
  • La seguente espressione corrisponde a 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 a richieste che hanno un campo non vuoto Intestazione referer:

    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, tutti le richieste provenienti da quella 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, devi bloccare le richieste provenienti da tutte le altre regioni.

  • In una regola di negazione, utilizza la seguente espressione che corrisponde alle richieste di tutti regioni diverse dalla regione AU:

    origin.region_code != 'AU'
    

I codici regione sono basati sulla ISO 3166-1 alpha 2 i codici. 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 disponibile solo per i clienti dietro uno specifico operatore di rete, quindi le richieste da tutte le altre reti gli operatori devono essere bloccati.

  • In una regola di negazione, utilizza la seguente espressione, che corrisponde a tutte le altre operatori diversi da quello che vuoi autorizzare:

    origin.asn != 123
    

Espressioni multiple

Per includere più condizioni in una singola regola, combina più sottoespressioni.

  • Nell'esempio seguente, le richieste da 1.2.3.0/24 (come i tuoi alpha tester) nella regione AU 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 stringa WordPress:

    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 l'URI di una 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 nell'elemento Campo intestazione User-Agent:

    request.headers['user-agent'].matches('Chrome')
    
  • La seguente espressione mostra la corrispondenza senza distinzione tra maiuscole e minuscole per il intestazione User-Agent contenente wordpress; corrisponde a User-Agent:WordPress/605.1.15, User-Agent:wordPress e altre varianti di wordpress:

    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'intestazione user-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 un'intestazione di lunghezza x-data maggiore 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('<')
    

Consenti o rifiuta il traffico che contiene uno specifico valore codificato nell'URL di una stringa Unicode

  • La seguente espressione corrisponde a richieste che hanno un valore dei cookie uguale a a Match%2BValue o Match%u002BValue:

    has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
    

Consentire o negare il traffico che contiene una stringa Unicode specifica di testo UTF-8

  • La seguente espressione corrisponde a richieste che hanno un valore dei cookie uguale a 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 fingerprint 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 predefinite preconfigurate. 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 attacco specifica il tipo di attacchi da cui si vuole proteggere, ad esempio xss (cross-site scripting) o sqli (SQL injection).

I campi delle versioni supportati 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 preconfigurati

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 espressioni specifiche Ciò è utile se una particolare espressione attiva in modo coerente 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 qualsiasi delle firme WAF all'interno del parametro specificato La serie di regole WAF 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 seguenti:
  • "sensitivity": corrisponde al ModSecurity Core Rule Set livello di paranoia, che ha 4 livelli, da 1 a 4. Il suo valore è un numero intero con un intervallo valido compreso tra 0 e 4. Tieni presente che 0 è riservato come valore valido. quando utilizzato in combinazione con "opt_in_rule_ids" (descritto in seguito). Quando specifichi una sensibilità di x (x >= 1), tutte le le firme WAF associate con un valore di sensibilità compreso tra 1 e x viene valutato. Se omesso, viene utilizzato 4 come valore di sensibilità.
  • "opt_out_rule_ids": le firme WAF (rappresentate dagli ID regola) da utilizzare la valutazione è disattivata, in cui l'insieme di base è determinato valore di sensibilità. Il suo valore è un elenco di stringhe. Il valore massimo il numero di ID regola consentiti è 128.
  • "opt_in_rule_ids": le firme WAF (rappresentate dagli ID regola) da utilizzare attivata per la valutazione, in cui il set di base è vuoto. Il suo valore è un di stringhe. Il numero massimo consentito di ID regola è 128. Quando lo utilizzi, viene applicata una "sensibilità" di 0 è necessario specificare un valore.

Le chiavi "opt_out_rule_ids" e "opt_in_rule_id" sono reciprocamente esclusivi. Puoi scegliere di utilizzare "opt_in_rule_id" se vuoi rivedere e attivare manualmente le nuove firme WAF che verranno aggiunte in seguito una serie di regole esistente.

evaluatePreconfiguredExpr(string, LIST)

Restituisce true se una delle espressioni all'interno del campo specificato la regola WAF preconfigurata restituisce true.

Il primo argomento è il nome della regola WAF preconfigurata, come xss-stable. Il secondo argomento (facoltativo) è un elenco di stringhe separate da virgole di ID da escludere la valutazione delle prestazioni. L'elenco di esclusione è utile quando un determinato membro del una regola WAF preconfigurata attiva un falso positivo.

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 in xss-v33-stable regola WAF preconfigurata, tranne per gli ID membro 941100 e 941110:

    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