侧边栏壁纸
博主头像
CYC的个人博客博主等级

学习使人进步

  • 累计撰写 112 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

modsecurity审计日志优化配置

我是一条酸菜鱼
2026-02-09 / 0 评论 / 0 点赞 / 0 阅读 / 3794 字

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
}

日志清理脚本cleanuplog.sh


#!/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

0

评论区