2

我正在使用 mod_security 2.6.3,我希望能够根据规则严重性级别执行 shell 脚本。我正在使用核心规则集 (CRS),它在检测到攻击时将严重性级别设置为 2(表示“严重”)。

只要严重性足够高,我想执行我的脚本。

我尝试使用该SecDefaultAction设置,例如:

SecDefaultAction "phase:2,log,deny,status:403,exec:/path/to/my/script"

但是由于“执行”操作是“非破坏性”操作,因此无论触发关键规则还是非关键规则,它总是会被执行。

我可以检查每个关键SecRule并在其旁边添加“exec”,但这会很乏味(并且重复且丑陋)。

我以为我可以做类似的事情:

SecRule ENV:SEVERITY "@lt 4" "exec:/path/to/my/script"

但不知何故,它永远不会被执行,可能是因为关键规则有一个阻止或拒绝语句来停止规则处理(因为被认为是破坏性的)。

我还尝试使用 CRS 异常评分功能,如下所示:

SecRule TX:ANOMALY_SCORE "@ge 4" "exec:/path/to/my/script"

但它仍然没有得到处理。关于我如何做到这一点的任何想法?

4

1 回答 1

5

您可以使用HIGHEST_SEVERITY变量对其进行测试,例如:

SecRule HIGHEST_SEVERITY "@le 5" "nolog,pass,exec:/path/to/your/script"

请注意nolog,pass将保留来自更改严重级别的规则的原始日志消息的附加参数。

另外,我建议您将此条件放在 .conf 文件的早期(例如,就在您的SecDefaultAction行之后),以确保它包含在所有上下文中。

另一种方法是在您的 SecDefaultAction 中使用自定义 HTTP 响应状态代码(例如,418“我是茶壶”)并在日志记录阶段基于它触发您的条件(一旦默认操作已经处理):

# On error, log then deny request with "418 I'm a teapot":
SecDefaultAction "phase:2,log,deny,status:418"

# On HTTP response status code 418, execute your script:
SecRule RESPONSE_STATUS "^418$" "phase:5,nolog,pass,exec:/path/to/your/script"
于 2012-02-20T20:41:28.433 回答