随机地,modsecurity 阻止合法客户端请求并给出错误 403。这是 modsec_audit.log 的参数:
---d6e99f36-A--
[21/Jun/2020:07:14:45 +0100] Xu761X8AAAEAADI1YrAAAABQ xxx.xxx.xxx.xxx 60036 xxx.xxx.xxx.xxx 443
--d6e99f36-B--
GET /s/p.json?eyJ0IjoyLjksImYiOnsiZmxpX3BsIjoiYXNwZXJzb3IiLCJmbGlfZyI6LTEsImZsaV9jIjotMSwiZmxpX20iOjAsImZsaV9hIjoyMDE1fSwiY3NyZiI6ImE5MDMwMDkxLTBlZjg$
Host: fneon.eu
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: */*
Accept-Language: pt-PT,pt;q=0.8,en;q=0.5,en-US;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://example.com/
Content-Type: application/json,charset=UTF-8
DNT: 1
Connection: keep-alive
Cookie: jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyYzMwOGQwYTc5NGEyZWU2MjMxYzI2M2EyYWMzNjkwMCIsImV4cCI6MTU5MzY0NDQwMCwiaWF0IjoxNTkyNzE5ODg1$
Pragma: no-cache
Cache-Control: no-cache
--d6e99f36-F--
HTTP/1.1 403 Forbidden
X-FRAME-OPTIONS: DENY
X-Content-Type-Options: nosniff
Content-Length: 199
Keep-Alive: timeout=5, max=89
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--d6e99f36-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
--d6e99f36-H--
Apache-Error: [file "mod_evasive20.c"] [line 259] [level 3] client denied by server configuration: %s
Apache-Handler: proxy-server
Stopwatch: 1592720085355364 815 (- - -)
Stopwatch2: 1592720085355364 815; combined=42, p1=35, p2=0, p3=1, p4=0, p5=5, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.0 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"
--d6e99f36-Z--
这是我的配置(仅更改):
/etc/modsecurity/modsecurity.conf
SecRuleEngine On
SecResponseBodyAccess Off
SecRequestBodyLimit 5242880 (15Mb)
/etc/apache2/mods-enabled/evasive.conf
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 75
DOSPageInterval 5
DOSSiteInterval 1
DOSBlockingPeriod 3000
DOSWhitelist 127.0.0.1
DOSWhitelist xxx.xxx.xxx.xxx
DOSWhitelist xxx.xxx.xxx.xxx
DOSWhitelist xxx.xxx.xxx.xxx
DOSLogDir "/var/log/mod_evasive"
</IfModule>
/etc/apache2/conf-enabled/security.conf
ServerTokens Prod
重现该问题的一种方法是当客户端发出以下类型的请求时:
https://example.com/s/p.json?eyJ0IjoyLjksImYiOnsiZmxpX3BsIjoiYXNwZXJzb3IiLCJmbGlfZyI6LTEsImZsaV9jIjotMSwiZmxpX20iOjAsImZsaV9hIjoyMDExfSwiY3NyZiI6ImE5MDMwMDkxLTBlZjgtNDcyOC05YjQ1LTU1MWY3M2U5YjQ5MCJ9
...在我看来,这是合法的请求。有人能告诉我如何解决这个问题吗?谢谢。
答案1
ModSecurity 在启用所有默认规则的情况下导致误报是正常的。这就是为什么你应该禁用引起问题的规则,最好只针对那些不禁用就无法工作的 URL。由于日志中的引用缺少规则 ID,因此很难给出确切的答案,但这里有流程示例:
首先找到导致问题的规则。例如,如果合法客户端的 IP 地址是
198.51.100.123
,您可以:grep "198.51.100.123" /var/log/apache2/example.com-error.log
将搜索限制在已知的良好 IP 上很重要;否则您最终会允许一些真正恶意的东西!
查看这些
ModSecurity: Warning
线条并集中精力于[id ""]
和[uri ""]
。假设您找到具有 和 的线条[uri "/s/p.json"]
,它们正在触发规则[id "941100"]
和[id "941120"]
。全局或基于虚拟主机配置 Apache 以禁用这些规则,例如
<LocationMatch "/s/p.json"> SecRuleRemoveById 941100 941120 </LocationMatch>
一些关于 ModSecurity 和处理误报的文章:
- OWASP CRS 文档:添加例外并调整 CRS
- 尼基尔·库马尔:使用白名单避免 Mod 安全误报
- 克里斯蒂安·福利尼:使用 OWASP ModSecurity 核心规则集处理误报
答案2
我也有一个奇怪的问题
当我打开 modsec 时,我的 Google 新闻 RSS 源将无法工作,而且我无法使即时索引工作,因为源不会显示在我的发布者中心。
如果我关闭 modsec。它起作用了。RSS 源显示在我的发布者中心,我可以在 google 中立即获得索引