我想添加一个可以阻止所有用户代理的自定义ModSecurity (V3)规则,并允许我从文件中将某些用户代理列入白名单。
如果可能的话,如果有人能和我分享这个规则,那就太好了。我似乎想不出做这件事的规则。
谢谢!
你这样做有点危险,但我尽量给你一些帮助。
我认为CRS规则913100对你来说是一个很好的起点。
如果你不熟悉ModSecurity任何SecLang,这有点复杂,所以简而言之,这是一个可能的解决方案。为WAF创建一个规则,如下所示:
SecRule REQUEST_HEADERS:User-Agent "!@pmFromFile allowed-user-agents.data"
"id:9013100,
phase:1,
deny,
t:none,
msg:'Found User-Agent associated with security scanner',
logdata:'Matched Data: illegal UA found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}'"
请注意,您可以为您的规则选择任何您想要的id
,但是有一个id的预订列表:
https://coreruleset.org/docs/rules/ruleid/id-reservations
强烈建议您选择一个正确的规则,以避免与其他规则冲突。9013100是一个不错的选择,它表示该规则是从哪里派生的。
然后,您必须创建一个包含允许的用户代理列表的文件。注意,您必须将该列表放在规则配置文件存在的同一目录中。文件名必须是(如上所示)allowed-user-agents.data
。你可以在每条线上安排一个代理。你也可以在规则的开头使用带有#
的注释-只需查看CRS的数据文件。
这个规则是如何工作的?
SecRule
是一个令牌,它告诉引擎这是一个规则。REQUEST_HEADERS
是一个集合(一个特殊变量),引擎从HTTP请求展开。名称后面的:
表示您只想调查提到的头,即User-Agent
。
下一个块是操作符。正如文档所说,@pmFromFile ">对所提供的短语对所需的输入值执行不区分大小写的匹配。"这正是你所需要的。操作符前面有一个!
符号。这将反转操作符的行为,因此如果User-Agent不在文件中,它将为TRUE。
下一部分是操作列表。id
是必填项,用于标识规则。phase:1
是可选的,但非常建议放置一个。有关更多信息,请参阅参考资料。deny
是一个中断操作,它立即终止请求。msg
将在每种情况下向日志追加一条消息。logdata
将显示有关规则结果的详细信息。
为什么这有点危险
您可以在@pmFromFile
操作符的文档中看到,它使用模式。这意味着您不必放置确切的User-Agent名称,只需放置一个模式就足够了,比如"curl"或"mozilla"-但要小心,错误的模式可能导致假阳性结果,这意味着-在这种情况下-攻击者可以绕过你的规则:放置模式来欺骗它就足够了。
考虑将模式my-user-agent
放入数据文件。现在,如果有人只是使用这个模式作为User-Agent,规则将不匹配。
通常情况下,以这种方式处理白名单(在某些特殊的上下文中,比如这里)是危险的,因为很容易绕过它们。