Ottimizza le regole WAF preconfigurate di Google Cloud Armor

Google Cloud Armor fornisce regole WAF preconfigurate, ciascuna composta da più firme provenienti dal ModSecurity Core Rules Set (CRS). Ogni firma corrisponde a una regola di rilevamento degli attacchi nel set di regole. Le richieste in entrata vengono valutate in base alle regole WAF preconfigurate. Una richiesta corrisponde a una regola WAF preconfigurata se corrisponde a una qualsiasi delle firme associate alla regola WAF preconfigurata. Viene stabilita una corrispondenza quando l'espressione evaluatePreconfiguredWaf() o evaluatePreconfiguredExpr() restituisce il valore true.

Scegli un livello di sensibilità

Ogni firma ha un livello di sensibilità che corrisponde a un livello di paranoia di ModSecurity. Puoi selezionare una sensibilità compresa tra 0 e 4, anche se il livello di sensibilità 0 indica che nessuna regola è abilitata per impostazione predefinita.

Un livello di sensibilità inferiore indica firme di confidenza più elevate, che hanno meno probabilità di generare un falso positivo. Un livello di sensibilità più elevato aumenta la sicurezza, ma anche il rischio di generare un falso positivo. Quando selezioni un livello di sensibilità per la regola WAF, attivi le firme a livelli di sensibilità inferiori o uguali al livello di sensibilità selezionato. Nell'esempio seguente, ottimizzi una regola WAF preconfigurata selezionando il livello di sensibilità di 1:

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 1})

Disattiva le firme delle regole

Se decidi che una regola WAF preconfigurata corrisponde a più richieste del necessario o se blocca il traffico che deve essere consentito, puoi ottimizzarla per disattivare le firme non necessarie o comunque non necessarie. Per disattivare le firme in una determinata regola WAF preconfigurata, devi fornire un elenco di ID delle firme indesiderate all'espressione evaluatePreconfiguredWaf().

L'esempio seguente esclude due ID regola CRS dalla regola WAF preconfigurata sqli-v33-stable (CRS 3.3):

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 4, 'opt_out_rule_ids': ['owasp-crs-v030301-id942350-sqli', 'owasp-crs-v030301-id942360-sqli']})

Quando disattivi gli ID firma di set di regole CRS preconfigurate, devi far corrispondere la versione dell'ID firma alla versione del set di regole (CRS 3.0 o 3.3) per evitare errori di configurazione.

Puoi anche disattivare gli ID firma utilizzando l'espressione precedente evaluatePreconfigureExpr(). Per ulteriori informazioni sulle espressioni di regole WAF preconfigurate, consulta la documentazione di riferimento sul linguaggio delle regole personalizzate.

Attiva firme delle regole

Invece di disattivare le firme delle regole, puoi attivare le firme delle regole nei livelli di sensibilità disattivati. Ti consigliamo di attivare le firme delle regole quando ci sono meno firme che vuoi utilizzare in un determinato livello di sensibilità rispetto alle regole che vuoi disattivare. Per attivare le firme delle regole, il livello di sensibilità deve essere 0. L'esempio seguente disattiva tutte le firme cve-canary a tutti i livelli di sensibilità, quindi attiva esplicitamente owasp-crs-v030001-id044228-cve e owasp-crs-v030001-id144228-cve:

evaluatePreconfiguredWaf('cve-canary', {'sensitivity': 0, 'opt_in_rule_ids': ['owasp-crs-v030001-id044228-cve', 'owasp-crs-v030001-id144228-cve']})

Escludi i campi di richiesta dall'ispezione

L'applicazione personalizzata potrebbe includere contenuti nei campi di richiesta (come intestazioni, cookie, parametri di ricerca o URI) che corrispondono alle firme nelle regole WAF preconfigurate, ma che sono legittimi. In questo caso, puoi ridurre i falsi positivi escludendo questi campi di richiesta dall'ispezione associando un elenco di esclusioni per i campi di richiesta alla regola del criterio di sicurezza.

