Felsöka brandväggen för webbaserade program (WAF) för Azure Application Gateway
Det finns några saker du kan göra om begäranden som ska passera genom brandväggen för webbprogram (WAF) blockeras.
Kontrollera först att du har läst WAF-översikten och WAF-konfigurationsdokumenten. Kontrollera också att du har aktiverat WAF-övervakning De här artiklarna beskriver hur WAF-funktionerna, hur WAF-regeluppsättningarna fungerar och hur du får åtkomst till WAF-loggar.
OWASP-regeluppsättningarna är utformade för att vara strikta och anpassade för att passa programmets eller organisationens specifika behov med hjälp av WAF. Det är helt normalt och förväntas i många fall att skapa undantag, anpassade regler och till och med inaktivera regler som kan orsaka problem eller falska positiva identifieringar. Med principer per webbplats och per URI kan dessa ändringar endast påverka specifika webbplatser/URI:er. Ändringar bör därför inte behöva påverka andra webbplatser som kanske inte stöter på samma problem.
Förstå WAF-loggar
Syftet med WAF-loggar är att visa varje begäran som WAF matchar eller blockerar. Det är en transaktionsbok för alla utvärderade begäranden som matchas eller blockeras. Om du märker att WAF blockerar en begäran om att den inte ska (en falsk positiv identifiering) kan du göra några saker. Börja med att begränsa och hitta den specifika begäran. Titta igenom loggarna för att hitta den specifika URI:n, tidsstämpeln eller transaktions-ID:t för begäran. När du hittar de associerade loggposterna kan du börja agera på falska positiva identifieringar.
Anta till exempel att du har en legitim trafik som innehåller strängen 1=1
som du vill skicka genom din WAF. Om du provar begäran blockerar WAF trafik som innehåller din 1=1
sträng i valfri parameter eller fält. Det här är en sträng som ofta associeras med en SQL-inmatningsattack. Du kan titta igenom loggarna och se tidsstämpeln för begäran och reglerna som blockerade/matchade.
I följande exempel kan du se att fyra regler utlöses under samma begäran (med fältet TransactionId). Den första säger att den matchade eftersom användaren använde en numerisk/IP-URL för begäran, vilket ökar avvikelsepoängen med tre eftersom det är en varning. Nästa regel som matchade är 942130, som är den du letar efter. Du kan se 1=1
fältet i details.data
. Detta ökar avvikelsepoängen ytterligare med tre igen, eftersom det också är en varning. I allmänhet ökar varje regel som har åtgärden Matchad avvikelsepoängen, och vid den här tidpunkten skulle avvikelsepoängen vara sex. Mer information finns i Avvikelsebedömningsläge.
De sista två loggposterna visar att begäran blockerades eftersom avvikelsepoängen var tillräckligt hög. Dessa poster har en annan åtgärd än de andra två. De visar att de faktiskt blockerade begäran. Dessa regler är obligatoriska och kan inte inaktiveras. De bör inte betraktas som regler, utan mer som kärninfrastrukturen för WAF internals.
{
"resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.139",
"clientPort": "",
"requestUri": "\/",
"ruleSetType": "OWASP_CRS",
"ruleSetVersion": "3.0.0",
"ruleId": "920350",
"message": "Host header is a numeric IP address",
"action": "Matched",
"site": "Global",
"details": {
"message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
"data": "40.90.218.160",
"file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
"line": "791"
},
"hostname": "vm000003",
"transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
}
}
{
"resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.139",
"clientPort": "",
"requestUri": "\/",
"ruleSetType": "OWASP_CRS",
"ruleSetVersion": "3.0.0",
"ruleId": "942130",
"message": "SQL Injection Attack: SQL Tautology Detected.",
"action": "Matched",
"site": "Global",
"details": {
"message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
"data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
"file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
"line": "554"
},
"hostname": "vm000003",
"transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
}
}
{
"resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "167.220.2.139",
"clientPort": "",
"requestUri": "\/",
"ruleSetType": "",
"ruleSetVersion": "",
"ruleId": "0",
"message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
"action": "Blocked",
"site": "Global",
"details": {
"message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
"data": "",
"file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
"line": "57"
},
"hostname": "vm000003",
"transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
}
}
{
"resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.139",
"clientPort": "",
"requestUri": "\/",
"ruleSetType": "",
"ruleSetVersion": "",
"ruleId": "0",
"message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
"action": "Blocked",
"site": "Global",
"details": {
"message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
"data": "",
"file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
"line": "73"
},
"hostname": "vm000003",
"transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
}
}
Åtgärda falska positiva identifieringar
Med den här informationen, och vetskapen om att regel 942130 är den som matchade strängen 1=1
, kan du göra några saker för att hindra detta från att blockera trafiken:
Använda en undantagslista
Mer information om undantagslistor finns i WAF-konfiguration.
Inaktivera regeln.
Använda en undantagslista
Om du vill fatta ett välgrundat beslut om att hantera falska positiva identifieringar är det viktigt att bekanta dig med de tekniker som programmet använder. Anta till exempel att det inte finns någon SQL-server i din teknikstack och att du får falska positiva identifieringar relaterade till dessa regler. Att inaktivera dessa regler försvagar inte nödvändigtvis din säkerhet.
En fördel med att använda en undantagslista är att endast en viss del av en begäran inaktiveras. Det innebär dock att ett specifikt undantag gäller för all trafik som passerar genom din WAF eftersom det är en global inställning. Detta kan till exempel leda till ett problem om 1=1 är en giltig begäran i brödtexten för en viss app, men inte för andra. En annan fördel är att du kan välja mellan brödtext, huvuden och cookies som ska undantas om ett visst villkor uppfylls, i stället för att utesluta hela begäran.
Ibland finns det fall där specifika parametrar skickas till WAF på ett sätt som kanske inte är intuitivt. Det finns till exempel en token som skickas när du autentiserar med Microsoft Entra-ID. Den här token, __RequestVerificationToken, skickas vanligtvis som en cookie för begäran. Men i vissa fall där cookies är inaktiverade skickas denna token också som ett begärandeattribut eller arg
. Om detta händer måste du se till att __RequestVerificationToken också läggs till i undantagslistan som ett namn på begärandeattributet.
I det här exemplet vill du exkludera det namn på attributet Request som är lika med text1. Detta är uppenbart eftersom du kan se attributnamnet i brandväggsloggarna: data: Matchade data: 1=1 som finns i ARGS:text1: 1=1. Attributet är text1. Du kan också hitta det här attributnamnet på några andra sätt, se Söka efter attributnamn för begäran.
Du kan skapa undantag för WAF i Application Gateway på olika omfångsnivåer. Mer information finns i undantagslistor för brandvägg för webbaserade program.
Inaktivera regler
Ett annat sätt att komma runt en falsk positiv identifiering är att inaktivera regeln som matchade på indata som WAF trodde var skadlig. Eftersom du har parsat WAF-loggarna och har begränsat regeln till 942130 kan du inaktivera den i Azure Portal. Se Anpassa brandväggsregler för webbprogram via Azure Portal.
En fördel med att inaktivera en regel är att om du vet att all trafik som innehåller ett visst villkor som normalt blockeras är giltig trafik kan du inaktivera den regeln för hela WAF. Men om det bara är giltig trafik i ett specifikt användningsfall öppnar du en säkerhetsrisk genom att inaktivera regeln för hela WAF eftersom det är en global inställning.
Om du vill använda Azure PowerShell kan du läsa Anpassa brandväggsregler för webbprogram via PowerShell. Om du vill använda Azure CLI kan du läsa Anpassa brandväggsregler för webbprogram via Azure CLI.
Söka efter namn på begärandeattribut
Med hjälp av Fiddler inspekterar du enskilda begäranden och avgör vilka specifika fält på en webbsida som anropas. Detta kan bidra till att undanta vissa fält från inspektion med hjälp av undantagslistor.
I det här exemplet kan du se att fältet där strängen 1=1 angavs kallas text1.
Det här är ett fält som du kan exkludera. Mer information om undantagslistor finns i undantagslistor för brandvägg för webbprogram. Du kan exkludera utvärderingen i det här fallet genom att konfigurera följande undantag:
Du kan också granska brandväggsloggarna för att hämta informationen för att se vad du behöver lägga till i undantagslistan. Information om hur du aktiverar loggning finns i Serverdelshälsa, resursloggar och mått för Application Gateway.
Granska brandväggsloggen och visa PT1H.json-filen för den timme som begäran som du vill inspektera inträffade.
I det här exemplet kan du se att du har fyra regler med samma TransactionID och att alla inträffade exakt samtidigt:
- {
- "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "167.220.2.139",
- "clientPort": "",
- "requestUri": "\/",
- "ruleSetType": "OWASP_CRS",
- "ruleSetVersion": "3.0.0",
- "ruleId": "920350",
- "message": "Host header is a numeric IP address",
- "action": "Matched",
- "site": "Global",
- "details": {
- "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
- "data": "40.90.218.160",
- "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
- "line": "791"
- },
- "hostname": "vm000003",
- "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
- }
- }
- {
- "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.139",
- "clientPort": "",
- "requestUri": "\/",
- "ruleSetType": "OWASP_CRS",
- "ruleSetVersion": "3.0.0",
- "ruleId": "942130",
- "message": "SQL Injection Attack: SQL Tautology Detected.",
- "action": "Matched",
- "site": "Global",
- "details": {
- "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
- "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
- "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
- "line": "554"
- },
- "hostname": "vm000003",
- "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
- }
- }
- {
- "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.139",
- "clientPort": "",
- "requestUri": "\/",
- "ruleSetType": "",
- "ruleSetVersion": "",
- "ruleId": "0",
- "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
- "action": "Blocked",
- "site": "Global",
- "details": {
- "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
- "data": "",
- "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
- "line": "57"
- },
- "hostname": "vm000003",
- "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
- }
- }
- {
- "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.139",
- "clientPort": "",
- "requestUri": "\/",
- "ruleSetType": "",
- "ruleSetVersion": "",
- "ruleId": "0",
- "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
- "action": "Blocked",
- "site": "Global",
- "details": {
- "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
- "data": "",
- "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
- "line": "73"
- },
- "hostname": "vm000003",
- "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
- }
- }
Med dina kunskaper om hur CRS-regeluppsättningar fungerar och att CRS-regeluppsättningen 3.0 fungerar med ett system för avvikelsebedömning (se Brandvägg för webbaserade program för Azure Application Gateway) vet du att de två nedersta reglerna med åtgärden: Blockerad egenskap blockerar baserat på den totala avvikelsepoängen. Reglerna att fokusera på är de två främsta.
Den första posten loggas eftersom användaren använde en numerisk IP-adress för att navigera till Application Gateway, vilket kan ignoreras i det här fallet.
Den andra (regel 942130) är den intressanta. Du kan se i informationen att det matchade ett mönster (1=1)
och att fältet heter text1. Följ samma föregående steg för att exkludera namnet på begärandeattributet som är 1=1
lika med .
Söka efter namn på begärandehuvud
Fiddler är ett användbart verktyg igen för att hitta namn på begäranderubriker. I följande skärmbild kan du se rubrikerna för den här GET-begäran, som innehåller Content-Type, User-Agent och så vidare.
Ett annat sätt att visa begärande- och svarshuvuden är att titta i utvecklarverktygen i Chrome. Du kan trycka på F12 eller högerklicka på ->Inspect ->Developer Tools och välja fliken Nätverk . Läs in en webbsida och välj den begäran som du vill inspektera.
Hitta namn på begärandecookies
Om begäran innehåller cookies kan fliken Cookies väljas för att visa dem i Fiddler.
Begränsa globala parametrar för att eliminera falska positiva identifieringar
Inaktivera kontroll av begärandetext
Genom att ställa in Granska begärandetexten på av, utvärderas inte begärandeorganen för din trafik av din WAF. Detta kan vara användbart om du vet att begärandeorganen inte är skadliga för ditt program.
När du inaktiverar det här alternativet kringgår endast begärandetexten kontrollen. Huvudena och cookies inspekteras fortfarande, såvida inte enskilda objekt exkluderas med hjälp av funktionen för undantagslistan.
Inaktivera maxgränsen för begärandetext
Genom att inaktivera maxgränsen för begärandetext kan stora begärandeorgan bearbetas av WAF utan att avvisas för att vara för stora. Detta kan vara användbart om du regelbundet har stora begäranden.
När du inaktiverar det här alternativet kommer begärandetexten endast att inspekteras upp till maxgränsen för kontroll av begärandetext. Om det finns skadligt innehåll i begäran utöver maxgränsen för kontroll av begärandetexten kommer WAF inte att identifiera det.
Inaktivera maximala filstorleksgränser
Genom att inaktivera filstorleksgränserna för din WAF kan stora filer laddas upp utan att WAF avvisar dessa filuppladdningar. Genom att tillåta att stora filer laddas upp ökar risken för att serverdelen överbelastas. Om du vet den maximala storleken som en filuppladdning kan vara kan du ange en storleksgräns för filuppladdningar som är något över den förväntade maxstorleken. Att begränsa filstorleken till ett normalt användningsfall för ditt program är ett annat sätt att förhindra attacker. Men om dina filuppladdningar regelbundet överskrider den maximala gränsen för tvingande filuppladdningsstorlek kan du behöva inaktivera storleksbegränsningarna för filuppladdning helt för att undvika falska positiva identifieringar.
Kommentar
Om du vet att din app aldrig behöver någon filuppladdning över en viss storlek kan du begränsa det genom att ange en gräns.
Varning
När du tilldelar en ny hanterad regeluppsättning till en WAF-princip återställs alla tidigare anpassningar från befintliga hanterade regeluppsättningar, till exempel regeltillstånd, regelåtgärder och undantag på regelnivå till standardinställningarna för den nya hanterade regeluppsättningen. Anpassade regler, principinställningar och globala undantag påverkas dock inte under tilldelningen av den nya regeluppsättningen.
Brandväggsmått (endast WAF_v1)
För v1 Web Application Firewalls är följande mått nu tillgängliga i portalen:
- Antal blockerade begäranden i brandväggen för webbaserade program Antalet begäranden som har blockerats
- Web Application Firewall Blocked Rule Count Alla regler som matchades och begäran blockerades
- Total regeldistribution för brandvägg för webbaserade program Alla regler som matchades under utvärderingen
Om du vill aktivera mått väljer du fliken Mått i portalen och väljer ett av de tre måtten.
Nästa steg
Se Så här konfigurerar du brandväggen för webbprogram på Application Gateway.