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, soumettre à vérification, enregistrer ou autoriser certaines requêtes.
Vous pouvez créer de nombreux types de règles personnalisées pour le WAF. Toutefois, le nombre de règles actives sur votre site est limité par votre plan client. Pour plus d'informations sur les droits, voir Comparaison des régimes CIS.
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 la console, de l'interface CLI, de l'API ou de Terraform.
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 du WAF sont configurées à l'aide de la page 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.
-
Dans la console CIS, naviguez jusqu'à l'onglet Sécurité.
-
Sélectionnez l'onglet « Règles personnalisées », puis cliquez sur « Créer ».
-
Saisissez une description facultative.
-
Entrez éventuellement une priorité, si nécessaire. Une priorité égale à zéro correspond à une priorité nulle et est évaluée en dernier.
-
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- pour évaluer des conditions ou des groupes de conditions précédemment reliées par « et » qui utilisent la logique « ou »
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.
-
Sélectionnez une action dans la liste de menu Réponse.
-
Pour sauvegarder votre règle, choisissez l'option la plus appropriée en cliquant sur :
- Cliquez sur « Enregistrer comme brouillon » pour enregistrer votre règle, tout en la laissant 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 :
- Dans la console CIS, naviguez jusqu'à l'onglet Sécurité.
- Sélectionnez l'onglet « Règles personnalisées ».
- Dans le tableau « Règles personnalisées », repérez la règle que vous souhaitez modifier, puis cliquez sur le menu « Actions » situé à droite de la ligne correspondante.
- Sélectionnez Editer.
- Modifiez la règle.
- Pour sauvegarder votre règle, choisissez l'option la plus appropriée en cliquant sur :
- Cliquez sur « Enregistrer comme brouillon » pour enregistrer votre règle, tout en la laissant 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 :
- Dans la console CIS, naviguez jusqu'à l'onglet Sécurité.
- Dans le tableau « Règles personnalisées », repérez la règle à supprimer, puis cliquez sur le menu « Actions » situé à droite de la ligne correspondante.
- Sélectionnez « Supprimer » dans le menu des actions.
- Cliquez sur Supprimer la règle personnalisée WAF pour supprimer la règle.
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 :
-
Configurez votre environnement d'interface de ligne de commande.
-
Connectez-vous à votre compte depuis l'interface de ligne de commande (CLI). Une fois le mot de passe saisi, le système vous invite à indiquer le compte et la région que vous souhaitez utiliser :
ibmcloud login --sso -
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]Vous pouvez également créer une règle personnalisée en fournissant directement un fichier JSON ou une chaîne JSON :
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Options de commande
DNS_DOMAIN_ID-
L'ID du domaine DNS.
--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-
Action de règle à effectuer. Valeurs valides : "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". Pour les actions « bloquer » et « ignorer », 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é(e) pour décrire une règle personnalisée.
-
Les champs obligatoires dans les données JSON sont «
expression» et «action».expression: Définit les conditions qui doivent être remplies pour que la règle s'applique.action: L'action à effectuer dans le cadre de la règle. Les valeurs valides sontblock,challenge,js_challenge,managed_challenge,log, etskip.
-
Les champs facultatifs sont
description,enabled,loggingetaction_parameters.action_parameters: Les paramètres d'action de la règle.ruleset: Sauter toutes les règles restantes ou un ou plusieurs jeux de règles gérés par le WAF. La valeur valide est «current».phases: Ignore les composants WAF pour les requêtes correspondantes. Les valeurs valables sonthttp_ratelimit,http_request_firewall_managed, ethttp_request_sbfm.productsla fonction d'identification des produits de sécurité est la suivante : elle permet d'ignorer des produits de sécurité spécifiques pour les demandes de correspondance. Les valeurs valides sontwaf,rateLimit,securityLevel,hot,bic,uaBlock, etzoneLockdown.response: Définir une réponse personnalisée pour l'action «block».status_code: Choisissez un code d'état « HTTP » pour la réponse, compris dans l'intervalle suivant :400-499.content_typetype de contenu : 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 ou non. Lorsque ce champ est désactivé, les demandes correspondantes n'apparaissent pas dans les demandes du pare-feu.logging: Enregistrer les requêtes correspondant à la règle d'exclusion. Cette zone n'est disponible que pour l'action "ignorer".
-
Exemple de données JSON :
{
"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- 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 INSTANCEest utilisée. --output- Spécifiez le format de sortie; seul le format «
JSON» est pris en charge.
Mise à jour d'une règle personnalisée à partir de l'interface de gestion
Exécutez la commande suivante pour mettre à jour une règle personnalisée à partir de l'interface CLI :
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
Vous pouvez également mettre à jour une règle personnalisée en fournissant directement un fichier JSON ou une chaîne JSON :
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Options de commande
DNS_DOMAIN_ID-
L'ID du domaine DNS.
RULE_ID-
L'identifiant 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-
Action de 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é(e) pour décrire une règle personnalisée.
-
Les champs obligatoires dans les données JSON sont «
expression» et «action».expression: Définit les conditions qui doivent être remplies pour que la règle s'applique.action: L'action à effectuer dans le cadre de la règle. Les valeurs valides sontblock,challenge,js_challenge,managed_challenge,log, etskip.
-
Les champs facultatifs sont
description,enabled,loggingetaction_parameters.action_parameters: Les paramètres d'action de la règle.ruleset: Sauter toutes les règles restantes ou un ou plusieurs jeux de règles gérés par le WAF. La valeur valide estcurrentphases: Ignore les composants WAF pour les requêtes correspondantes. Les valeurs valables sonthttp_ratelimit,http_request_firewall_managed, ethttp_request_sbfm.productsla fonction d'identification des produits de sécurité est la suivante : elle permet d'ignorer des produits de sécurité spécifiques pour les demandes de correspondance. Les valeurs valides sontwaf,rateLimit,securityLevel,hot,bic,uaBlock, etzoneLockdown.response: Définir une réponse personnalisée pour l'action « block ».status_code: Choisissez un code d'état « HTTP » pour la réponse, compris dans l'intervalle suivant :400-499.content_typetype de contenu : Type de contenu d'une réponse personnalisée. Les types de réponses valables sonttext/html,text/plain,application/jsonettext/xml.content: Le corps de la réponse.
description: Décrit brièvement la règle.enabled: Indique si la règle est active ou non. Lorsque ce champ est désactivé, les demandes correspondantes n'apparaissent pas dans les demandes du pare-feu.logging: Enregistrer les requêtes correspondant à la règle d'exclusion. Cette zone n'est disponible que pour l'action "ignorer".
-
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 INSTANCEest utilisée. --output- Spécifiez le format de sortie; seul le format «
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 à partir de l'interface CLI :
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Options de commande
DNS_DOMAIN_ID- L'ID du domaine DNS.
RULE_ID- L'identifiant 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 INSTANCEest utilisée. -f, --force- Tentative de suppression d'une règle personnalisée sans demande de confirmation.
--output- Spécifiez le format de sortie; seul le format «
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
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.
Procédez comme suit pour obtenir le jeu de règles du point d'entrée personnalisé :
- Configurez l'environnement de votre API avec les variables appropriées.
- 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.
-
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 figure dans la réponse à la demande qui a abouti. Si l'appel précédent renvoie une réponse 404 Not Found, utilisez l'API suivante pour créer l'ensemble de règles du point 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 à l'aide de l'API
Procédez comme suit pour créer une règle personnalisée à l'aide de l'API :
- Configurez l'environnement de votre API avec les variables appropriées.
- 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.
-
Une fois toutes les variables initialisé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 :
- Configurez l'environnement de votre API avec les variables appropriées.
- 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.
-
Une fois toutes les variables initialisé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 :
- Configurez l'environnement de votre API avec les variables appropriées.
- 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.
-
Une fois toutes les variables initialisé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"
Créer une règle personnalisée avec Terraform
Pour créer une règle personnalisée, vous devez d'abord créer un point d'entrée, puis créer la règle personnalisée. Pour ce faire, procédez comme suit :
-
Pour créer un jeu de règles de point d'entrée, exécutez la commande suivante :
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 ] } } -
Pour créer une règle personnalisée, exécutez la commande suivante :
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'exemple suivant montre comment créer un point d'entrée et une règle personnalisée WAF :
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"
}
}
Pour plus d'informations, 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 et en exécutant la commande terraform apply. Pour supprimer la règle, il suffit de supprimer la configuration et d'exécuter terraform apply.