Lavorare con le regole personalizzate del WAF
Le regole personalizzate del WAF offrono potenza e flessibilità, consentendo di individuare il traffico proveniente dall' HTTP e e di applicare criteri personalizzati per bloccare, sottoporre a verifica, registrare o autorizzare determinate richieste.
È possibile creare diversi tipi di regole personalizzate per il WAF. Tuttavia, il numero di regole attive sul tuo sito è limitato dal tuo piano cliente. Per maggiori informazioni sui diritti, consultare il sito CIS.
Il numero di regole attive per piano è fisso. Al momento non è possibile acquistare altre regole attive.
Prima di iniziare, è una buona idea rivedere l'uso di campi, funzioni ed espressioni.
È possibile creare, aggiornare ed eliminare una regola personalizzata utilizzando la console, la CLI, l'API o Terraform.
Creare una regola personalizzata nella console
Procedere come segue per creare una regola personalizzata nella console:
Le regole personalizzate del WAF vengono configurate utilizzando la pagina delle regole del firewall esistenti. Tutte le regole firewall legacy create in precedenza sul dominio vengono convertite automaticamente in regole personalizzate WAF.
-
Nella console CIS, passare alla voce Sicurezza.
-
Selezionare la scheda Regole personalizzate e fare clic su Crea.
-
Inserire una descrizione opzionale.
-
Facoltativamente, immetti una priorità, se necessario. Una priorità pari a zero è una priorità nulla e viene valutata per ultima.
-
Utilizza il builder della IU nella sezione Incoming requests per aggiungere una condizione. Per creare un'espressione con più condizioni, fai clic su:
- E- per valutare le condizioni che utilizzano e la logica
- Oppure- per valutare condizioni o gruppi di condizioni precedentemente unite con "and" che utilizzano la logica "or"
Puoi vedere che mentre crei una condizione, l'anteprima dell'espressione mostra l'espressione in testo semplice.
Nell'anteprima dell'espressione, puoi fare clic per modificare manualmente la tua espressione invece di utilizzare Visual Expression Builder oppure passare dall'uno all'altra. Tuttavia, a seconda della complessità di un'espressione creata manualmente, il Visual Expression Builder potrebbe non essere in grado di visualizzarla.
-
Scegli un'azione dal menu di elenco Response.
-
Per salvare la tua regola, scegli l'opzione più appropriata facendo clic su:
- Salva come bozza per salvare la regola, ma mantienila disattivata.
- Salva e distribuisci per salvare la regola e attivarla.
Aggiornamento di una regola personalizzata nella console
Procedere come segue per aggiornare una regola personalizzata esistente nella console:
- Nella console CIS, passare alla voce Sicurezza.
- Seleziona la scheda " Regole personalizzate ".
- Nella tabella "Regole personalizzate", individuare la regola che si desidera modificare, quindi fare clic sul menu "Azioni" a destra della riga.
- Seleziona Edit.
- Apporta le modifiche alla regola.
- Per salvare la tua regola, scegli l'opzione più appropriata facendo clic su:
- Salva come bozza per salvare la regola, ma mantienila disattivata.
- Salva e distribuisci per salvare la regola e attivarla.
Per disattivare o attivare una regola qualsiasi nell'elenco delle regole esistenti, fare clic sul pulsante di attivazione/disattivazione "Abilitato".
Eliminazione di una regola personalizzata nella console
Procedere come segue per eliminare una regola personalizzata esistente nella console:
- Nella console CIS, passare alla voce Sicurezza.
- Nella tabella "Regole personalizzate", individuare la regola da eliminare e fare clic sul menu "Azioni" a destra della riga.
- Selezionare Elimina dal menu delle azioni.
- Fare clic su Elimina regola personalizzata WAF per eliminare la regola.
Creazione di una regola personalizzata dalla CLI
Per creare una regola personalizzata dalla CLI, procedere come segue:
-
Accedi al tuo account dalla CLI. Dopo aver inserito la password, il sistema richiede l'account e la regione che si desidera utilizzare:
ibmcloud login --sso -
Esegui il seguente comando per creare una regola personalizzata:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]È possibile creare una regola personalizzata anche fornendo direttamente un file JSON o una stringa JSON:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opzioni comando
DNS_DOMAIN_ID-
L'ID del dominio DNS.
--match-
Specifica le condizioni che devono essere soddisfatte per eseguire la regola. Per il valore della corrispondenza, vedere Uso di campi, funzioni ed espressioni.
--action-
L'azione regola da eseguire. Valori validi: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". Per le azioni "block" e "skip", utilizzare invece un file JSON o una stringa JSON.
--enabled-
Indica che la regola è attiva. L'impostazione predefinita è "false".
--description-
Una breve descrizione della regola.
--json-
Il file JSON o la stringa JSON utilizzati per descrivere una regola personalizzata.
-
I campi obbligatori nei dati JSON sono
expressioneaction.expression: Specifica le condizioni che devono essere soddisfatte affinché la regola venga applicata.action: L'azione da eseguire. I valori validi sonoblock,challenge,js_challenge,managed_challenge,logeskip.
-
I campi opzionali sono
description,enabled,loggingeaction_parameters.action_parameters: I parametri dell'azione della regola.rulesetsalta tutte le regole rimanenti o uno o più set di regole gestiti dal WAF. Il valore valido ècurrent.phases: Ignora i componenti WAF per le richieste corrispondenti. I valori validi sonohttp_ratelimit,http_request_firewall_managedehttp_request_sbfm.productssalta i prodotti di sicurezza specifici per le richieste di corrispondenza. I valori validi sonowaf,rateLimit,securityLevel,hot,bic,uaBlockezoneLockdown.response: Definire una risposta personalizzata per l'azione "block".status_code: Scegliere un codice di stato " HTTP " per la risposta compreso nell'intervallo400-499.content_typeil tipo di contenuto di una risposta personalizzata. I tipi di risposta validi sono:text/html,text/plain,application/json,text/xml.content: Il corpo della risposta.
descriptiondescrive brevemente la regola.enabled: Indica se la regola è attiva o meno. Quando questo campo è disattivato, le richieste abbinate non appaiono nelle richieste del firewall.logging: Registra le richieste che corrispondono alla regola di esclusione. Questo campo è disponibile solo per l'azione 'skip'.
-
Dati JSON di esempio:
{
"description": "test-custom-rule",
"expression": "(http.cookie contains \"test\")",
"action": "skip",
"logging": {
"enabled": true
},
"action_parameters": {
"ruleset": "current",
"phases": [
"http_ratelimit",
"http_request_firewall_managed",
"http_request_sbfm"
],
"products": [
"waf",
"rateLimit",
"securityLevel",
"hot",
"bic",
"uaBlock",
"zoneLockdown"
]
},
"enabled": true
}
-i, --instance- Il nome o l'ID dell'istanza. Se non viene impostato, viene utilizzata l'istanza di contesto specificata da
ibmcloud cis instance-set INSTANCE. --output- Specificare il formato di output; è supportato solo il formato "
JSON".
Aggiornamento di una regola personalizzata dalla CLI
Esegui il seguente comando per aggiornare una regola personalizzata dalla CLI:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
È possibile aggiornare una regola personalizzata anche fornendo direttamente un file JSON o una stringa JSON:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opzioni comando
DNS_DOMAIN_ID-
L'ID del dominio DNS.
RULE_ID-
L'ID della regola.
--match-
Specifica le condizioni che devono essere soddisfatte per eseguire la regola. Per il valore della corrispondenza, vedere Uso di campi, funzioni ed espressioni.
--action-
L'azione regola da eseguire. Valori validi: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".Per le azioni "block" e "skip", utilizzare invece un file JSON o una stringa JSON.
--enabled-
Indica che la regola è attiva. Il valore predefinito è "false".
--description-
Una breve descrizione della regola.
--json-
Il file JSON o la stringa JSON utilizzati per descrivere una regola personalizzata.
-
I campi obbligatori nei dati JSON sono
expressioneaction.expression: Specifica le condizioni che devono essere soddisfatte affinché la regola venga applicata.action: L'azione da eseguire. I valori validi sonoblock,challenge,js_challenge,managed_challenge,logeskip.
-
I campi opzionali sono
description,enabled,loggingeaction_parameters.action_parameters: I parametri dell'azione della regola.rulesetsalta tutte le regole rimanenti o uno o più set di regole gestiti dal WAF. Il valore valido ècurrentphases: Ignora i componenti WAF per le richieste corrispondenti. I valori validi sonohttp_ratelimit,http_request_firewall_managedehttp_request_sbfm.productssalta i prodotti di sicurezza specifici per le richieste di corrispondenza. I valori validi sonowaf,rateLimit,securityLevel,hot,bic,uaBlockezoneLockdown.response: Definire una risposta personalizzata per l'azione "block".status_code: Scegliere un codice di stato " HTTP " per la risposta compreso nell'intervallo400-499.content_typeil tipo di contenuto di una risposta personalizzata. I tipi di risposta validi sonotext/html,text/plain,application/jsonetext/xml.content: Il corpo della risposta.
descriptiondescrive brevemente la regola.enabled: Indica se la regola è attiva o meno. Quando questo campo è disattivato, le richieste abbinate non appaiono nelle richieste del firewall.logging: Registra le richieste che corrispondono alla regola di esclusione. Questo campo è disponibile solo per l'azione 'skip'.
-
Dati JSON di esempio:
{
"description": "test-custom-rule",
"expression": "(http.cookie contains \"test\")",
"action": "block",
"action_parameters": {
"response": {
"status_code": 429,
"content_type": "text/xml",
"content": "reject"
}
},
"enabled": true
}
-i, --instance- Il nome o l'ID dell'istanza. Se non viene impostato, viene utilizzata l'istanza di contesto specificata da
ibmcloud cis instance-set INSTANCE. --output- Specificare il formato di output; è supportato solo il formato "
JSON".
Eliminazione di una regola personalizzata dalla CLI
Esegui il seguente comando per eliminare una regola personalizzata dalla CLI:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Opzioni comando
DNS_DOMAIN_ID- L'ID del dominio DNS.
RULE_ID- L'ID della regola personalizzata.
-i, --instance- Il nome o l'ID dell'istanza. Se non viene impostato, viene utilizzata l'istanza di contesto specificata da
ibmcloud cis instance-set INSTANCE. -f, --force- Tentativo di eliminare una regola personalizzata senza richiedere conferma.
--output- Specificare il formato di output; è supportato solo il formato "
JSON".
Esempi di comando
- Per creare una regola personalizzata:
ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"
- Per aggiornare una regola personalizzata:
ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true
- Per eliminare una regola personalizzata:
ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27
Ottenere il punto di ingresso della regola personalizzata per l'API
Tutte le operazioni dell'API delle regole personalizzate richiedono un RULESET_ID del set di regole del punto di ingresso per la fase delle regole personalizzate.
Seguire questi passaggi per ottenere il set di regole del punto di ingresso delle regole personalizzate:
- Impostare l'ambiente API con le variabili corrette.
- Memorizzare i seguenti valori in variabili da utilizzare nel comando API:
CRN: Il nome completo della risorsa cloud (CRN) codificato da URL dell'istanza del servizio.
ZONE_ID: L'ID del dominio.
-
Quando tutte le variabili sono inizializzate, si ottiene il set di regole del punto di ingresso:
curl -X GET "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json"L'ID del ruleset si trova nella risposta della richiesta andata a buon fine. Se la chiamata precedente restituisce una risposta 404 Not Found, utilizzare la seguente API per creare il set di regole del punto di ingresso per la fase delle regole personalizzate:
curl -X POST https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "name": "Zone-level phase entry point", "kind": "zone", "description": "Custom rule entry point ruleset.", "phase": "http_request_firewall_custom" }'
Creare una regola personalizzata con l'API
Seguire la seguente procedura per creare una regola personalizzata con l'API:
- Impostare l'ambiente API con le variabili corrette.
- Memorizzare i seguenti valori in variabili da utilizzare nel comando API:
CRN: Il nome completo della risorsa cloud (CRN) codificato da URL dell'istanza del servizio.
ZONE_ID: L'ID del dominio.
RULESET_ID: L'ID del set di regole del punto di ingresso della regola personalizzata.
-
Quando tutte le variabili sono state inizializzate, creare la regola personalizzata:
curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "description": "My custom rule with plain text response", "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") and cf.waf.score lt 20", "action": "block", "action_parameters": { "response": { "status_code": 403, "content": "Your request was blocked.", "content_type": "text/plain" } } }'
Aggiornamento di una regola personalizzata con l'API
Seguire questi passaggi per aggiornare una regola personalizzata esistente con l'API:
- Impostare l'ambiente API con le variabili corrette.
- Memorizzare i seguenti valori in variabili da utilizzare nel comando API:
CRN: Il nome completo della risorsa cloud (CRN) codificato da URL dell'istanza del servizio.
ZONE_ID: L'ID del dominio.
RULESET_ID: L'ID del set di regole del punto di ingresso della regola personalizzata.
RULE_ID: L'ID della regola personalizzata da modificare.
-
Quando tutte le variabili sono inizializzate, aggiornare la regola personalizzata:
curl -X PATCH "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "enabled": false, "description": "block GB and FR or based on IP Reputation (temporarily disabled)" }'
Eliminazione di una regola personalizzata con l'API
Procedere come segue per eliminare una regola personalizzata esistente con l'API:
- Impostare l'ambiente API con le variabili corrette.
- Memorizzare i seguenti valori in variabili da utilizzare nel comando API:
CRN: Il nome completo della risorsa cloud (CRN) codificato da URL dell'istanza del servizio.
ZONE_ID: L'ID del dominio.
RULESET_ID: L'ID del set di regole del punto di ingresso della regola personalizzata.
RULE_ID: L'ID della regola personalizzata da modificare.
-
Quando tutte le variabili sono inizializzate, eliminare la regola personalizzata:
curl -X DELETE "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json"
Creare una regola personalizzata con Terraform
Per creare una regola personalizzata, è necessario creare prima un punto di ingresso e poi la regola personalizzata. A tale scopo, attieniti alla seguente procedura:
-
Per creare un set di regole del punto di ingresso, eseguire il seguente comando:
resource "ibm_cis_ruleset_entrypoint_version" "test" { cis_id = "<cis-id>" domain_id = "<domain-id>" phase = "http_request_firewall_custom" rulesets { description = "Entry point ruleset for custom ruleset" } lifecycle { ignore_changes = [ rulesets ] } } -
Per creare una regola personalizzata, eseguire il seguente comando:
resource ibm_cis_ruleset_rule "config" { cis_id = ibm_cis.instance.id domain_id = data.ibm_cis_domain.cis_domain.domain_id ruleset_id = resource.ibm_cis_ruleset_entrypoint_version.rulesets[0].ruleset_id rule { action = "block" description = "var.description" expression = "true" enabled = "false" action_parameters { response { status_code = var.status_code content = var.content content_type = "text/plain" } } position { index = var.index after = <id of any existing rule> before = <id of any existing rule> } } }
L'esempio seguente mostra come creare un punto di ingresso e una regola WAF personalizzata:
resource ibm_cis_ruleset_entrypoint_version test {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
rulesets {
description = "Entrypoint ruleset for custom ruleset"
}
lifecycle {
ignore_changes = [
rulesets
]
}
}
data ibm_cis_ruleset_entrypoint_versions custom_rule_ep {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
depends_on = [
ibm_cis_ruleset_entrypoint_version.test
]
}
resource ibm_cis_ruleset_rule "custom_rule1" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "skip"
description = "adding custom rule via terraform"
expression = "true"
enabled = "true"
action_parameters{
ruleset = "current"
phases = ["http_ratelimit", "http_request_sbfm","http_request_firewall_managed"]
products = ["zoneLockdown","uaBlock", "bic", "hot", "securityLevel", "rateLimit","waf"]
}
}
}
resource ibm_cis_ruleset_rule "custom_rule2" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "block"
description = "adding custom rule via terraform2"
expression = "(http.request.uri.path eq \"/path1\")"
enabled = "false"
}
}
Per ulteriori informazioni, vedere ibm_cis_ruleset_rule nel registro di Terraform.
È possibile aggiornare una regola personalizzata con Terraform modificando l'esempio precedente ed eseguendo il comando terraform apply. Per eliminare la regola, è sufficiente rimuovere la configurazione ed eseguire terraform apply.