我在运行WordPress网站的Ubuntu 14.04 Apache 2.4.7上安装了mod_security。我有一些我需要忽略的规则,但是我在实施一些通配符规则时遇到了麻烦,因此我不必指定每一页......
我拥有的(在我的site.conf文件中)是......
<LocationMatch "/wp-admin/post.php">
SecRuleRemoveById 300016
</LocationMatch>
<LocationMatch "/wp-admin/nav-menus.php">
SecRuleRemoveById 300016
</LocationMatch>
<LocationMatch "(/wp-admin/|/wp-login.php)">
SecRuleRemoveById 950117
SecRuleRemoveById 950005
SecRuleRemovebyID 981173
SecRuleRemovebyId 960024
</LocationMatch>
<LocationMatch "/wp-admin/load-scripts.php">
SecRuleRemoveById 981173
</LocationMatch>
<LocationMatch "/wp-admin/plugins.php">
SecRuleRemoveById 981173
</LocationMatch>
<LocationMatch "/wp-admin/customize.php">
SecRuleRemoveById 981173
</LocationMatch>
我想要的是将所有内容合并到一个使用wp-admin
和wp-login
上的通配符的规则中。
我尝试了以下内容,但似乎被忽略了,因为mod_security正在拒绝..
<LocationMatch "(/wp-admin/*|/wp-login/*)">
....
以及
<LocationMatch "(/wp-admin/*)">
....
以及
<Location "/wp-admin/*">
....
我已经对LocationMatch和regex做了一些研究,但我没有在这里得到一些东西。我正在减少做什么?
编辑:
modsec_audit.log中的引荐来源网址为http://www.<site>.com/wp-admin/customize.php?theme=modality
答案 0 :(得分:3)
虽然Carsten的回答是正确的,但应该注意位置和位置指令在第1阶段ModSecurity规则之后运行。然而,看起来你的规则无论如何都是第二阶段,所以在这种情况下这并不特别重要 - 尽管我无法访问规则300016,因此无法100%确定。
无论如何,出于这个原因,我不喜欢使用Location和LocationMatch,并且个人更喜欢在ModSecurity中使用新规则进行位置过滤:
SecRule REQUEST_URI "@beginsWith /wp-(admin|login)/" \
"phase:2,id:1000,nolog,pass,ctl:ruleRemoveById=300016,\
ctl:ruleRemoveById=950117,\
ctl:ruleRemoveById=950005
...etc.
这样我可以在规则过滤中保持一致(而不是使用上面的规则过滤第1阶段规则,以及通过位置匹配过滤的其他规则)。但是,每个阶段都需要一个规则。无论如何,正如我所说,如果所有这些都是目前的第2阶段或更高规则,那并不重要。
另一个有趣值得记住的是,如果您使用SecRuleRemoveById,则需要在>> 之后指定要移除的规则,而如果使用ctl:ruleRemoveById,则需要在之前指定 / strong>你要删除的规则。
然而,大多数Wordpress攻击都会针对这些URL。因此,您希望非常确保您不需要这些规则。通过转向更通用的例外情况,您可以将每个规则与超出需要的规则进行匹配。例如,如果从您的原始设置看起来如此,/ wp-login.php只需要其中4个例外,但您将移动它们全部。
我建议不要放松规则以匹配更多规则,而应该让它们保持紧密,不进行此更改。
实际上你可以进一步收紧它们,只匹配导致需要异常的某些参数。例如,如果只有用户名字段导致您出现问题,那么您可以收紧规则:
<LocationMatch "(/wp-admin/|/wp-login.php)">
SecRuleUpdateTargetById 950117 !ARGS:'username'
SecRuleUpdateTargetById 950005 !ARGS:'username'
SecRuleUpdateTargetById 981173 !ARGS:'username'
SecRuleUpdateTargetById 960024 !ARGS:'username'
</LocationMatch>
或其他格式:
SecRule REQUEST_URI "@beginsWith /wp-(admin|login)/" \
"phase:2,id:1000,nolog,pass,\
ctl:ruleRemoveTargetById=950117;ARGS:username,\
ctl:ruleRemoveTargetById=950005;ARGS:username,\
ctl:ruleRemoveTargetById=981173;ARGS:username,\
ctl:ruleRemoveTargetById=960024;ARGS:username
是的,这可能意味着额外的工作,而且我知道你来到这里是为了巩固你的规则以使这个更容易,但是如果你最终禁用了很多规则,那么运行类似ModSecurity的WAF就没什么意义了。旨在防止和不幸的是,Wordpress是许多坏人的积极目标,部分原因在于它的受欢迎程度。
所以,虽然我没有直接回答你的问题,但我希望它有用,让你有所思考。
答案 1 :(得分:2)
这应该有效:
<LocationMatch "/wp-(admin|login)/">
这里不需要通配符,因为你只想检测路径的开头而且无关紧要,第二次斜线之后会出现什么。
对于Location
,您需要~
来触发正则表达式解释:
<Location ~ "/wp-(admin|login)/">
更多详情: