Web Application Firewall-undantagslistor
Azure Application Gateway Web Application Firewall (WAF) ger skydd för webbprogram. I den här artikeln beskrivs konfigurationen för WAF-undantagslistor. De här inställningarna finns i WAF-principen som är associerad med din Application Gateway. Mer information om WAF-principer finns i Azure Web Application Firewall på Azure Application Gateway och Skapa brandväggsprinciper för webbaserade program för Application Gateway.
Ibland kan WAF blockera en begäran som du vill tillåta för ditt program. Med WAF-undantagslistor kan du utelämna vissa begärandeattribut från en WAF-utvärdering. Resten av begäran utvärderas som vanligt.
Active Directory infogar till exempel token som används för autentisering. När de används i en begäranderubrik kan dessa token innehålla specialtecken som kan utlösa en falsk positiv identifiering från WAF-reglerna. Genom att lägga till huvudet i en undantagslista kan du konfigurera WAF att ignorera huvudet, men WAF utvärderar fortfarande resten av begäran.
Du kan konfigurera undantag som ska tillämpas när specifika WAF-regler utvärderas eller för att tillämpas globalt på utvärderingen av alla WAF-regler. Undantagsregler gäller för hela webbappen.
Identifiera begärandeattribut som ska undantas
När du konfigurerar ett WAF-undantag måste du ange attributen för den begäran som ska undantas från WAF-utvärderingen. Du kan konfigurera ett WAF-undantag för följande begärandeattribut:
- Begärandehuvuden
- Begär cookies
- Namn på begärandeattribut (args) kan läggas till som ett exkluderingselement, till exempel:
- Namn på formulärfält
- JSON-entitet
- URL-frågesträng args
Du kan ange en exakt matchning för begäranderubrik, brödtext, cookie eller frågesträng. Eller så kan du ange partiella matchningar. Använd följande operatorer för att konfigurera undantaget:
- Lika med: Den här operatorn används för en exakt matchning. Om du till exempel väljer en rubrik med namnet bearerToken använder du operatorn equals med väljaren inställd som bearerToken.
- Börjar med: Den här operatorn matchar alla fält som börjar med det angivna väljarevärdet.
- Slutar med: Den här operatorn matchar alla begärandefält som slutar med det angivna väljarevärdet.
- Innehåller: Den här operatorn matchar alla begärandefält som innehåller det angivna väljarevärdet.
- Är lika med alla: Den här operatorn matchar alla fält för begäran. * kommer att vara väljarens värde. Du kan till exempel använda den här operatorn när du inte känner till de exakta värdena för en viss matchningsvariabel men vill se till att begärandetrafiken fortfarande undantas från regelutvärderingen.
Vid bearbetning av undantag utför WAF-motorn en skiftlägeskänslig/okänslig matchning baserat på tabellen nedan. Dessutom tillåts inte reguljära uttryck eftersom väljare och XML-begärandetexter inte stöds.
Brödtextdel för begäran | CRS 3.1 och tidigare | CRS 3.2 och senare |
---|---|---|
Rubrik* | Skiftlägesokänsligt | Skiftlägesokänsligt |
Småkaka* | Skiftlägesokänsligt | Skiftlägeskänslig |
Frågesträngen* | Skiftlägesokänsligt | Skiftlägeskänslig |
URL-kodad brödtext | Skiftlägesokänsligt | Skiftlägeskänslig |
JSON-brödtext | Skiftlägesokänsligt | Skiftlägeskänslig |
XML-brödtext | Stöds inte | Stöds inte |
Brödtext för flera delar | Skiftlägesokänsligt | Skiftlägeskänslig |
*Beroende på ditt program kan namn och värden för dina huvuden, cookies och fråge args vara skiftlägeskänsliga eller okänsliga.
Kommentar
Mer information och felsökningshjälp finns i WAF-felsökning.
Begär attribut efter nycklar och värden
När du konfigurerar ett undantag måste du avgöra om du vill undanta nyckeln eller värdet från WAF-utvärderingen.
Anta till exempel att dina begäranden innehåller det här huvudet:
My-Header: 1=1
Värdet för rubriken (1=1
) kan identifieras som en attack av WAF. Men om du vet att detta är ett legitimt värde för ditt scenario kan du konfigurera ett undantag för huvudets värde . För att göra det använder du matchningsvariabeln RequestHeaderValues, operatorn innehåller och väljaren (My-Header
). Den här konfigurationen stoppar utvärderingen av alla värden för rubriken My-Header
.
Kommentar
Begärandeattribut efter nyckel och värden är endast tillgängliga i CRS 3.2 eller senare och Bot Manager 1.0 eller senare.
Begärandeattribut efter namn fungerar på samma sätt som begärandeattribut efter värden och ingår för bakåtkompatibilitet med CRS 3.1 och tidigare versioner. Vi rekommenderar att du använder begärandeattribut efter värden i stället för attribut efter namn. Använd till exempel RequestHeaderValues i stället för RequestHeaderNames.
Om waf däremot identifierar rubrikens namn (My-Header
) som en attack kan du konfigurera ett undantag för huvudnyckeln med hjälp av request-attributet RequestHeaderKeys. Attributet RequestHeaderKeys är endast tillgängligt i CRS 3.2 eller senare och Bot Manager 1.0 eller senare.
Exempel på begärandeattribut
Tabellen nedan visar några exempel på hur du kan strukturera ditt exkludering för en viss matchningsvariabel.
Attribut som ska undantas | matchVariable | selectorMatchOperator | Exempelväljare | Exempelbegäranden | Vad utesluts |
---|---|---|---|---|---|
Frågesträng | RequestArgKeys | Lika med | /etc/passwd |
Uri: http://localhost:8080/?/etc/passwd=test |
/etc/passwd |
Frågesträng | RequestArgKeys | EqualsAny | Ej tillämpligt | Uri: http://localhost:8080/?/etc/passwd=test&.htaccess=test2 |
/etc/passwd och .htaccess |
Frågesträng | RequestArgNames | Lika med | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Frågesträng | RequestArgNames | EqualsAny | Ej tillämpligt | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd och .cshrc |
Frågesträng | RequestArgValues | Lika med | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Frågesträng | RequestArgValues | EqualsAny | Ej tillämpligt | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd och .cshrc |
Begärandetext | RequestArgKeys | Innehåller | sleep |
Begärandetext: {"sleep(5)": "test"} |
sleep(5) |
Begärandetext | RequestArgKeys | EqualsAny | Ej tillämpligt | Begärandetext: {".zshrc": "value", "sleep(5)":"value2"} |
.zshrc och sleep(5) |
Begärandetext | RequestArgNames | Lika med | test |
Begärandetext: {"test": ".zshrc"} |
.zshrc |
Begärandetext | RequestArgNames | EqualsAny | Ej tillämpligt | Begärandetext: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc och sleep(5) |
Begärandetext | RequestArgValues | Lika med | test |
Begärandetext: {"test": ".zshrc"} |
.zshrc |
Begärandetext | RequestArgValues | EqualsAny | Ej tillämpligt | Begärandetext: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc och sleep(5) |
Header | RequestHeaderKeys | Lika med | X-Scanner |
Rubrik: {"X-Scanner": "test"} |
X-scanner |
Header | RequestHeaderKeys | EqualsAny | Ej tillämpligt | Rubrik: {"X-Scanner": "test", "x-ratproxy-loop": "value"} |
X-Scanner och x-ratproxy-loop |
Header | RequestHeaderNames | Lika med | head1 |
Rubrik: {"head1": "X-Scanner"} |
X-scanner |
Header | RequestHeaderNames | EqualsAny | Ej tillämpligt | Rubrik: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 och (hydra) |
Header | RequestHeaderValues | Lika med | head1 |
Rubrik: {"head1": "X-Scanner"} |
X-scanner |
Header | RequestHeaderValues | EqualsAny | Ej tillämpligt | Rubrik: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 och (hydra) |
Cookie | RequestCookieKeys | Innehåller | /etc/passwd |
Rubrik: {"Cookie": "/etc/passwdtest=hello1"} |
/etc/passwdtest |
Cookie | RequestCookieKeys | EqualsAny | Ej tillämpligt | Rubrik: {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} |
/etc/passwdtest och .htaccess |
Cookie | RequestCookieNames | Lika med | arg1 |
Rubrik: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
Cookie | RequestCookieNames | EqualsAny | Ej tillämpligt | Rubrik: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd och .cshrc |
Cookie | RequestCookieValues | Lika med | arg1 |
Rubrik: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
Cookie | RequestCookieValues | EqualsAny | Ej tillämpligt | Rubrik: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd och .cshrc |
Kommentar
Om du skapar ett undantag med väljarenMatchOperator EqualsAny
konverteras allt du placerar i fältet selector till "*" av serverdelen när undantaget skapas.
Undantagsomfång
Undantag kan konfigureras för att gälla för en specifik uppsättning WAF-regler, regeluppsättningar eller globalt för alla regler.
Dricks
Det är en bra idé att göra undantag så smala och specifika som möjligt för att undvika att oavsiktligt lämna utrymme för angripare att utnyttja systemet. När du behöver lägga till en exkluderingsregel använder du undantag per regel där det är möjligt.
Undantag per regel
Du kan konfigurera ett undantag för en specifik regel, grupp med regler eller regeluppsättningar. Du måste ange den regel eller de regler som undantaget gäller för. Du måste också ange det begärandeattribut som ska undantas från WAF-utvärderingen. Om du vill undanta en fullständig grupp med regler anger du bara parametern ruleGroupName
, parametern rules
är bara användbar när du vill begränsa undantaget till specifika regler för en grupp.
Undantag per regel är tillgängliga när du använder regeluppsättningen OWASP (CRS) version 3.2 eller senare eller Bot Manager-regeluppsättning version 1.0 eller senare.
Exempel
Anta att du vill att WAF ska ignorera värdet för begärandehuvudet User-Agent
. Huvudet User-Agent
innehåller en karakteristisk sträng som gör att nätverksprotokollets peer-datorer kan identifiera programtypen, operativsystemet, programvaruleverantören eller programvaruversionen av den begärande programvaruanvändaragenten. Mer information finns i User-Agent.
Det kan finnas valfritt antal orsaker till att inaktivera utvärdering av det här huvudet. Det kan finnas en sträng som WAF identifierar och förutsätter att den är skadlig. Rubriken kan till exempel User-Agent
innehålla den klassiska SQL-inmatningsattacken x=x
i en sträng. I vissa fall kan detta vara legitim trafik. Därför kan du behöva undanta det här huvudet från WAF-utvärderingen.
Du kan använda följande metoder för att undanta User-Agent
huvudet från utvärderingen av alla SQL-inmatningsregler:
Följ dessa steg för att konfigurera ett undantag per regel med hjälp av Azure-portalen:
Gå till WAF-principen och välj Hanterade regler.
Välj Lägg till undantag.
I Gäller för väljer du den CRS-regeluppsättning som exkludering ska tillämpas på, till exempel OWASP_3.2.
Välj Lägg till regler och välj de regler som du vill tillämpa undantag på.
Konfigurera matchningsvariabeln, operatorn och väljaren. Välj sedan Spara.
Du kan konfigurera flera undantag.
Du kan också undanta User-Agent
huvudet från utvärderingen bara efter regel 942270:
Följ stegen som beskrivs i föregående exempel och välj regel 942270 i steg 4.
Globala undantag
Du kan konfigurera ett undantag som ska gälla för alla WAF-regler.
Exempel
Anta att du vill undanta värdet i användarparametern som skickas i begäran via URL:en. Anta till exempel att det är vanligt i din miljö att frågesträngsargumentet user
innehåller en sträng som WAF ser som skadligt innehåll, så det blockerar det. Du kan exkludera alla frågesträngsargument där namnet börjar med ordet user
, så att WAF inte utvärderar fältets värde.
I följande exempel visas hur du kan exkludera frågesträngsargumentet user
från utvärderingen:
Följ dessa steg för att konfigurera ett globalt undantag med hjälp av Azure-portalen:
Gå till WAF-principen och välj Hanterade regler.
Välj Lägg till undantag.
I Gäller för väljer du Global
Konfigurera matchningsvariabeln, operatorn och väljaren. Välj sedan Spara.
Du kan konfigurera flera undantag.
Så om URL:en http://www.contoso.com/?user%3c%3e=joe
genomsöks av WAF utvärderas inte strängen joe, men den utvärderar fortfarande parameternamnet user%3c%3e.
Nästa steg
- När du har konfigurerat WAF-inställningarna kan du lära dig hur du visar dina WAF-loggar. Mer information finns i Application Gateway-diagnostik.
- Läs mer om Nätverkssäkerhet i Azure