IBM Cloud Docs
Travailler avec les règles personnalisées du WAF

Travailler avec les règles personnalisées du WAF

Les règles personnalisées du WAF offrent puissance et flexibilité en ciblant le trafic HTTP et en appliquant des critères personnalisés pour bloquer, contester, enregistrer ou autoriser certaines requêtes.

Vous pouvez créer de nombreux types de règles personnalisées WAF. Toutefois, le nombre de règles actives sur votre site est limité par votre plan client. Voir Comparaison des régimes d' CIS s pour plus d'informations sur les droits.

Le nombre de règles actives par plan est fixe. Actuellement, vous ne pouvez pas acheter plus de règles actives.

Avant de commencer, il est conseillé de consulter Utilisation des champs, des fonctions et des expressions.

Vous pouvez créer, mettre à jour et supprimer une règle personnalisée à l'aide de l'interface utilisateur, de la CLI, de l'API ou de Terraform.

Travailler avec les règles personnalisées du WAF dans la console

Création d'une règle personnalisée dans la console

Procédez comme suit pour créer une règle personnalisée dans la console :

Les règles personnalisées WAF sont configurées à l'aide de la page des règles de pare-feu existantes. Toutes les anciennes règles de pare-feu créées précédemment sur votre domaine sont automatiquement converties en règles personnalisées WAF.

  1. Accédez à Sécurité > Règles de pare-feu.

  2. Cliquez sur Créer.

  3. Saisissez une description facultative.

  4. Entrez éventuellement une priorité, si nécessaire. Une priorité de zéro est une priorité nulle et est évaluée en dernier.

  5. Utilisez le générateur d'interface utilisateur dans la section Demandes entrantes pour ajouter une condition. Pour générer une expression avec plusieurs conditions, cliquez sur :

    • Et- pour évaluer les conditions qui utilisent et la logique
    • Ou- évaluer des conditions ou des groupes de conditions précédemment et 'ed qui utilisent ou la logique

    Vous pouvez voir que lorsque vous générez une condition, l'Aperçu de l'expression affiche l'expression en texte en clair.

    Dans l'Aperçu de l'expression, vous pouvez cliquer pour éditer manuellement votre expression au lieu d'utiliser le générateur d'expression visuelle ou basculer entre les deux. Toutefois, selon la complexité d'une expression construite manuellement, le générateur d'expression visuelle peut être incapable de l'afficher.

  6. Sélectionnez une action dans la liste de menu Réponse.

  7. Pour sauvegarder votre règle, choisissez l'option la plus appropriée en cliquant sur :

    • Enregistrer comme brouillon pour sauvegarder votre règle, mais la laisser désactivée.
    • Enregistrer et déployer pour sauvegarder votre règle et l'activer.

Mise à jour d'une règle personnalisée dans la console

Procédez comme suit pour mettre à jour une règle personnalisée existante dans la console :

  1. Accédez à Sécurité > Règles de pare-feu.
  2. Dans le tableau des règles de pare-feu, localisez la règle que vous souhaitez modifier, puis cliquez sur le menu Actions à droite de la ligne.
  3. Sélectionnez Editer.
  4. Modifiez la règle.
  5. Pour sauvegarder votre règle, choisissez l'option la plus appropriée en cliquant sur :
    • Enregistrer comme brouillon pour sauvegarder votre règle, mais la laisser désactivée.
    • Enregistrer et déployer pour sauvegarder votre règle et l'activer.

Pour mettre en pause ou activer une règle dans la liste des règles existantes, cliquez sur le bouton Activé.

Suppression d'une règle personnalisée dans la console

Procédez comme suit pour supprimer une règle personnalisée existante dans la console :

  1. Accédez à Sécurité > Règles de pare-feu.
  2. Dans le tableau des règles de pare-feu, localisez la règle à modifier et cliquez sur le menu Actions à droite de la ligne.
  3. Sélectionnez Supprimer.
  4. Confirmez la suppression de la règle.

Travailler avec les règles personnalisées du WAF à partir du CLI

Création d'une règle personnalisée à partir de l'interface de ligne de commande

Pour créer une règle personnalisée à partir de l'interface de ligne de commande, procédez comme suit :

  1. Configurez votre environnement d'interface de ligne de commande.

  2. Connectez-vous à votre compte à l'aide de l'interface de programmation. Après avoir saisi le mot de passe, le système demande le compte et la région que vous souhaitez utiliser :

    ibmcloud login --sso
    
  3. Exécutez la commande suivante pour créer une règle personnalisée :

    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, see [Using fields, functions, and expressions](/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]

Où :

DNS_DOMAIN_ID
L'ID du domaine DNS.
RULE_ID
L'ID de la règle.
--match
Spécifie les conditions qui doivent être remplies pour que la règle s'applique. Pour la valeur de correspondance, voir Utilisation des champs, des fonctions et des expressions.

--action :L'action de la règle à effectuer. Valeurs valides : "Pour les actions "block" et "skip", utilisez plutôt un fichier JSON ou une chaîne JSON.

--enabled

Indique si la règle est active. La valeur par défaut est "false".

--description

Brève description de la règle.

--json

