![如何使用 ModSecurity SecRule 根据主机名限制特定客户端?](https://linux22.com/image/766069/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ModSecurity%20SecRule%20%E6%A0%B9%E6%8D%AE%E4%B8%BB%E6%9C%BA%E5%90%8D%E9%99%90%E5%88%B6%E7%89%B9%E5%AE%9A%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%9F.png)
我正在尝试限制特定主机(例如 AWS)访问我的 Web 服务器。我尝试了不同的方法,但都没有用。
# Block AWS
SecRule REQUEST_HEADERS:Host ".*\.amazonaws\.com.*" \
"msg:'AWS blocked',id:10007,log,t:lowercase,drop,phase:1"
我试过:
SecRule REQUEST_HEADERS:Host ".*\.amazonaws\.com.*"
SecRule REQUEST_HEADERS:Host "@rx ^.*\.amazonaws\.com.*$"
SecRule REQUEST_HEADERS:Host "@contains amazonaws.com"
以上方法均无效,因此我得出结论,我的标头查询语法存在问题。以下是我尝试匹配以进行排除的主机字符串示例:主机:ec2-12-34-56-78.compute-1.amazonaws.com
答案1
因此,据我所知,正如@FarhadSakhaei 所指出的,REQUEST_HEADERS:Host 指的是请求的主机,而不是远程主机。这很奇怪,因为 REQUEST_HEADERS:User-Agent 确实返回了客户端的用户代理。
可以采用的方法是将 SecRule REMOTE_HOST 与 Apache 指令 HostnameLookups 设置为“On”。
例如
SecRule REMOTE_HOST "bad\.host\.com$" "msg:'Bad host blocked',id:99999,log,drop,phase:1"
如果 HostnameLookups 为“关闭”,则 REMOTE_HOST 将返回请求客户端的 IP 地址。HostnameLookups 设置为“打开”显然会对性能造成一定影响,因此这就是权衡。
答案2
我用过这样的东西:
HostnameLookups "On"
SecRule REMOTE_HOST "@rx (?:amazonaws\.com|your-server\.de)"\
"msg:'Bad host blocked - REMOTE HOST: %REMOTE_HOST}'\
,id:99999,log,drop,block,t:lowercase,phase:request,status:403"
效果很好,只需完成不良主机列表......