Quando configuri l'esclusione di un campo di richiesta, la associ a una destinazione, che può essere un'intera regola WAF preconfigurata o un elenco di firme in una regola WAF preconfigurata. Puoi specificare una corrispondenza esatta o parziale utilizzando un operatore di campo e un valore di campo. Gli operatori di campo disponibili sono i seguenti:

  • EQUALS: l'operatore trova una corrispondenza se il valore del campo è uguale al valore specificato.
  • STARTS_WITH: l'operatore corrisponde se il valore del campo inizia con il valore specificato.
  • ENDS_WITH: l'operatore corrisponde se il valore del campo termina con il valore specificato.
  • CONTAINS: l'operatore corrisponde se il valore del campo contiene il valore specificato.
  • EQUALS_ANY: l'operatore corrisponde se il valore del campo è qualsiasi valore.

Le seguenti sezioni forniscono ulteriori informazioni sui campi della richiesta che puoi escludere dall'ispezione, seguite da esempi.

Intestazioni delle richieste

Un elenco di nomi di intestazioni delle richieste il cui valore viene escluso dall'ispezione durante la valutazione preconfigurata delle regole WAF.

L'esclusione è applicabile solo per le firme nel target che controllano in origine il valore dell'intestazione della richiesta. Sono incluse le firme associate al seguente flag di richiesta nel set di regole di base ModSecurity:

  • REQUEST_HEADERS

Solo il valore delle intestazioni delle richieste specificate viene escluso dall'ispezione. Il nome è ancora in fase di ispezione.

Richiedi cookie

Un elenco di nomi di cookie della richiesta il cui valore viene escluso dall'ispezione durante la valutazione preconfigurata delle regole WAF.

L'esclusione si applica solo alle firme nel target che controllavano originariamente il valore del cookie della richiesta. Sono incluse le firme associate al seguente flag di richiesta nel ModSecurity Core Rules Set:

  • REQUEST_COOKIES

Solo il valore dei cookie di richiesta specificati viene escluso dall'ispezione. Il nome è ancora in fase di ispezione.

Parametri di ricerca della richiesta

Un elenco di nomi dei parametri di query della richiesta il cui valore è escluso dall'ispezione durante la valutazione preconfigurata delle regole WAF.

L'esclusione si applica solo per le firme nel target che controllano in origine i parametri della richiesta. Sono incluse le firme associate ai seguenti flag di richiesta nel set di regole principali di ModSecurity:

  • ARG
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

Solo il valore dei parametri di ricerca specificati viene escluso dall'ispezione, che può essere nella stringa di query o nel corpo del POST. Il nome è ancora in fase di ispezione.

Poiché parametri di ricerca fanno parte dell'URI e della riga della richiesta, questi campi vengono riassemblati per l'ispezione dopo l'esclusione dei parametri di ricerca specificati. Tuttavia, per le firme che esaminano l'intero corpo della richiesta (come le firme associate al flag della richiesta REQUEST_BODY), l'esclusione dei parametri di ricerca non viene applicata.

Ad esempio, se escludi un parametro di query denominato "args", potresti comunque trovare una corrispondenza su una firma che esamina l'intero corpo della richiesta se la richiesta contiene un parametro "args" nel corpo POST e corrisponde al valore "args".

URI di richiesta

Un elenco di URI nella riga della richiesta, esclusi i dati della stringa di query da escludere dall'ispezione durante la valutazione delle regole WAF preconfigurate.

L'esclusione è applicabile solo per le firme nel target che controllano in origine l'URI della richiesta. Ciò include le firme associate ai seguenti flag di richiesta nel ModSecurity Core Rules Set:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

Quando si esclude uno dei campi precedenti, il campo viene completamente escluso dall'ispezione e non viene eseguito riassemblaggio.

Valori dei campi

Devi specificare un valore di campo se utilizzi un operatore di campo diverso da EQUALS_ANY.

Per le intestazioni delle richieste, i cookie delle richieste e i parametri di ricerca delle richieste, il set di caratteri consentiti per i valori dei campi include i seguenti caratteri:

  • !, #, $, %, &, *, +, -, ., ^, _, `, |, ~
  • Caratteri alfanumerici da A a Z (sia minuscoli che maiuscoli)
  • Caratteri numerici da 0 a 9

Quando applichi esclusioni per questi campi di richiesta, i valori dei campi configurati vengono confrontati con i valori (senza distinzione tra maiuscole e minuscole, dopo la trasformazione) della richiesta. Non è previsto alcun intervento di codifica aggiuntiva se vuoi escludere un carattere specifico che non rientra nel set di caratteri consentito.

