如何使用 ModSecurity SecRule 根据主机名限制特定客户端?

如何使用 ModSecurity SecRule 根据主机名限制特定客户端?

我正在尝试限制特定主机(例如 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"

效果很好,只需完成不良主机列表......

相关内容