如何为PHP项目配置ModSecurity?

wen PHP项目 2

本文目录导读:

如何为PHP项目配置ModSecurity?

  1. 安装ModSecurity
  2. 基础配置
  3. 安装OWASP核心规则集(CRS)
  4. Apache配置集成
  5. PHP项目特定配置
  6. 性能优化配置
  7. PHP项目白名单配置
  8. 监控和调试
  9. 配置文件示例
  10. 测试和验证
  11. 注意事项

我来详细说明如何为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

注意事项

  1. 测试环境先行:先在测试环境部署,确认无误后再上生产
  2. 渐进式启用:建议先使用DetectionOnly模式
  3. 定期更新规则:保持OWASP CRS规则集更新
  4. 监控误报:定期检查日志,调整规则避免误拦截
  5. 备份配置:修改前备份原始配置

这样配置完成后,ModSecurity就能有效保护你的PHP项目免受常见的Web攻击了。

抱歉,评论功能暂时关闭!