App Service 部署应用程序,然后通过App Gateway(WAF) 提供公网访问,但是一直遇见403报错,刷新页面,回退,重新Web页面能缓解403问题。
通过浏览器F12抓取网络日志(Network Trace)来定位403返回的情况,发现请求返回的Status为 403 ModSecurity Action。
搜索“403 ModSecurity Action“关键字,发现它于WAF设置的拦截有关。引用文档:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/application-gateway/aog-application-gateway-qa-waf-invalid-block
如果请求返回的
HTTP Code
是403
,并且Response Header
是HTTP/1.1 403 ModSecurity Action
,则代表这个请求被 WAF 阻挡。
所以接下来就是查看WAF的日志,查看请求为什么会触发WAF的阻挡规则呢?
WAF的日志类似如下:
{ "instanceId": "ApplicationGatewayRole_IN_***", "clientIp": "***.***.***.***", "clientPort": "0", "requestUri": "/", "ruleSetType": "OWASP", "ruleSetVersion": "3.0", "ruleId": "529404", "ruleGroup": "XXXXXXXXXXXXX", "message": "SQL Hex Encoding Identified", "action": "Matched", "site": "Global", "details": { "message": "Warning. Pattern match \"(?i:(?:\\\\A|[^\\\\d])0x[a-f\\\\d]{3,}[a-f\\\\d]*)+\" at REQUEST_COOKIES:.AspNet.Cookies ....", "data": "Matched Data: q0Xf53 found within REQUEST_COOKIES:.AspNet.Cookies: ****************** ...", "file": "*********************", "line": "850" }, "hostname": "*********.com.cn", "transactionId": "97033337381714991745" }
深入分析日志,可以发现其中包含ClientIP,WAF中配置的RuleId,及具体配置的Message。
根据配置消息里面的 AspNet.Cookies 内容,推断主要根源就是AspNet.Cookies这个cookie中的内容命中了WAF规则。解决办法有二:
一:通过禁用相关规则Disable掉,但这样也同时失去了该规则对所有请求的防护。
二:可以设置WAF排除对AspNet.Cookies中内容的检查, 如文档<Azure 应用程序网关的 Web 应用程序防火墙排除列表 - Azure 门户 | Azure Docs>中所描述的一样。
如何快速定位应用程序网关 WAF 功能拦截问题 : https://docs.azure.cn/zh-cn/articles/azure-operations-guide/application-gateway/aog-application-gateway-qa-waf-invalid-block
Web 应用程序防火墙排除列表 : https://docs.azure.cn/zh-cn/web-application-firewall/ag/application-gateway-waf-configuration?tabs=portal#waf-exclusion-lists