Utilizzo di campi, funzioni ed espressioni
Le regole firewall sono deprecate. CIS Ho spostato le regole del firewall esistenti nelle regole personalizzate del 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 quelle ricavate 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 | |
| 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 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 del client TCP, che può essere modificato per riflettere l'indirizzo IP effettivo del client originale, se del caso (ad esempio, utilizzando le 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 | 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 | 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 indicare la presenza di spammer o bot, mentre quelli superiori a 40 indicano la presenza di soggetti malintenzionati su Internet. È raro che i valori superino 60, quindi imposta le regole del firewall in modo da richiedere l'autenticazione per i valori superiori a 10 e da bloccare quelli superiori a 50. |
| 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 più bassi indicano un rischio maggiore. Utile per creare regole firewall basate su soglie. |
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 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 sezione successiva vengono illustrati 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 | 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 una combinazione di operatori inglesi e simili a quelli del linguaggio 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 | 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 ~ " [^/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 che utilizzano valori di tipo stringa tiene conto delle maiuscole e delle minuscole. Pertanto, una regola del firewall potrebbe richiedere di definire 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
È possibile creare espressioni composte raggruppando due o più espressioni singole tramite gli operatori logici.
| Inglese | Simile a C | Descrizione | Esempio | Precedenza |
|---|---|---|---|---|
| not | ! | NOT logico | non ( 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)
Sebbene l'operatore " not " sia utilizzato per il raggruppamento, può essere impiegato anche 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 del firewall sono ispirate ai filtri di visualizzazione Wireshark. Tuttavia, l'implementazione si discosta nei seguenti modi:
- Per i test di uguaglianza degli indirizzi IP CIDR, Wireshark consente di specificare intervalli nel formato
ip.src == 1.2.3.0/24, mentre CIS supporta i 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 del protocollo che contiene centinaia di altri campi di vario tipo, disponibili per il confronto in diversi modi. Tuttavia, nelle regole del firewall, l’opzione “ssl” è un singolo campo booleano utilizzato per determinare se la connessione dal client a CIS sia crittografata. - L'operatore
slicenon è supportato. - Non tutte le funzioni sono supportate. Attualmente,
len()ecount()non sono supportati.