modsecurity审计日志优化配置
优化日志存储
modsecurity.conf
# =============================
# ModSecurity Audit Log Configuration
# =============================
# 启用审计日志引擎
SecAuditEngine RelevantOnly
# 审计日志存储方式 - concurrent 适合生产环境
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
# 审计日志文件路径
SecAuditLog /var/log/modsecurity/audit.log
# 审计日志分区格式
SecAuditLogParts ABCFHZ
# 审计日志存储类型
SecAuditLogType Concurrent
# 审计日志目录(并发模式必需)
SecAuditLogStorageDir /var/log/modsecurity/
# 最大单个审计日志文件大小 (100MB)
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
# 审计日志权限设置
SecAuditLogPermission 0640
# =============================
# 性能调优配置
# =============================
# 响应体检查限制 (512KB)
SecResponseBodyLimit 524288
# 响应体内存缓冲限制
SecResponseBodyLimitAction ProcessPartial
# 请求体限制 (10MB)
SecRequestBodyLimit 10485760
# 请求体内存缓冲限制
SecRequestBodyInMemoryLimit 131072
# =============================
# 日志格式优化
# =============================
# 自定义审计日志格式
SecAuditLogFormat JSON
# 启用审计日志完整性校验
SecAuditLogStreamLogs On
日志文件每日配置
vim /etc/logrotate.d/modsecurity
# =============================
# ModSecurity 日志轮转配置
# 文件路径: /etc/logrotate.d/modsecurity
# =============================
/var/log/modsecurity/audit.log {
# 每日轮转
daily
# 保存最近7天的日志
rotate 7
# 按大小轮转(100MB)
size 100M
# 压缩旧日志
compress
# 延迟压缩直到下次轮转
delaycompress
# 日志文件不存在时不报错
missingok
# 日志为空时不轮转
notifempty
# 创建新日志文件的权限和属主
create 640 www-data adm
# 共享脚本段
sharedscripts
# 轮转后的执行脚本
postrotate
# 通知Nginx重新打开日志文件
#/data/nginx/sbin/nginx -s reload
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid) > /dev/null 2>&1 || true
fi
endscript
}
# 审计日志目录下的分片文件轮转
/var/log/modsecurity/*/*.log {
# 每周轮转
weekly
# 保存最近4周的日志
rotate 4
# 按大小轮转(50MB)
size 50M
# 压缩旧日志
compress
# 延迟压缩
delaycompress
# 日志文件不存在时不报错
missingok
# 日志为空时不轮转
notifempty
# 删除空日志文件
prerotate
if [ -s "$1" ]; then
exit 0
else
exit 1
fi
endscript
}
#!/bin/bash
# =============================
# ModSecurity 日志清理维护脚本
# =============================
# 设置日志目录
LOG_DIR="/data/yshop-server/modseclog/"
AUDIT_LOG="$LOG_DIR/modsec_audit.log"
# 清理超过30天的旧日志文件
find $LOG_DIR -name "*.log.*" -type f -mtime +30 -delete
# 清理空的日志目录
find $LOG_DIR -mindepth 1 -type d -empty -delete
# 检查磁盘空间使用率
DISK_USAGE=$(df $LOG_DIR | awk 'NR==2 {print $5}' | sed 's/%//')
# 如果磁盘使用率超过85%,删除最旧的日志
if [ $DISK_USAGE -gt 85 ]; then
echo "$(date): Disk usage is ${DISK_USAGE}%, cleaning old logs..." >> /data/yshop-server/modseclog/maintenance.log
# 删除一周前的所有审计日志
find $LOG_DIR -name "modsec_audit.log*" -type f -mtime +7 -delete
fi
# 记录维护日志
echo "$(date): Log maintenance completed. Current disk usage: ${DISK_USAGE}%" >> /data/yshop-server/modseclog/maintenance.log
计划任务执行
# =============================
# ModSecurity 日志维护定时任务
# 添加到 crontab: crontab < cronjob.txt
# =============================
# 每小时执行一次日志清理
0 * * * * /data/modsecurity_audit/modsec_cleanup.sh >/dev/null 2>&1
# 每日凌晨3点重启日志服务
0 3 * * * /data/nginx/appt/sbin/nginx -s reload
# 每周日凌晨2点执行深度清理
0 2 * * 0 /usr/local/bin/modsec_deep_clean.sh >/dev/null 2>&1
# 每分钟检查紧急磁盘空间
* * * * * /usr/local/bin/disk_monitor.sh >/dev/null 2>&1
评论区