Listes d’exclusion du pare-feu d’applications web

Le pare-feu d’applications web (WAF) Azure Application Gateway fournit une protection pour les applications web. Cet article décrit la configuration des listes d’exclusion WAF. Ces paramètres se trouvent dans la stratégie WAF associée à votre passerelle Application Gateway. Pour en savoir plus sur les stratégies WAF, consultez Pare-feu d’applications web Azure sur Azure Application Gateway et Créer des stratégies de pare-feu d’applications web pour Application Gateway.

Parfois, le WAF peut bloquer une requête que vous souhaitez autoriser pour votre application. Les listes d’exclusion du WAF vous permettent d’omettre certains attributs de la demande dans une évaluation par le WAF. Le reste de la requête est évalué comme étant normal.

Par exemple, Active Directory insère des jetons qui sont utilisés pour l’authentification. Quand ils sont utilisés dans un en-tête de requête, ces jetons peuvent contenir des caractères spéciaux susceptibles de déclencher la détection d’un faux positif dans les règles du pare-feu d’applications web. En ajoutant l’en-tête à une liste d’exclusion, vous pouvez configurer WAF pour qu’il ignore l’en-tête, mais il évalue néanmoins toujours le reste de la requête.

Vous pouvez configurer des exclusions à appliquer lorsque des règles WAF spécifiques sont évaluées ou pour qu’elles s’appliquent globalement à l’évaluation de toutes les règles WAF. Les règles d’exclusion s’appliquent à l’ensemble de votre application web.

Identifier les attributs de requête à exclure

Lorsque vous configurez une exclusion WAF, vous devez spécifier les attributs de la demande qui doivent être exclus de l’évaluation WAF. Vous pouvez configurer une exclusion WAF pour les attributs de requête suivants :

  • En-têtes de requête
  • Cookies de requête
  • Vous pouvez ajouter le nom d’un attribut de requête (argument) comme un élément d’exclusion, par exemple :
    • Nom du champ de formulaire
    • Entité JSON
    • Arguments de chaîne de requête de l’URL

Vous pouvez spécifier une correspondance exacte avec l'en-tête ou le corps d'une requête, un cookie ou un attribut de chaîne de requête ou spécifier des correspondances partielles. Utilisez les opérateurs suivants pour configurer l’exclusion :

  • Est égal à : Cet opérateur est utilisé pour une correspondance exacte. Par exemple, pour sélectionner l’en-tête bearerToken, utilisez l’opérateur d’égalité avec le sélecteur défini sur bearerToken.
  • Commence par : cet opérateur correspond à tous les champs qui commencent par la valeur de sélecteur spécifiée.
  • Se termine par : cet opérateur établit une correspondance avec tous les champs d’une demande qui se terminent par la valeur de sélecteur spécifiée.
  • Contient : cet opérateur correspond à tous les champs de demande qui se contiennent la valeur de sélecteur spécifiée.
  • Est égal à : Cet opérateur correspond à tous les champs de la requête. * sera la valeur du sélecteur. Par exemple, vous utilisez cet opérateur quand vous ne connaissez pas les valeurs exactes d’une variable de correspondance donnée, mais que vous voulez vous assurer que le trafic de requête est toujours exclu de l’évaluation des règles.

Lors du traitement des exclusions, le moteur WAF effectue une correspondance sensible/insensible à la casse en fonction du tableau ci-dessous. De plus, les expressions régulières ne sont pas autorisées comme sélecteurs et les corps de requête XML ne sont pas pris en charge.

Corps de la requête CRS 3.1 et versions antérieures CRS 3.2 et versions ultérieures
En-tête* Insensible à la casse Insensible à la casse
Cookie* Insensible à la casse Sensible à la casse
Chaîne de requête* Insensible à la casse Sensible à la casse
corps encodé d'URL Insensible à la casse Sensible à la casse
Corps JSON Insensible à la casse Sensible à la casse
Corps XML Non pris en charge Non pris en charge
corps multipart Insensible à la casse Sensible à la casse

*Selon votre application, les noms et les valeurs de vos en-têtes, cookies et arguments de requête peuvent respecter la casse ou ne pas respecter la casse.

Notes

Si vous souhaitez en savoir plus et obtenir de l’aide, veuillez consulter la section Résolution des problèmes WAF.

Demander des attributs par clés et valeurs

Lorsque vous configurez une exclusion, vous devez déterminer si vous souhaitez exclure la clé ou la valeur de l’évaluation WAF.

Par exemple, supposons que vos demandes incluent cet en-tête :

My-Header: 1=1

La valeur de l’en-tête (1=1) peut être détectée en tant qu’attaque par le WAF. Toutefois, si vous savez qu’il s’agit d’une valeur légitime pour votre scénario, vous pouvez configurer une exclusion pour la valeur de l’en-tête. Pour ce faire, vous utilisez la variable de correspondance RequestHeaderValues, l’opérateur contains et le sélecteur (My-Header). Cette configuration arrête l’évaluation de toutes les valeurs de l’en-tête My-Header.

Remarque

Les attributs de requête par clé et par valeurs sont disponibles uniquement dans CRS 3.2 et versions ultérieures et Bot Manager 1.0 et versions ultérieures.

Les attributs de requête par noms fonctionnent de la même façon que les attributs de requête par valeurs et sont inclus pour assurer la compatibilité descendante avec CRS 3.1 et les versions antérieures. Nous vous recommandons d’utiliser des attributs de requête par valeurs au lieu d’attributs par noms. Par exemple, utilisez RequestHeaderValues au lieu de RequestHeaderNames.

En revanche, si votre WAF détecte le nom de l’en-tête (My-Header) comme attaque, vous pouvez configurer une exclusion pour la clé d’en-tête à l’aide de l’attribut de requête RequestHeaderKeys. L’attribut RequestHeaderKeys est disponible uniquement dans CRS 3.2 ou version ultérieure et Bot Manager 1.0 ou version ultérieure.

Exemples d’attributs de requête

Le tableau ci-dessous montre quelques exemples de la façon dont vous pouvez structurer votre exclusion pour une variable de correspondance donnée.

Attribut à exclure matchVariable selectorMatchOperator Exemple de sélecteur Exemple de requête Éléments exclus
Chaîne de requête RequestArgKeys Égal à /etc/passwd URI : http://localhost:8080/?/etc/passwd=test /etc/passwd
Chaîne de requête RequestArgKeys EqualsAny N/A URI : http://localhost:8080/?/etc/passwd=test&.htaccess=test2 /etc/passwd et .htaccess
Chaîne de requête RequestArgNames Égal à text URI : http://localhost:8080/?text=/etc/passwd /etc/passwd
Chaîne de requête RequestArgNames EqualsAny N/A URI : http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd et .cshrc
Chaîne de requête RequestArgValues Égal à text URI : http://localhost:8080/?text=/etc/passwd /etc/passwd
Chaîne de requête RequestArgValues EqualsAny N/A URI : http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd et .cshrc
Corps de la demande RequestArgKeys Contient sleep Corps de la demande : {"sleep(5)": "test"} sleep(5)
Corps de la demande RequestArgKeys EqualsAny N/A Corps de la demande : {".zshrc": "value", "sleep(5)":"value2"} .zshrc et sleep(5)
Corps de la demande RequestArgNames Égal à test Corps de la demande : {"test": ".zshrc"} .zshrc
Corps de la demande RequestArgNames EqualsAny N/A Corps de la demande : {"key1": ".zshrc", "key2":"sleep(5)"} .zshrc et sleep(5)
Corps de la demande RequestArgValues Égal à test Corps de la demande : {"test": ".zshrc"} .zshrc
Corps de la demande RequestArgValues EqualsAny N/A Corps de la demande : {"key1": ".zshrc", "key2":"sleep(5)"} .zshrc et sleep(5)
En-tête RequestHeaderKeys Égal à X-Scanner En-tête : {"X-Scanner": "test"} X-scanner
En-tête RequestHeaderKeys EqualsAny N/A En-tête : {"X-Scanner": "test", "x-ratproxy-loop": "value"} X-Scanner et x-ratproxy-loop
En-tête RequestHeaderNames Égal à head1 En-tête : {"head1": "X-Scanner"} X-scanner
En-tête RequestHeaderNames EqualsAny N/A En-tête : {"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234 et (hydra)
En-tête RequestHeaderValues Égal à head1 En-tête : {"head1": "X-Scanner"} X-scanner
En-tête RequestHeaderValues EqualsAny N/A En-tête : {"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234 et (hydra)
Cookie RequestCookieKeys Contient /etc/passwd En-tête : {"Cookie": "/etc/passwdtest=hello1"} /etc/passwdtest
Cookie RequestCookieKeys EqualsAny N/A En-tête : {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} /etc/passwdtest et .htaccess
Cookie RequestCookieNames Égal à arg1 En-tête : {"Cookie": "arg1=/etc/passwd"} /etc/passwd
Cookie RequestCookieNames EqualsAny N/A En-tête : {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd et .cshrc
Cookie RequestCookieValues Égal à arg1 En-tête : {"Cookie": "arg1=/etc/passwd"} /etc/passwd
Cookie RequestCookieValues EqualsAny N/A En-tête : {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd et .cshrc

Remarque

Si vous créez une exclusion à l’aide du selectorMatchOperator EqualsAny, tout ce que vous placez dans le champ du sélecteur est converti en « * » par le back-end lors de la création de l’exclusion.

Étendues d’exclusion

Les exclusions peuvent être configurées pour s’appliquer à un ensemble spécifique de règles WAF, à des ensembles de règles ou globalement à toutes les règles.

Conseil

Il est recommandé de rendre les exclusions aussi étroites et spécifiques que possible, afin d’éviter de laisser accidentellement de la place aux attaquants pour exploiter votre système. Lorsque vous devez ajouter une règle d’exclusion, utilisez des exclusions par règle dans la mesure du possible.

Exclusions par règle

Vous pouvez configurer une exclusion pour une règle spécifique, un groupe de règles ou un ensemble de règles. Vous devez spécifier la règle ou les règles auxquelles l’exclusion s’applique. Vous devez également spécifier l’attribut de requête qui doit être exclu de l’évaluation WAF. Pour exclure un groupe complet de règles, il vous suffit de fournir le paramètre ruleGroupName. Le paramètre rules n’est utile que lorsque vous souhaitez limiter l’exclusion à des règles spécifiques d’un groupe.

Des exclusions par règle sont disponibles lorsque vous utilisez l’ensemble de règles OWASP (CRS) version 3.2 ou ultérieure ou l’ensemble de règles Bot Manager version 1.0 ou ultérieure.

Exemple

Supposons que le WAF ignore la valeur de l’en-tête de la demande User-Agent. L’en-tête User-Agent contient une chaîne caractéristique qui permet aux pairs de protocole réseau d’identifier le type d’application, le système d’exploitation, l’éditeur de logiciels ou la version du logiciel de l’agent utilisateur de logiciels demandeur. Pour plus d’informations, consultez la section Agent utilisateur.

Il peut y avoir plusieurs raisons de désactiver l’évaluation de cet en-tête. Le WAF peut voir une chaîne et la détecter comme malveillante. Par exemple, l’en-tête User-Agent peut inclure l’attaque par injection de code SQL classique x=x dans une chaîne. Dans certains cas, il peut s’agir de trafic légitime. Par conséquent, vous devrez peut-être exclure cet en-tête de l’évaluation par le WAF.

Vous pouvez utiliser les approches suivantes pour exclure l’en-tête de l’évaluation User-Agent par toutes les règles d’injection de code SQL :

Pour configurer une exclusion par règle en utilisant le portail Azure, effectuez les étapes suivantes :

  1. Accédez à la stratégie WAF, puis sélectionnez Règles managées.

  2. Sélectionnez Ajouter des exclusions.

    Screenshot of the Azure portal that shows how to add a new per-rule exclusion for the W A F policy.

  3. Dans S’applique à, sélectionnez l’ensemble de règles CRS auquel appliquer l’exclusion, par exemple OWASP_3.2.

    Screenshot of the Azure portal that shows the per-rule exclusion configuration for the W A F policy.

  4. Sélectionnez Ajouter des règles, puis sélectionnez les règles auxquelles vous voulez appliquer des exclusions.

  5. Configurez la variable, l’opérateur et le sélecteur correspondants. Ensuite, sélectionnez Enregistrer.

Vous pouvez configurer plusieurs exclusions.

Vous pouvez aussi exclure l’en-tête User-Agent de l’évaluation seulement par la règle 942270 :

Suivez les étapes décrites dans l’exemple précédent, puis sélectionnez la règle 942270 à l’étape 4.

Exclusions globales

Vous pouvez configurer une exclusion pour qu’elle s’applique à toutes les règles WAF.

Exemple

Supposons que vous vouliez exclure la valeur du paramètre user qui est transmis dans la requête via l’URL. Par exemple, imaginons qu’il est courant dans votre environnement que l’argument de chaîne de requête user contienne une chaîne que le WAF considère comme contenu malveillant, et donc que celle-ci soit bloquée. Vous pouvez exclure tous les arguments de chaîne de requête où le nom commence par le mot user, afin que le WAF n’évalue pas la valeur du champ.

L’exemple suivant montre comment exclure l’argument de chaîne de requête user de l’évaluation :

Pour configurer une exclusion globale en utilisant le portail Azure, effectuez les étapes suivantes :

  1. Accédez à la stratégie WAF, puis sélectionnez Règles managées.

  2. Sélectionnez Ajouter des exclusions.

    Screenshot of the Azure portal that shows how to add a new global exclusion for the W A F policy.

  3. Dans S’applique à, sélectionnez Global

    Screenshot of the Azure portal that shows the global exclusion configuration for the W A F policy.

  4. Configurez la variable, l’opérateur et le sélecteur correspondants. Ensuite, sélectionnez Enregistrer.

Vous pouvez configurer plusieurs exclusions.

Par conséquent, si l’URL http://www.contoso.com/?user%3c%3e=joe est analysée par le WAF, elle n’évalue pas la chaîne joe, mais évalue toujours le nom du paramètre user%3c%3e.

Étapes suivantes