Le fichier JSON ou la chaîne JSON utilisés pour décrire une règle personnalisée.

  • Les zones obligatoires dans les données JSON sont expression, action.

    expression: Spécifie les conditions qui doivent être remplies pour que la règle s'applique. action: Action de règle à effectuer. Valeurs valides : "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".

  • Les champs facultatifs sont description, enabled, logging, action_parameters.

    action_parameters: Les paramètres d'action de la règle. ruleset: Ignorez toutes les règles restantes ou un ou plusieurs jeux de règles WAF gérés. Valeurs valables : current. phases: Ne tient pas compte des composants WAF pour les demandes correspondantes. Valeurs valides : "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm". products: Ne tient pas compte des produits de sécurité spécifiques pour les demandes de correspondance. Valeurs valides : "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown". response: Définir une réponse personnalisée pour l'action 'block'. status_code: Choisissez un code d'état HTTP pour la réponse, entre 400 et 499. content_type: Le type de contenu d'une réponse personnalisée. Les types de réponses valables sont :text/html,text/plain, application/json, text/xml. content: Le corps de la réponse. description: Décrit brièvement la règle. enabled: Indique si la règle est active. logging: Journalisez les demandes qui correspondent à la règle permettant d'ignorer des règles. Ce champ n'est disponible que pour l'action "sauter".

    • enabled si cette option est désactivée, les demandes correspondantes n'apparaissent pas dans les événements du pare-feu.

Exemple de données JSON :

    {
      "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

Nom ou ID de l'instance. Si cette option n'est pas définie, l'instance de contexte spécifiée par ibmcloud cis instance-set INSTANCE est utilisée.

--output

Spécifier le format de sortie, seul JSON est pris en charge.

Suppression d'une règle personnalisée à partir de l'interface de gestion

Exécutez la commande suivante pour supprimer une règle personnalisée dans l'interface de gestion :

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

Où :

DNS_DOMAIN_ID
L'ID du domaine DNS.
RULE_ID
L'ID de la règle personnalisée.
-i, --instance
Nom ou ID de l'instance. Si cette option n'est pas définie, l'instance de contexte spécifiée par ibmcloud cis instance-set INSTANCE est utilisée.
-f, --force
Tentative de suppression d'une règle personnalisée sans demande de confirmation.
--output
Spécifier le format de sortie, seul JSON est pris en charge.

Exemples de commande

  • Pour créer une règle personnalisée :

    ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"

  • Pour mettre à jour une règle personnalisée :

    ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true

  • Pour supprimer une règle personnalisée :

    ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27

Travailler avec les règles personnalisées du WAF avec l'API

Obtenir le point d'entrée des règles personnalisées pour l'API

Toutes les opérations de l'API sur les règles personnalisées nécessitent une adresse RULESET_ID de l'ensemble de règles du point d'entrée pour la phase des règles personnalisées. Cet ensemble de règles de point d'entrée peut déjà exister ou doit être créé s'il n'existe pas.

Procédez comme suit pour obtenir le jeu de règles du point d'entrée personnalisé :

  1. Configurez l'environnement de votre API avec les variables appropriées.

  2. Stockez les valeurs suivantes dans les variables destinées à être utilisées dans la commande d'API :

    CRN: Le nom complet de la ressource cloud (CRN) de l'instance de service, codé sur URL.

    ZONE_ID: L'ID de domaine.

  3. Lorsque toutes les variables sont initiées, obtenir l'ensemble de règles du point d'entrée :

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'identifiant de l'ensemble de règles figurera dans la réponse à la demande qui a abouti. Si l'appel ci-dessus renvoie une réponse 404 Not Found, utilisez l'API suivante pour créer l'ensemble de règles d'entrée pour la phase de règles personnalisées :

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"
}'

Création d'une règle personnalisée avec l'API

Procédez comme suit pour créer une règle personnalisée à l'aide de l'API :

  1. Configurez l'environnement de votre API avec les variables appropriées.

  2. Stockez les valeurs suivantes dans les variables destinées à être utilisées dans la commande d'API :

    CRN: Le nom complet de la ressource cloud (CRN) de l'instance de service, codé sur URL.

    ZONE_ID: L'ID de domaine.

    RULESET_ID: L'ID de l'ensemble de règles personnalisées du point d'entrée.

  3. Lorsque toutes les variables sont initiées, créez la règle personnalisée :

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"
    }
  }
}'

Mise à jour d'une règle personnalisée avec l'API

Procédez comme suit pour mettre à jour une règle personnalisée existante à l'aide de l'API :

  1. Configurez l'environnement de votre API avec les variables appropriées.

  2. Stockez les valeurs suivantes dans les variables destinées à être utilisées dans la commande d'API :

    CRN: Le nom complet de la ressource cloud (CRN) de l'instance de service, codé sur URL.

    ZONE_ID: L'ID de domaine.

    RULESET_ID: L'ID de l'ensemble de règles personnalisées du point d'entrée.

    RULE_ID: L'ID de la règle personnalisée à modifier.

  3. Lorsque toutes les variables sont initiées, mettez à jour la règle personnalisée :

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)"
}'

Suppression d'une règle personnalisée avec l'API

Procédez comme suit pour supprimer une règle personnalisée existante à l'aide de l'API :

  1. Configurez l'environnement de votre API avec les variables appropriées.

  2. Stockez les valeurs suivantes dans les variables destinées à être utilisées dans la commande d'API :

    CRN: Le nom complet de la ressource cloud (CRN) de l'instance de service, codé sur URL.

    ZONE_ID: L'ID de domaine.

    RULESET_ID: L'ID de l'ensemble de règles personnalisées du point d'entrée.

    RULE_ID: L'ID de la règle personnalisée à modifier.

  3. Lorsque toutes les variables sont initiées, supprimez la règle personnalisée :

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"

Travailler avec les règles personnalisées du WAF avec Terraform

Créer une règle personnalisée avec Terraform

L'exemple suivant crée une règle personnalisée à l'aide de 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>
      }
    }
  }

Pour plus d'informations sur les arguments et les attributs, voir ibm_cis_ruleset_rule dans le registre Terraform.

Vous pouvez mettre à jour une règle personnalisée avec Terraform en modifiant l'exemple précédent utilisé pour créer la règle personnalisée et exécuter la commande terraform apply. Pour supprimer la règle, il suffit de supprimer la configuration et d'exécuter terraform apply.