本文目录导读:

我来详细说明如何为PHP项目配置ModSecurity。
安装ModSecurity
在Ubuntu/Debian上安装
# 安装依赖 sudo apt update sudo apt install -y libapache2-mod-security2 # 启用模块 sudo a2enmod security2 sudo systemctl restart apache2
在CentOS/RHEL上安装
# 安装EPEL仓库 sudo yum install epel-release sudo yum install -y mod_security # 对于Nginx用户 sudo yum install -y nginx-mod-security
基础配置
复制默认配置文件
# 复制推荐配置 sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf # 设置权限 sudo chmod 644 /etc/modsecurity/modsecurity.conf
主要配置项
# 在modsecurity.conf中设置 SecRuleEngine On # 启用规则引擎 SecRequestBodyAccess On # 允许检查请求体 SecResponseBodyAccess On # 允许检查响应体 SecAuditEngine RelevantOnly # 审计日志模式 SecAuditLog /var/log/modsec_audit.log # 审计日志路径
安装OWASP核心规则集(CRS)
# 下载OWASP CRS cd /usr/share/modsecurity-crs sudo git clone https://github.com/coreruleset/coreruleset.git # 复制配置文件 sudo cp crs-setup.conf.example crs-setup.conf # 在Apache配置中包含规则 sudo nano /etc/apache2/mods-available/security2.conf
Apache配置集成
# /etc/apache2/mods-available/security2.conf
<IfModule security2_module>
# 基础配置
Include /etc/modsecurity/modsecurity.conf
# 加载OWASP CRS
IncludeOptional /usr/share/modsecurity-crs/coreruleset/crs-setup.conf
IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/*.conf
</IfModule>
PHP项目特定配置
创建自定义规则文件
# 创建PHP项目规则文件 sudo nano /etc/modsecurity/rules/php_rules.conf
# PHP特定安全规则
# 阻止PHP文件上传
SecRule REQUEST_FILENAME "\.php$" "phase:2,id:1001,deny,msg:'阻止PHP文件上传'"
# 限制文件上传大小
SecRequestBodyLimit 10485760 # 10MB
SecRequestBodyNoFilesLimit 131072 # 128KB
# 防止PHP注入
SecRule ARGS "@rx (base64_encode|eval\(|system\(|exec\(|passthru\()" \
"id:1002,phase:2,deny,status:403,msg:'检测到潜在PHP注入'"
# 保护特定PHP文件
SecRule REQUEST_FILENAME "/wp-admin/" "id:1003,phase:1,deny,status:403,msg:'阻止后台访问'"
性能优化配置
# 性能优化设置 SecRuleEngine DetectionOnly # 仅检测不阻止(测试阶段) SecUnicodeMapFile /usr/share/modsecurity/unicode.mapping SecAuditLogParts ABIJDEFHZ # 减少日志内容 SecDefaultAction "phase:2,log,auditlog,pass" # 默认允许 # 排除静态文件检查 SecRule REQUEST_URI "\.(jpg|jpeg|png|gif|css|js)$" "phase:1,id:2001,t:lowercase,pass,nolog"
PHP项目白名单配置
# 为特定PHP路径设置白名单
<LocationMatch "/api/v1/">
SecRuleEngine Off
</LocationMatch>
# 或针对特定请求方法
SecRule REQUEST_METHOD "^(GET|HEAD)$" "phase:1,id:3001,t:lowercase,pass,nolog"
# 针对特定IP白名单
SecRule REMOTE_ADDR "@ipMatch 192.168.1.0/24" "phase:1,id:3002,pass,nolog"
监控和调试
查看ModSecurity日志
# 审计日志 sudo tail -f /var/log/modsec_audit.log # Apache错误日志 sudo tail -f /var/log/apache2/error.log # 调试模式(临时开启) SecDebugLog /var/log/modsec_debug.log SecDebugLogLevel 9
使用PHP测试规则
<?php
// 测试ModSecurity是否生效
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 测试SQL注入检测
$test_sql = "SELECT * FROM users WHERE id = 1 OR 1=1";
echo "SQL注入测试: " . $test_sql;
// 测试XSS检测
$test_xss = "<script>alert('XSS')</script>";
echo "XSS测试: " . $test_xss;
?>
配置文件示例
完整的PHP项目配置
# /etc/modsecurity/php_project.conf SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On # 基础安全规则 Include /usr/share/modsecurity-crs/coreruleset/crs-setup.conf Include /usr/share/modsecurity-crs/coreruleset/rules/*.conf # PHP自定义规则 Include /etc/modsecurity/rules/php_rules.conf # 性能优化 SecRequestBodyLimit 10485760 SecResponseBodyLimit 20971520 # 日志配置 SecAuditEngine RelevantOnly SecAuditLog /var/log/modsec_audit.log SecAuditLogType Serial SecAuditLogStorageDir /var/log/modsecurity/audit/
测试和验证
# 重启Apache
sudo systemctl restart apache2
# 测试规则是否生效
curl -X POST http://localhost/test.php -d "test=<script>alert('xss')</script>"
# 查看响应状态
curl -I http://localhost/test.php
# 检查ModSecurity状态
sudo apachectl -M | grep security
注意事项
- 测试环境先行:先在测试环境部署,确认无误后再上生产
- 渐进式启用:建议先使用
DetectionOnly模式 - 定期更新规则:保持OWASP CRS规则集更新
- 监控误报:定期检查日志,调整规则避免误拦截
- 备份配置:修改前备份原始配置
这样配置完成后,ModSecurity就能有效保护你的PHP项目免受常见的Web攻击了。