Per gli URI della richiesta, il valore del campo deve essere specificato in un formato URI come segue:

  • Uno schema è consentito, ma è limitato solo a http o https.
  • Un host è consentito e può essere un indirizzo IP.
  • È consentita una porta.
  • È consentito un percorso.
  • Query non consentita.
  • Un frammento non è consentito.

Quando applichi esclusioni per gli URI delle richieste, i valori dei campi configurati vengono confrontati con gli URI (senza distinzione tra maiuscole e minuscole, dopo la trasformazione) della riga della richiesta, esclusa la stringa di query. Gli URI della riga della richiesta possono essere relativi o assoluti. Tieni presente questo aspetto durante la configurazione delle esclusioni per gli URI delle richieste.

Esempi

Il primo esempio aggiorna la regola nel criterio di sicurezza POLICY_1 all'indirizzo PRIORITY per aggiungere una configurazione di esclusione per tutte le firme secondo la regola WAF sqli-v33-stable, in modo da escludere tutti i cookie della richiesta dall'ispezione:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_1 \
    --target-rule-set "sqli-v33-stable" \
    --request-cookie-to-exclude "op=EQUALS_ANY"

Il secondo esempio aggiorna la regola nel criterio di sicurezza POLICY_2 in PRIORITY per aggiungere una configurazione di esclusione per le firme owasp-crs-v030301-id941140-xss e owasp-crs-v030301-id941270-xss nella regola WAF xss-v33-stable, in modo da escludere dall'ispezione le intestazioni delle richieste che iniziano con abc o terminano con xyz:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_2 \
    --target-rule-set "xss-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id941140-xss" "owasp-crs-v030301-id941270-xss" \
    --request-header-to-exclude "op=STARTS_WITH,val=abc" \
    --request-header-to-exclude "op=ENDS_WITH,val=xyz"

Il terzo esempio aggiorna la regola nel criterio di sicurezza POLICY_3 in PRIORITY per rimuovere tutte le esclusioni dei campi di richiesta per gli ID regola owasp-crs-v030301-id942110-sqli e owasp-crs-v030301-id942120-sqli in sqli-v33-stable.

gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_3 \
    --target-rule-set "sqli-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"

Applica l'analisi per i valori di intestazione Content-Type personalizzati

Quando Google Cloud Armor valuta il corpo POST in base alle regole WAF preconfigurate, l'intestazione Content-Type indica il formato dei dati nel corpo della richiesta. Per impostazione predefinita, Google Cloud Armor considera i contenuti del corpo POST come un'unica stringa, tutte idonee per l'ispezione e la corrispondenza in base alle regole WAF preconfigurate. Tuttavia, puoi configurare un'analisi più precisa se le richieste in arrivo hanno una codifica diversa. Google Cloud Armor supporta i seguenti tipi di codifica:

  • JSON
  • GraphQL

Per configurare l'elenco di valori di intestazione Content-Type personalizzati a cui viene applicata l'analisi alternativa, utilizza l'esempio seguente. L'esempio aggiorna il criterio di sicurezza POLICY_NAME per abilitare l'analisi JSON e specifica i tipi di contenuti application/json, application/vnd.api+json, application/vnd.collection+json e application/vnd.hyper+json:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD \
    --json-custom-content-types "application/json,application/vnd.api+json,application/vnd.collection+json,application/vnd.hyper+json"

In alternativa, se i tuoi criteri di sicurezza proteggono un'applicazione che utilizza GraphQL o riceve contenuti codificati in GraphQL, puoi utilizzare l'argomento STANDARD_WITH_GRAPHQL per analizzare i contenuti del corpo del POST come contenuto GraphQL, come nell'esempio seguente:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD_WITH_GRAPHQL

L'ispezione del corpo del POST è limitata ai primi 8 kB. Per ulteriori informazioni, consulta Limitazioni dei criteri di sicurezza.

  • Se i contenuti JSON superano gli 8 kB, Google Cloud Armor applica l'analisi JSON ai primi 8 kB di contenuti utilizzati, che viene controllato da eventuali regole WAF preconfigurate.

  • Se l'analizzatore sintattico JSON non restituisce alcun risultato, è possibile che venga eseguito un tentativo di analisi dell'URI. Se il parser URI non restituisce parametri nome-valore o solo parametri nome-valore parziali, l'intera stringa o parziale potrebbe essere trattata come nome del parametro per l'ispezione.

Passaggi successivi