ModSecurity
ModSecurity 是一个 Web 应用防火墙(WAF)引擎,根据规则集检查 HTTP 请求和响应。OLS 内置 ModSecurity v3(libmodsecurity)支持,无需单独安装模块。
启用 ModSecurity
Section titled “启用 ModSecurity”通过 WebAdmin 界面
Section titled “通过 WebAdmin 界面”- 导航至 服务器配置 > 安全 > WAF
- 将 启用 ModSecurity 设为
Yes - 保存并重启 OLS
通过配置文件
Section titled “通过配置文件”在 httpd_config.conf 中:
module mod_security { ls_enabled 1 modsecurity on modsecurity_rules ` SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess Off SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 ` modsecurity_rules_file /usr/local/lsws/conf/modsec/main.conf}安装 OWASP Core Rule Set (CRS)
Section titled “安装 OWASP Core Rule Set (CRS)”OWASP CRS 提供了一套全面的规则集,可防御常见的 Web 攻击。
cd /usr/local/lsws/confmkdir -p modseccd modsec
# 下载 CRSgit clone https://github.com/coreruleset/coreruleset.gitcd corerulesetcp crs-setup.conf.example crs-setup.conf创建主配置文件
Section titled “创建主配置文件”创建 /usr/local/lsws/conf/modsec/main.conf:
# ModSecurity 推荐配置SecRuleEngine OnSecRequestBodyAccess OnSecRequestBodyLimit 13107200SecRequestBodyNoFilesLimit 131072SecRequestBodyLimitAction RejectSecResponseBodyAccess Off
# 临时文件SecTmpDir /tmpSecDataDir /tmp
# 审计日志SecAuditEngine RelevantOnlySecAuditLogRelevantStatus "^(?:5|4(?!04))"SecAuditLogParts ABIJDEFHZSecAuditLogType SerialSecAuditLog /usr/local/lsws/logs/modsec_audit.log
# 调试日志(生产环境中禁用)# SecDebugLog /usr/local/lsws/logs/modsec_debug.log# SecDebugLogLevel 0
# 加载 OWASP CRSInclude /usr/local/lsws/conf/modsec/coreruleset/crs-setup.confInclude /usr/local/lsws/conf/modsec/coreruleset/rules/*.conf重启 OLS:
systemctl restart lswsCRS 配置调优
Section titled “CRS 配置调优”编辑 crs-setup.conf 调整偏执等级和排除规则:
# 等级 1:基础保护(默认,误报率低)# 等级 2:中等保护(推荐大多数站点使用)# 等级 3:严格保护# 等级 4:最大保护(误报率高)SecAction "id:900000,phase:1,pass,t:none,nolog,\ setvar:tx.paranoia_level=2"异常评分阈值
Section titled “异常评分阈值”# 越低越严格(默认入站:5,出站:4)SecAction "id:900110,phase:1,pass,t:none,nolog,\ setvar:tx.inbound_anomaly_score_threshold=5,\ setvar:tx.outbound_anomaly_score_threshold=4"误报很常见,尤其是在 CMS 应用中。应创建排除规则,而不是完全禁用 ModSecurity。
创建 /usr/local/lsws/conf/modsec/exclusions.conf:
# WordPress 管理后台 AJAXSecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \ "id:1001,phase:1,pass,nolog,\ ctl:ruleRemoveById=941100-941999"
# WordPress 文章编辑器SecRule REQUEST_URI "@beginsWith /wp-admin/post.php" \ "id:1002,phase:1,pass,nolog,\ ctl:ruleRemoveById=942100-942999"
# WordPress 上传SecRule REQUEST_URI "@beginsWith /wp-admin/async-upload.php" \ "id:1003,phase:1,pass,nolog,\ ctl:ruleRemoveById=921110-921999"在 main.conf 中 CRS 规则之后引入该文件:
Include /usr/local/lsws/conf/modsec/exclusions.conf全局禁用特定规则
Section titled “全局禁用特定规则”SecRuleRemoveById 920350按虚拟主机配置 ModSecurity
Section titled “按虚拟主机配置 ModSecurity”可以为每个虚拟主机单独启用或禁用 ModSecurity:
virtualhost example { ... module mod_security { modsecurity on modsecurity_rules `SecRuleEngine On` }}为特定虚拟主机禁用:
virtualhost staging { ... module mod_security { modsecurity off }}审计日志记录所有触发规则的请求:
tail -f /usr/local/lsws/logs/modsec_audit.log搜索被阻止的请求:
grep "ModSecurity: Access denied" /usr/local/lsws/logs/error.log每条日志记录包含规则 ID,可用于创建有针对性的排除规则。
添加到 /etc/logrotate.d/modsecurity:
/usr/local/lsws/logs/modsec_audit.log { daily rotate 14 compress missingok notifempty postrotate systemctl reload lsws endscript}ModSecurity 阻止了合法请求:
- 检查审计日志中的规则 ID
- 添加有针对性的排除规则,而不是禁用 ModSecurity
- 如果误报过多,降低偏执等级
性能影响:
- 将
SecResponseBodyAccess设为Off,除非需要检查响应体 - 将
SecRequestBodyLimit限制为合理大小 - 初始部署阶段使用
SecRuleEngine DetectionOnly仅记录不阻止
启用 ModSecurity 后 OLS 无法启动:
- 检查规则文件是否有语法错误:查看
/usr/local/lsws/logs/error.log - 验证
Include指令中 CRS 的安装路径