如何将 ModSecurity 引擎配置为对单一攻击类型为 ON,对所有其他攻击类型为 DetectionOnly?
How do I configure the ModSecurity engine to be ON for a single attack type and DetectionOnly for all others?
我需要逐步实施 ModSecurity。它必须配置为仅阻止单一攻击类型(例如 SQLi)的攻击,但记录来自其他攻击类型的所有其他攻击。
为便于升级owasp规则,建议避免修改原有的owasp规则。理想情况下,我正在寻找一个将遵循此指南并且不需要修改原始 owasp 规则的解决方案。
目前我的测试配置只完成了一部分。通过这个 Debian 安装的 ModSecurity,我从配置的 /usr/share/modsecurity-crs/rules/*.conf 中删除了单个规则文件。这允许我启用 modSecurity 和 engine=on 并且仅针对配置中加载的特定攻击类型的规则集,但它不记录其他攻击类型的事件。
您有几个选择:
1) 使用异常评分和 OWASP CRS 为 SQLi 规则设置的 sql_injection_score
值。
- 将您的模式设置为 DetectionOnly。
- 在
中将您的异常评分值设置得非常高
- 添加一个新规则,如果
sql_injection_score
超过一定数量就会阻止。
这可以通过这样的额外规则来实现:
SecRule tx.sql_injection_score "@gt 1”
"id:9999,\
phase:5,\
ctl:ruleEngine=on \
block"
将 ”@gt 1”
设置为适当的阈值。
OWASP CRS 也为其他类别设置了类似的变量。
2) 单独加载规则和前后规则以打开和关闭规则引擎。
在一个阶段内,规则按照指定的顺序执行。您可以使用它来进行如下配置:
SecRuleEngine DetectionOnly
Include rules/other_rules_1.conf
Include rules/other_rules_2.conf
SecAction “id:9000, phase:2, ctl: ctl:ruleEngine=on”
Include rules/sqli_rules.conf
SecAction “id:9001, phase:2, ctl: ctl:ruleEngine=off”
Include rules/other_rules_3.conf
Include rules/other_rules_4.conf
但是,如果一个类别包含多个阶段,那么您将需要添加多个 SecActions - 每个使用的阶段一个。
3) 通过更改操作以包括打开规则引擎来激活您想要的规则。
- 将您的模式设置为 DetectionOnly。
- 使用SecRuleUpdateActionById to add a ctl:ruleEngine=on to the rules you want on. It would be nice if there was a SecRuleUpdateActionByTag or SecRuleAddActionByTag but there isn’t (though it has been asked for in the past).
这可能有点脆弱,因为它取决于对特定规则 ID 的了解,并且还需要检查每个规则的操作或假设它们都是相同的。老实说,只编辑 CRS 文件可能更好。
如果您只想启用一组规则而不是整个类别,这可能是最好的选择。
4) 编辑文件,直接和上面一样做。
如果您知道这将是一个短期选项并且最终您希望启用所有规则,那么这不是一个坏选项。准备就绪后还原文件。
或者保留原始规则并复制规则,给它们新的 ID,并添加 ctl:ruleEngine=on
操作。
我需要逐步实施 ModSecurity。它必须配置为仅阻止单一攻击类型(例如 SQLi)的攻击,但记录来自其他攻击类型的所有其他攻击。
为便于升级owasp规则,建议避免修改原有的owasp规则。理想情况下,我正在寻找一个将遵循此指南并且不需要修改原始 owasp 规则的解决方案。
目前我的测试配置只完成了一部分。通过这个 Debian 安装的 ModSecurity,我从配置的 /usr/share/modsecurity-crs/rules/*.conf 中删除了单个规则文件。这允许我启用 modSecurity 和 engine=on 并且仅针对配置中加载的特定攻击类型的规则集,但它不记录其他攻击类型的事件。
您有几个选择:
1) 使用异常评分和 OWASP CRS 为 SQLi 规则设置的 sql_injection_score
值。
- 将您的模式设置为 DetectionOnly。
- 在 中将您的异常评分值设置得非常高
- 添加一个新规则,如果
sql_injection_score
超过一定数量就会阻止。
这可以通过这样的额外规则来实现:
SecRule tx.sql_injection_score "@gt 1”
"id:9999,\
phase:5,\
ctl:ruleEngine=on \
block"
将 ”@gt 1”
设置为适当的阈值。
OWASP CRS 也为其他类别设置了类似的变量。
2) 单独加载规则和前后规则以打开和关闭规则引擎。
在一个阶段内,规则按照指定的顺序执行。您可以使用它来进行如下配置:
SecRuleEngine DetectionOnly
Include rules/other_rules_1.conf
Include rules/other_rules_2.conf
SecAction “id:9000, phase:2, ctl: ctl:ruleEngine=on”
Include rules/sqli_rules.conf
SecAction “id:9001, phase:2, ctl: ctl:ruleEngine=off”
Include rules/other_rules_3.conf
Include rules/other_rules_4.conf
但是,如果一个类别包含多个阶段,那么您将需要添加多个 SecActions - 每个使用的阶段一个。
3) 通过更改操作以包括打开规则引擎来激活您想要的规则。
- 将您的模式设置为 DetectionOnly。
- 使用SecRuleUpdateActionById to add a ctl:ruleEngine=on to the rules you want on. It would be nice if there was a SecRuleUpdateActionByTag or SecRuleAddActionByTag but there isn’t (though it has been asked for in the past).
这可能有点脆弱,因为它取决于对特定规则 ID 的了解,并且还需要检查每个规则的操作或假设它们都是相同的。老实说,只编辑 CRS 文件可能更好。
如果您只想启用一组规则而不是整个类别,这可能是最好的选择。
4) 编辑文件,直接和上面一样做。
如果您知道这将是一个短期选项并且最终您希望启用所有规则,那么这不是一个坏选项。准备就绪后还原文件。
或者保留原始规则并复制规则,给它们新的 ID,并添加 ctl:ruleEngine=on
操作。