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 :
Accédez à la stratégie WAF, puis sélectionnez Règles managées.
Sélectionnez Ajouter des exclusions.
Dans S’applique à, sélectionnez l’ensemble de règles CRS auquel appliquer l’exclusion, par exemple OWASP_3.2.
Sélectionnez Ajouter des règles, puis sélectionnez les règles auxquelles vous voulez appliquer des exclusions.
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 :
Accédez à la stratégie WAF, puis sélectionnez Règles managées.
Sélectionnez Ajouter des exclusions.
Dans S’applique à, sélectionnez Global
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
- Après avoir configuré vos paramètres du pare-feu d’applications web, vous pouvez apprendre à afficher vos journaux d’activité WAF. Pour plus d’informations, consultez Diagnostics Application Gateway.
- En savoir plus sur la sécurité du réseau Azure