Utilizzo di campi, funzioni ed espressioni
Le regole firewall sono deprecate. CIS spostato le regole firewall esistenti alle regole personalizzate WAF. Per ulteriori informazioni su questa modifica, vedere Migrazione a regole personalizzate.
Insieme alle azioni, i campi e le espressioni sono gli elementi costitutivi delle regole del firewall. Questi due elementi operano insieme quando definisci i criteri da utilizzare quando viene soddisfatta una regola del firewall.
Campi
Quando CIS riceve una richiesta HTTP, viene esaminata e viene generata una tabella di campi con cui deve essere messa in corrispondenza. Questa tabella di campo esiste mentre viene elaborata la richiesta corrente. Considerala come una tabella che contiene le proprietà della richiesta che devono essere messe in corrispondenza con le espressioni.
Ciascun valore di campo può avere origine da diverse fonti, ad esempio:
- Le proprietà primitive sono 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, rendendo il valore di
http.request.uri.path
tutto minuscolo e disponibile come campo di un altro campo. - Valori di computer, risultanti da una ricerca, un calcolo o altre intelligence – ad esempio, un
cf.threat_score
calcolato 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 dell'host utilizzato nell'URI completo della richiesta |
http.referer | Stringa | HTTP header referer | |
http.request.full_uri | Stringa | https://www.example.com/articles/index?section=539061&expand=comments |
L'URI completo ricevuto dal server web (non include #fragment, che non viene inviato ai server web) |
http.request.method | Stringa | POST | Il metodo dell' 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 TCP del client, che può essere adattato per riflettere l'IP reale del client originale (ad esempio, utilizzando intestazioni HTTP come X-Forwarded-For o X-Real-IP) |
ip.geoip.asnum | Numero | 222 | Il numero Autonomous System (AS) |
ip.geoip.country | Stringa | GB | Il codice paese di 2 lettere |
ssl | Booleano | vero, true | Se la connessione HTTP al client è codificata |
Questi campi standard seguono la convenzione di denominazione del riferimento del campo di visualizzazione Wireshark. Tuttavia, potrebbero esistere alcune sottili variazioni nei valori di esempio precedenti.
Oltre ai campi standard, sono disponibili anche i seguenti campi definiti da Cloudflare:
Nome campo | Immettere | Valore di esempio | Note |
---|---|---|---|
cf.client.bot | Booleano | vero, true | Questo campo indica se la richiesta proviene da un bot o da un crawler noto, a prescindere dall'intento buono o cattivo. |
cf.threat_score | Numero | Un valore da 0 a 100 | Questo campo rappresenta un punteggio di rischio, 0 indica un rischio basso come stabilito da Cloudflare. I valori superiori a 10 possono rappresentare spammer o bot, mentre quelli superiori a 40 indicano la presenza di cattivi attori su Internet. È raro vedere valori superiori a 60, per cui è opportuno regolare le regole del firewall in modo da sfidare quelli superiori a 10 e bloccare quelli superiori a 50. |
Funzioni
Il linguaggio delle regole del firewall dispone di diverse funzioni per la conversione dei campi.
Queste funzioni non sono attualmente supportate da 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. Ogni altro byte viene lasciato così com'è. |
upper | Stringa | Stringa | upper(http.host) == "www.example.com" |
Converte un campo stringa in caratteri maiuscoli. Vengono convertiti solo i byte ASCII minuscoli. Ogni altro byte viene lasciato così com'è. |
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 singole costituiscono 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. Altri esempi che utilizzano strutture diverse sono discussi nella sezione successiva.
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 | traduzione: "Non è vero che non c'è niente da fare. | Maggiore o uguale a |
contains | Contiene esattamente | |
corrisponde | ~ | Espressione regolare ispirata a Re2 |
in | Il valore compare in una serie di valori. Supporta intervalli che utilizzano la notazione "..". | |
not | ! | Vedi Confronto booleano |
bitwise_and | & | Valore del campo bit di confronto |
Attualmente l'Expression Builder supporta solo operatori inglesi.
Un'espressione può contenere un mix di operatori inglesi e C-like. 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 | traduzione: "Non è vero che non c'è niente da fare. | Maggiore o uguale a | cf.threat_score ge 60 | |
contains | http.request.uri.path contains "/articles/" | |||
corrisponde | ~ | http.request.uri.path ~ " [^/articoli/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 che utilizzano valori stringa è sensibile alle maiuscole e alle minuscole. Per questo motivo, una regola del firewall potrebbe richiedere la definizione di più di una condizione di test. 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
È possibile creare espressioni composte raggruppando due o più espressioni singole utilizzando gli operatori logici.
Inglese | Simile a C | Descrizione | Esempio | Precedenza |
---|---|---|---|---|
not | ! | NOT logico | not ( http.host eq "www.example.com" e 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 | http.host eq "www.example.com" or ip.src in 93.184.216.0/24 |
4 |
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)
Mentre not
viene utilizzato per raggruppare, può essere usato per annullare 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 del firewall sono ispirate ai filtri di visualizzazione 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 test di uguaglianza che utilizzano solo 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 di protocollo che contiene centinaia di altri campi di vario tipo, disponibili per il confronto in più modi. Tuttavia, nelle regole del firewall,ssl
è un singolo campo booleano utilizzato per determinare se la connessione dal client a CIS è crittografata. - L'operatore
slice
non è supportato. - Non tutte le funzioni sono supportate. Attualmente,
len()
ecount()
non sono supportati.