Utilizzo di campi, funzioni ed espressioni
Insieme alle azioni, i campi e le espressioni costituiscono gli elementi fondamentali delle regole personalizzate del WAF. Questi elementi lavorano insieme per definire i criteri di corrispondenza di una regola personalizzata.
Campi
Quando CIS riceve una richiesta di HTTP, la analizza e crea una tabella di campi da abbinare. Questa tabella di campi esiste solo durante l'elaborazione della richiesta e contiene le proprietà della richiesta utilizzate per la corrispondenza delle espressioni.
Ciascun valore di campo può avere origine da diverse fonti, ad esempio:
- Proprietà primitive, ottenute direttamente dal traffico – ad esempio,
http.request.uri.path. - Valori derivati, risultanti da una trasformazione, una composizione o un’operazione di base – ad esempio, convertire il valore di
http.request.uri.pathin minuscolo e renderlo disponibile come campo di un altro campo. - Valori di computer, risultanti da una ricerca, un calcolo o altre intelligence – ad esempio, un
cf.threat_scorecalcolato dinamicamente da un processo di machine learning che analizza la primitiva correlata e i valori derivati.
Campi disponibili
| Nome campo | Immettere | Valore di esempio | Note |
|---|---|---|---|
| http.cookie | Stringa | session=A12345;-background=light | Cookie completo come una stringa |
| http.host | Stringa | www.example.com |
Il nome host utilizzato nell’URI completo della richiesta |
| http.referer | Stringa | HTTP header referer | L'intestazione HTTPrequest Referer, che contiene l'indirizzo della pagina web che rimanda alla pagina attualmente richiesta. |
| http.request.body.raw | Stringa | Il corpo della HTTP richiesta inalterato. | |
| http.request.full_uri | Stringa | https://www.example.com/articles/index?section=539061&expand=comments |
L'URI completo così come ricevuto dal server web (non include il #fragment, che non viene inviato ai server web) |
| http.request.method | Stringa | POST | Il metodo HTTP, in maiuscolo |
| http.request.uri | Stringa | /articles/index?section=539061&expand=comments | L'URI assoluto della richiesta |
| http.request.uri.path | Stringa | /articles/index | Il percorso della richiesta |
| http.request.uri.query | Stringa | section=539061&expand=comments | L'intera stringa di query, meno il prefisso di delimitazione "?" |
| http.user_agent | Stringa | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, come Gecko) Chrome/65.0.3325.181 Safari/537.36 | L'intero agent utente HTTP |
| http.x_forwarded_for | Stringa | L'intestazione completa "X-Forwarded-For" HTTP | |
| ip.src | Indirizzo IP | 93.155.208.22 | L'indirizzo IP del client TCP, che può essere modificato per riflettere l'indirizzo IP effettivo del client originale, a seconda dei casi (ad esempio, utilizzando le intestazioni HTTP come X-Forwarded-For o X-Real-IP) |
| ip.src.region | Stringa | Texas | L'area di geolocalizzazione associata all'indirizzo IP della richiesta in arrivo. |
| ip.geoip.asnum | Numero | 222 | Il numero Autonomous System (AS) |
| ip.geoip.country | Stringa | GB | Il codice del paese a 2 lettere |
| ssl | Booleano | true | Se la connessione HTTP al client è codificata |
| ip.src.subdivision_1_iso_code | Stringa | GB-ENG | Il codice ISO 3166-2 codice della regione di primo livello associata all'indirizzo IP. Quando il valore effettivo non è disponibile,
questo campo contiene una stringa vuota. Per utilizzare questo campo, è necessario un piano CIS Enterprise. |
| ip.src.subdivision_2_iso_code | Stringa | GB-SWK | Il ISO 3166-2 codice della regione di secondo livello associata all'indirizzo IP. Quando il valore effettivo non è disponibile, questo
campo contiene una stringa vuota. Per utilizzare questo campo, è necessario un piano CIS Enterprise. |
| ip.src.is_in_european_union | Booleano | Per ulteriori informazioni, vedere ip.src.is_in_european_union. |
Questi campi standard seguono la convenzione di denominazione del riferimento del campo di visualizzazione Wireshark. Tuttavia, potrebbero esistere alcune sottili variazioni nei valori dell'esempio precedente.
Oltre ai campi standard, sono disponibili anche i seguenti campi definiti da Cloudflare:
| Nome campo | Immettere | Valore di esempio | Note |
|---|---|---|---|
| cf.client.bot | Booleano | true | se la richiesta provenga da un bot o da un crawler noto, indipendentemente dal fatto che l'intento sia buono o cattivo. |
| cf.threat_score | Numero | 0 | Questo campo indica il punteggio di minaccia di Cloudflare. In precedenza, un punteggio di minaccia rappresentava un punteggio di minaccia Cloudflare da 0 a 100, dove 0 indicava un rischio basso. Ora, il punteggio della minaccia è sempre 0 (zero). |
| cf.waf.score | Numero | 1-99 | Punteggio basato sull'apprendimento automatico che stima la probabilità che una richiesta sia dannosa. I punteggi vanno da 1 (molto probabilmente dannoso) a 99 (molto probabilmente sicuro). Punteggi bassi indicano un rischio maggiore. Utile per creare regole firewall basate su soglie. |
| cf.ray_id | Stringa | È un identificatore che viene assegnato a ogni richiesta che passa attraverso Cloudflare. | |
| cf.edge.server_ip | Indirizzo IP | Questo campo indica l'indirizzo IP della rete globale a cui si è risolta la richiesta HTTP. Questo campo è significativo solo per i clienti BYOIP. | |
| cf.edge.server_port | Indirizzo IP | 1-65535 | Questo campo indica il numero di porta a cui la rete globale di Cloudflare ha ricevuto la richiesta. Utilizzare questo campo per filtrare il traffico su una porta specifica. |
| cf.tls_cipher | Stringa | AES128-SHA256 | Il cifrario per la connessione a Cloudflare. |
| cf.tls_version | Stringa | TLSv1.2 | La versione TLS della connessione a Cloudflare. |
ip.src.is_in_european_union
La richiesta proviene da un Paese dell'Unione Europea (UE) e richiede un piano CIS Enterprise.
La tabella seguente elenca i Paesi dell'UE in base ai dati di geolocalizzazione:
| Codice paese | Nome paese |
|---|---|
AT |
Austria |
AX |
Isole Åland |
BE |
Belgio |
BG |
Bulgaria |
CY |
Cipro |
CZ |
Cechia |
GE |
Germania |
DK |
Danimarca |
EE |
Estonia |
ES |
Spagna |
FI |
Finlandia |
FR |
Francia |
GF |
Guiana francese |
GP |
Guadalupa |
GR |
Grecia |
HR |
Croazia |
HU |
Ungheria |
IE |
Irlanda |
IT |
Italia |
LT |
Lituania |
LU |
Lussemburgo |
LV |
Lettonia |
MF |
Saint Martin |
MQ |
Martinica |
MT |
Malta |
NL |
Paesi Bassi |
PL |
Polonia |
PT |
Portogallo |
RE |
Reunion |
RO |
Romania |
SE |
Svezia |
SI |
Slovenia |
SK |
Slovacchia |
YT |
Mayotte |
Campi di gestione dei bot
Bot Management for Enterprise è un componente aggiuntivo a pagamento che fornisce una sofisticata protezione dai bot per il vostro dominio. I clienti possono identificare il traffico automatizzato, intraprendere azioni appropriate e visualizzare analisi dettagliate all'interno della console.
La tabella seguente fornisce informazioni sui campi bot disponibili:
| Nome campo | Immettere | Note |
|---|---|---|
cf.client.bot |
Booleano | Questo campo indica se la richiesta proviene da un bot o da un crawler noto, a prescindere dall'intento buono o cattivo. |
cf.bot_management.verified_bot |
Booleano | Indica se la richiesta proviene da un bot o crawler noto e fornisce le stesse informazioni di cf.client.bot. Questo campo è disponibile con il piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.corporate_proxy |
Booleano | Questo campo indica se la richiesta in arrivo proviene da un proxy aziendale identificato basato sul cloud o da un gateway web sicuro. Questo campo è disponibile con il piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.detection_ids |
Numero | Questo campo elenca gli ID dei rilevamenti euristici di Bot Management su una richiesta. Utilizzare questo campo per abbinare o escludere specifiche euristiche in una regola. Una richiesta può avere più rilevamenti. |
cf.bot_management.ja3_hash |
Stringa | Questo campo fornisce un'impronta digitale SSL / TLS che aiuta a identificare potenziali richieste di bot. Per ulteriori informazioni, vedere JA3/JA4 Fingerprint. Per utilizzare questo campo, è necessario un piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.ja4 |
Stringa | Questo campo fornisce un'impronta digitale SSL / TLS che aiuta a identificare potenziali richieste di bot. Per ulteriori informazioni, vedere JA3/JA4 Fingerprint. Per utilizzare questo campo, è necessario un piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.js_detection.passed |
Booleano | Indica se il visitatore ha superato un JS Detection in precedenza. Per ulteriori informazioni, consultare la sezione JavaScript. Per utilizzare questo campo, è necessario un piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.score |
Numero | Questo campo rappresenta la probabilità che una richiesta provenga da un bot utilizzando un punteggio da 1-99. Un punteggio basso indica che la richiesta proviene da un bot o da un agente automatico. Un punteggio elevato indica che la richiesta è stata fatta da un umano. Per utilizzare questo campo, è necessario un piano CIS Enterprise con gestione Bot abilitata. |
cf.bot_management.static_resource |
Numero | Indica se le risorse statiche devono essere incluse quando si crea una regola utilizzando cf.bot_management.score. Per utilizzare questo campo, è necessario un piano CIS Enterprise con gestione Bot abilitata. |
cf.verified_bot_category |
Stringa | Questo campo fornisce il tipo e lo scopo di un bot verificato. Per ulteriori informazioni, vedere Categorie di bot verificate. |
Funzioni
Il linguaggio delle regole personalizzate dispone di diverse funzioni per la conversione dei campi.
Al momento queste funzionalità non sono supportate nell’Expression Builder.
| Nome funzione | Tipi di argomento | Tipo di ritorno | Esempio di utilizzo | Note |
|---|---|---|---|---|
| lower | Stringa | Stringa | lower(http.host) == "www.example.com" |
Converte un campo stringa in caratteri minuscoli. Vengono convertiti solo i byte ASCII maiuscoli, gli altri byte restano invariati. |
| upper | Stringa | Stringa | upper(http.host) == "www.example.com" |
Converte un campo stringa in caratteri maiuscoli. Vengono convertiti solo i byte ASCII minuscoli, gli altri byte restano invariati. |
Espressioni
Un'espressione restituisce true o false in base a una corrispondenza con il traffico in entrata. Ad esempio:
http.host eq "www.example.com" and ip.src in 92.182.212.0/24
In questo esempio, due espressioni semplici formano un’espressione composta. Pensa ad ogni singola espressione come a una condizione. Ciascuna condizione viene valutata singolarmente prima di applicare la logica and per determinare il risultato finale dell'espressione composta.
Osservando la prima espressione singola, si può notare che contiene:
- un campo -
http.host - un operatore di confronto -
eq - un valore -
"www.example.com"
Non tutte le condizioni hanno la stessa struttura. Nella prossima sezione vengono trattati altri esempi che utilizzano strutture diverse.
Operatori di confronto
Sono disponibili per essere utilizzati nelle espressioni i seguenti operatori di confronto:
| Inglese | Simile a C | Descrizione |
|---|---|---|
| eq | == | Uguale a |
| ne | != | Diverso da |
| lt | < | Minore di |
| le | <= | Minore o uguale a |
| GT | Maggiore di | |
| ge |
|
Maggiore o uguale a |
| contains | Contiene esattamente | |
| corrisponde | ~ | Espressione regolare ispirata a Re2 |
| in | Il valore compare in una serie di valori. Supporta gli intervalli utilizzando la notazione "..". | |
| not | ! | Vedi Confronto booleano |
| bitwise_and | & | Valore del campo bit di confronto |
Attualmente l'Expression Builder supporta solo gli operatori inglesi.
Un'espressione può contenere una combinazione di operatori inglesi e di tipo C. Ad esempio, ip.src eq 93.184.216.34 equivale a ip.src == 93.184.216.34.
Determinati operatori di confronto si applicano a campi specifici in base al tipo. La seguente matrice fornisce gli esempi di quali operatori sono disponibili per i diversi tipi di campo:
| Inglese | Simile a C | Stringa | Indirizzo IP | Numero |
|---|---|---|---|---|
| eq | == | http.request.uri.path eq "/articles/2008/" | ip.src eq 93.184.216.0 | cf.threat_score eq 10 |
| ne | != | http.request.uri.path ne "/articles/2010/" | ip.src ne 93.184.216.0 | cf.threat_score ne 60 |
| lt | < | http.request.uri.path lt "/articles/2009/" | cf.threat_score lt 10 | |
| le | <= | http.request.uri.path le "/articles/2008/" | cf.threat_score le 20 | |
| GT | http.request.uri.path gt "/articles/2006/" | cf.threat_score gt 25 | ||
| ge |
|
Maggiore o uguale a | cf.threat_score ge 60 | |
| contains | http.request.uri.path contains "/articles/" | |||
| corrisponde | ~ | http.request.uri.path ~ " [^/articles/2007-8/$] " | ||
| in | http.request.method in { "HEAD" "GET" } | ip.src in { 93.184.216.0 93.184.216.1 } | cf.threat_score in {0 2 10} |
La valutazione delle espressioni utilizzando i valori stringa è sensibile al minuscolo/maiuscolo. Pertanto, una regola personalizzata potrebbe richiedere la definizione di più di una condizione di verifica. I clienti Enterprise possono utilizzare un'espressione regolare con l'operatore matches per acquisire più variazioni con una singola espressione.
Confronto booleano
Per i campi di tipo booleano (ad esempio, ssl), il campo compare da solo nell'espressione quando viene valutata una condizione true. Per una condizione false, viene applicato l'operatore not.
| Vero | False |
|---|---|
| ssl | not ssl |
Espressioni composte
Puoi creare le espressioni composte raggruppando due o più singole espressioni utilizzando gli operatori logici.
| Inglese | Simile a C | Descrizione | Esempio | Precedenza |
|---|---|---|---|---|
| not | ! | NOT logico | not ( http.host eq "www.example.com" and ip.src in 93.184.216.0/24 ) |
1 |
| e | && | AND logico | http.host eq "www.example.com" and ip.src in 93.184.216.0/24 |
2 |
| xor | ^^ | XOR logico | http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 |
3 |
| oppure | OR logico |
Per modificare l'ordine di precedenza, puoi raggruppare le espressioni con le parentesi. Senza utilizzare le parentesi, le espressioni vengono raggruppate implicitamente in base alla precedenza standard:
ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth
Applicazione del raggruppamento esplicito:
(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth
Dare la precedenza o utilizzare le parentesi:
ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)
Tieni presente che mentre not viene utilizzato per il raggruppamento, può essere utilizzato per negare un singolo confronto. Ad esempio, not ip.src eq 93.184.216.0 equivale a not (ip.src eq 93.184.216.0).
Infine, puoi anche negare le espressioni raggruppate:
not (http.request.method eq "POST" and http.request.uri.path eq "/login")
Deviazioni dai filtri di visualizzazione Wireshark
Le espressioni delle regole personalizzate si ispirano ai filtri di visualizzazione di Wireshark. Tuttavia, l'implementazione si discosta nei seguenti modi:
- Per i test di uguaglianza IP CIDR, Wireshark consente intervalli nel formato
ip.src == 1.2.3.0/24, mentre CIS supporta solo i test di uguaglianza che utilizzano un singolo indirizzo IP. Per confrontare un CIDR, utilizza l'operatorein; ad esempio,ip.src in {1.2.3.0/24}. - In Wireshark,
sslè un campo del protocollo contenente centinaia di altri campi di diversi tipi disponibili per il confronto in più modi. Tuttavia, nelle regole personalizzate, “ssl” è un singolo campo booleano utilizzato per determinare se la connessione dal client a CIS è crittografata. - L'operatore
slicenon è supportato. - Non tutte le funzioni sono supportate.
len(), ecount()non sono attualmente supportati.
Limiti di espressione
Alle espressioni delle regole si applicano le seguenti limitazioni:
-
Un'espressione di regola può contenere fino a 4.096 caratteri.
Se si utilizza l'Expression Builder nell'interfaccia utente, lo stesso limite si applica all'anteprima dell'espressione generata.
-
Un'espressione di regola può contenere al massimo 64 espressioni regolari (regex).