ModSecurity基础规则配置详解
规则引擎初始化
ModSecurity的核心功能是通过规则引擎实现的。在基础配置中,我们首先看到的是规则引擎的初始化设置:
SecRuleEngine DetectionOnly
这个配置将ModSecurity设置为仅检测模式(DetectionOnly),这意味着它会检测潜在的攻击但不会实际阻止请求。这种设置非常适合初次部署阶段,因为它可以让你评估规则的效果而不会意外阻止合法流量。在生产环境中,当确认规则不会产生误报后,可以将其改为"On"以启用完全防护。
请求体处理配置
现代Web应用经常通过POST请求发送数据,因此正确处理请求体至关重要:
SecRequestBodyAccess On
这个指令允许ModSecurity访问请求体内容。如果不启用,ModSecurity将无法检查POST参数,这会留下严重的安全漏洞。
内容类型处理器
ModSecurity支持多种内容类型的解析:
# XML处理器
SecRule REQUEST_HEADERS:Content-Type "text/xml" \
"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
# JSON处理器
SecRule REQUEST_HEADERS:Content-Type "application/json" \
"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
这些规则会根据Content-Type头部自动选择适当的解析器。值得注意的是,它们使用了转换函数(t:lowercase)来确保大小写不敏感匹配。
请求体大小限制
SecRequestBodyLimitAction Reject
这个配置决定了当请求体超过限制时的行为。"Reject"表示直接拒绝请求,但在DetectionOnly模式下会自动改为"ProcessPartial"以减少对正常流量的干扰。
错误处理
SecRule REQBODY_ERROR "!@eq 0" \
"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"
这条规则会捕获所有请求体解析错误,并返回400错误。%{reqbody_error_msg}变量包含了具体的错误信息,对于调试非常有用。
多部分表单严格验证
SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
"id:'200003',phase:2,t:none,log,deny,status:400, \
msg:'Multipart request body failed strict validation..."
这条规则对multipart/form-data请求进行严格验证,检查各种可能的格式问题。虽然严格,但这是防止文件上传相关攻击的重要措施。
响应体处理配置
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml
SecResponseBodyLimit 524288
SecResponseBodyLimitAction ProcessPartial
这些配置允许ModSecurity检查响应体,这对于检测数据泄露非常有用。我们只检查文本内容类型(如HTML、XML),避免处理图片等二进制文件。524288字节(512KB)的限制可以防止内存过度使用。
文件系统配置
SecTmpDir /tmp/
SecDataDir /tmp/
这些设置指定了ModSecurity临时文件和数据文件的存储位置。在生产环境中,应该将这些目录设置为只有ModSecurity可以访问的专用目录,而不是共享的/tmp目录。
审计日志配置
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
SecAuditLog /var/log/modsec_audit.log
审计日志是ModSecurity的重要功能。这里配置为只记录相关事件(RelevantOnly)和5xx/4xx(除404外)状态码的请求。ABIJDEFHZ表示记录所有标准审计日志部分。Serial类型将所有日志写入单个文件,便于查看。
其他重要配置
SecArgumentSeparator &
SecCookieFormat 0
SecUnicodeMapFile unicode.mapping 20127
SecStatusEngine On
这些配置包括:
- 参数分隔符(默认为&)
- Cookie格式(版本0)
- Unicode映射文件(用于正确处理非ASCII字符)
- 状态引擎(用于收集版本信息)
性能调优
SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000
这些PCRE(Perl兼容正则表达式)限制可以防止正则表达式导致的拒绝服务攻击。适当的限制可以在安全性和性能之间取得平衡。
总结
这份基础规则配置文件展示了ModSecurity的核心配置选项。从规则引擎的初始化到请求/响应处理,再到日志记录和性能调优,每个部分都针对Web应用安全的关键方面进行了配置。理解这些基础配置是构建更复杂安全策略的第一步。在实际部署中,应该根据具体应用需求调整这些设置,并逐步添加针对特定威胁的防护规则。