IBM Cloud Docs
Lavorare con le regole personalizzate del WAF

Lavorare con le regole personalizzate del WAF

Le regole personalizzate del WAF offrono potenza e flessibilità, mirando al traffico di HTTP e applicando criteri personalizzati per bloccare, contestare, registrare o consentire determinate richieste.

È possibile creare molti tipi di regole personalizzate WAF. Tuttavia, il numero di regole attive sul tuo sito è limitato dal tuo piano cliente. Vedere Confronto dei piani di assicurazione sanitaria(CIS) per ulteriori informazioni sui diritti.

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 l'interfaccia utente, la CLI, l'API o Terraform.

Lavorare con le regole personalizzate del WAF nella console

Creare una regola personalizzata nella console

Procedere come segue per creare una regola personalizzata nella console:

Le regole personalizzate WAF vengono configurate utilizzando la pagina delle regole firewall esistente. Tutte le regole firewall legacy create in precedenza sul dominio vengono convertite automaticamente in regole personalizzate WAF.

  1. Passa a Security > Firewall Rules.

  2. Fai 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 e' ate che utilizzano la logica o

    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 costruita manualmente, il Visual Expression Builder potrebbe non essere in grado di renderla.

  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 lasciarla disattivata.
    • Salvare e distribuire 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. Passa a Security > Firewall Rules.
  2. Nella tabella delle regole del firewall, individuare la regola che si desidera modificare, quindi fare clic sul menu Azioni a destra della riga.
  3. Seleziona Edit.
  4. Apporta le modifiche alla regola.
  5. Per salvare la tua regola, scegli l'opzione più appropriata facendo clic su:
    • Salva come bozza per salvare la regola, ma lasciarla disattivata.
    • Salvare e distribuire per salvare la regola e attivarla.

Per mettere in pausa o attivare qualsiasi regola nell'elenco delle regole esistenti, fare clic sulla levetta Abilitato.

Eliminazione di una regola personalizzata nella console

Procedere come segue per eliminare una regola personalizzata esistente nella console:

  1. Passa a Security > Firewall Rules.
  2. Nella tabella delle regole del firewall, individuare la regola da modificare e fare clic sul menu Azioni a destra della riga.
  3. Seleziona Delete.
  4. Conferma l'eliminazione della regola.

Lavorare con le regole personalizzate del WAF dalla CLI

Creazione di una regola personalizzata dalla CLI

Per creare una regola personalizzata dalla CLI, procedere come segue:

  1. Configurare l'ambiente CLI.

  2. Accedere al proprio account con la CLI. Dopo aver inserito la password, il sistema richiede l'account e la regione che si desidera utilizzare:

    ibmcloud login --sso
    
  3. Eseguire 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]
    
    
    
    

ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID ((--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]

Where:

`DNS_DOMAIN_ID`
:   The ID of DNS domain.

`--match`
:   Specifies the conditions that must be matched for the rule to run. For match value, reference documentation `https://cloud.ibm.com/docs/cis?topic=cis-fields-and-expressions`

`--action`
:The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". For "block" and "skip" actions, use JSON file or JSON string instead.

`--enabled`
:  Indicates if the rule is active. Default is "false".

`--description`
:  A brief description of the rule.

`--json`
:  The JSON file or JSON string used to describe a custom rule.

- The required fields in JSON data are `expression`, `action`.

   `expression`: Specifies the conditions that must be matched for the rule to run.
   `action`: The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".

- The optional fields are `description`, `enabled`, `logging`, `action_parameters`.

   `action_parameters`: The rule action parameters.
     `ruleset`: Skip all remaining rules or one or more WAF managed rulesets. Valid value: `current`.
     `phases`: Skips WAF components for matching requests. Valid values: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm".
     `products`: Skips specific security products for matching requests. Valid values: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown".
     `response`:  Define a custom response for 'block' action.
         `status_code`:  Choose an HTTP status code for the response, in the range 400-499.
         `content_type`: The content type of a custom response. Valid response types are :`text/html`,`text/plain`, `application/json`, `text/xml`.
         `content`: The response body.
   `description`: Briefly describes the rule.
   `enabled`: Indicates if the rule is active.
   `logging`: Log requests matching the skip rule. This field is only available for the "skip" action.
      - `enabled`: When disabled, matched requests don't appear in firewall events.

Sample JSON data:

      {
        "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`
:   Instance name or ID. If not set, the context instance specified by `ibmcloud cis instance-set INSTANCE` is used.

`--output`
:   Specify output format, only `JSON` is supported.

### Updating a custom rule from the CLI {: #update-custom-rule-cli}

Run the following command to update a custom rule in the CLI:

```sh {: pre}
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]


ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]

Dove:

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, fare riferimento alla documentazione https://cloud.ibm.com/docs/cis?topic=cis-fields-and-expressions.

--action l'azione della 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 utilizzata per descrivere una regola personalizzata.

  • I campi obbligatori nei dati JSON sono expression, action.

    expression: Specifica le condizioni che devono essere soddisfatte per l'esecuzione della regola. action: L'azione regola da eseguire. Valori validi: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".

  • I campi opzionali sono description, enabled, logging, action_parameters.

    action_parameters: I parametri di azione della regola. ruleset: Ignorare tutte le regole rimanenti o una o più serie di regole gestite da WAF. Valori validi: current. phases: Ignora i componenti WAF per le richieste corrispondenti. Valori validi: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm". products: Salta i prodotti di sicurezza specifici per le richieste di corrispondenza. Valori validi: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown". response: Definire una risposta personalizzata per l'azione 'block'. status_code: Scegliere un codice di stato HTTP per la risposta, 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 che la regola è attiva. logging: Registrare le richieste che corrispondono alla regola da ignorare. Questo campo è disponibile solo per l'azione "salta".

    • enabled quando è disattivato, le richieste abbinate non appaiono negli eventi del firewall.

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 impostato, viene utilizzata l'istanza di contesto specificata da ibmcloud cis instance-set INSTANCE.

--output

Specificare il formato di uscita; è supportato solo JSON.

Eliminazione di una regola personalizzata dalla CLI

Eseguire il seguente comando per eliminare una regola personalizzata nella CLI:

ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]

Dove:

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 impostato, viene utilizzata l'istanza di contesto specificata da ibmcloud cis instance-set INSTANCE.
-f, --force
Tentativo di eliminare una regola personalizzata senza chiedere conferma.
--output
Specificare il formato di uscita; è supportato solo 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

Lavorare con le regole personalizzate del WAF con l'API

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. Questo set di regole del punto di ingresso può già esistere o deve essere creato se non esiste.

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.

  3. 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 sarà presente 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 entrypoint 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.

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

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

  3. 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"

Lavorare con le regole personalizzate del WAF con Terraform

Creare una regola personalizzata con Terraform

L'esempio seguente crea una regola personalizzata utilizzando Terraform:

# First get the entrypoint ruleset ID for the phase `http_request_firewall_custom`.

 data "ibm_cis_ruleset_entrypoint_versions" "test"{
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    phase = "http_request_firewall_custom"
  }

# To create a custom rule:

  resource ibm_cis_ruleset_rule "config" {
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    ruleset_id = "data.ibm_cis_ruleset_entrypoint_versions.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>
      }
    }
  }

Per ulteriori informazioni sugli argomenti e gli attributi, vedere ibm_cis_ruleset_rule nel registro di Terraform.

È possibile aggiornare una regola personalizzata con Terraform modificando l'esempio precedente utilizzato per creare la regola personalizzata ed eseguire il comando terraform apply. Per eliminare la regola, è sufficiente rimuovere la configurazione ed eseguire terraform apply.