从1.8开始,可以使用Apache自定义日志专门记录那些和mod_security有关的请求。这是因为ModSecurity现在只要采取了动作,就定义一个环境变量mod_security-relevant。要使用自定义的日志文件,在配置中添加下边的(或相似的)内容:
CustomLog logs/modsec_custom_log \
"%h
%l %u %t \"%r\" %>s %b %{mod_security-message}i" \
env=mod_security-relevant
如果你希望追溯某个特定的用户或者攻击者的操作步骤的时候,标准的Apache日志用处不大。症结在于只有每个请求的一个很小的子集被记录在日志文件里。这个问题可以用ModSecurity的审计日志功能来补救。这两个指示:
SecAuditEngine On
SecAuditLog logs/audit_log
会通知ModSecurity你想要一个完整的审计日志存放在日志文件audit_log里。下边是一个被记录的请求的例子:
========================================
Request:
192.168.0.2 - - [[
cgi-bin/printenv?p1=666 HTTP/1.0" 406 822
Handler:
cgi-script
----------------------------------------
GET
/cgi-bin/printenv?p1=666 HTTP/1.0
Host: wkx.dyndns.org:8080
User-Agent:
mod_security regression test utility
Connection:
Close
mod_security-message: Access denied with code 406. Pattern
match "666" at ARGS_SELECTIVE.
mod_security-action: 406
HTTP/1.0
406 Not Acceptable
========================================
你可以看到在第一行你可以得到你平常从Apache得到的(记录)。第二行包含假定用来处理请求的处理程序的名字。完整的请求(包括额外的mod_security头信息)出现在分隔符后,响应报头(在这个例子中只有一行)出现在空白行后。当POST过滤打开的时候,POST有效载荷始终会被包含在审计日志里。实际的响应永远不会被包含(至少在这个版本里不会)。
这时,模块的审计日志部分会记录Apache 1.x的错误信息,在Handler:行的下边一行。这行总是以Error:开头。如果可能,这个功能会被添加到这个模块的Apache 2.x版本里。
如果你在Apache的配置中添加了mod_unique_id,mod_security会监测它并使用它产生的环境变量(UNIQUE_ID)。它的值会被写到审计日志里。你可以把这个唯一标识符写在显示给用户的错误页面上,以后用它来跟踪和修复假阳性(false positive,不知道怎么翻译,感觉是作者笔误)。
参数SecAuditEngine接受下列四个值之一:
l
On —— 记录所有请求
l
Offi —— 完全不记录请求
l
RelevantOnly —— 只记录相关请求,相关请求是那些会能匹配过滤器的请求
l
DynamicOrRelevant —— 记录动态生成的或者相关的请求。如果一个请求的处理机(handler)不是null,那么它是动态的。
让ModSecurity记录动态请求有时候需要一些工作,视你的配置而定。在Apache的理论中,对请求的响应是由所谓的处理机(handler)来生成的。如果一个请求附加了处理机,那么它被看作是动态的。当时,实际情况中,Apache可以被配置来提供没有处理机的动态页面(Apache会基于资源的MIME类型来选择模块)。例如,如果你在主分发版内(?)如下介绍的配置PHP,上述情况就会发生:
AddType application/x-httpd-php .php
虽然这样也能工作,它并不是完全正确的。但是如果你用下列内容替换上边的那行:
AddHandler application/x-httpd-php .php
PHP也会工作,Apache将有一个分配给这类请求的处理机,而且审计日志记录器可以能够选择性的记录日志。