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.

  1. Nella console CIS, passare alla voce Sicurezza.

  2. Selezionare la scheda Regole personalizzate e fare clic su Crea.

  3. Inserire una descrizione opzionale.

  4. Facoltativamente, immetti una priorità, se necessario. Una priorità pari a zero è una priorità nulla e viene valutata per ultima.

  5. 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.

  6. Scegli un'azione dal menu di elenco Response.

  7. 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:

  1. Nella console CIS, passare alla voce Sicurezza.
  2. Seleziona la scheda " Regole personalizzate ".
  3. Nella tabella "Regole personalizzate", individuare la regola che si desidera modificare, quindi fare clic sul menu "Azioni" a destra della riga.
  4. Seleziona Edit.
  5. Apporta le modifiche alla regola.
  6. 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:

  1. Nella console CIS, passare alla voce Sicurezza.
  2. Nella tabella "Regole personalizzate", individuare la regola da eliminare e fare clic sul menu "Azioni" a destra della riga.
  3. Selezionare Elimina dal menu delle azioni.
  4. 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:

  1. Configurare l'ambiente CLI.

  2. 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
    
  3. 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 expression e action.

    • expression: Specifica le condizioni che devono essere soddisfatte affinché la regola venga applicata.
    • action: L'azione da eseguire. I valori validi sono block, challenge, js_challenge, managed_challenge, log e skip.
  • I campi opzionali sono description, enabled, logging e action_parameters.

    • action_parameters: I parametri dell'azione della regola.
    • ruleset salta 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 sono http_ratelimit, http_request_firewall_managed e http_request_sbfm.
    • products salta i prodotti di sicurezza specifici per le richieste di corrispondenza. I valori validi sono waf, rateLimit, securityLevel, hot, bic, uaBlock e zoneLockdown.
    • response: Definire una risposta personalizzata per l'azione " block ".
      • status_code: Scegliere un codice di stato " HTTP " per la risposta compreso nell'intervallo 400-499.
      • content_type il 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.
    • description descrive 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 expression e action.

    • expression: Specifica le condizioni che devono essere soddisfatte affinché la regola venga applicata.
    • action: L'azione da eseguire. I valori validi sono block, challenge, js_challenge, managed_challenge, log e skip.
  • I campi opzionali sono description, enabled, logging e action_parameters.

    • action_parameters: I parametri dell'azione della regola.
      • ruleset salta 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 sono http_ratelimit, http_request_firewall_managed e http_request_sbfm.
      • products salta i prodotti di sicurezza specifici per le richieste di corrispondenza. I valori validi sono waf, rateLimit, securityLevel, hot, bic, uaBlock e zoneLockdown.
      • response: Definire una risposta personalizzata per l'azione "block".
        • status_code: Scegliere un codice di stato " HTTP " per la risposta compreso nell'intervallo 400-499.
        • content_type il tipo di contenuto di una risposta personalizzata. I tipi di risposta validi sono text/html, text/plain, application/json e text/xml.
        • content: Il corpo della risposta.
    • description descrive 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:

  1. Impostare l'ambiente API con le variabili corrette.
  2. 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.

  1. 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:

  1. Impostare l'ambiente API con le variabili corrette.
  2. 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.

  1. 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:

  1. Impostare l'ambiente API con le variabili corrette.
  2. 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.

  1. 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:

  1. Impostare l'ambiente API con le variabili corrette.
  2. 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.

  1. 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:

  1. 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
          ]
      }
    }
    
  2. 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.