nginx 不内置自动安全审计功能,需通过外部工具链实现闭环:合规日志输出→logrotate 日切割归档→定时审计脚本解析昨日压缩日志并告警。

Nginx 本身不内置“自动安全审计脚本”功能,它只负责生成日志。真正的自动化安全审计必须靠外部工具链配合 Nginx 的合规日志输出来实现。关键不是在 nginx.conf 里写脚本,而是构建一个“可触发、可验证、可留存”的闭环流程:Nginx 输出合规日志 → logrotate 按日切割归档 → 审计脚本定时读取当日压缩日志 → 执行规则匹配与告警 → 结果落库或通知。
下面分三块讲清楚怎么做,每块都直击生产落地痛点:
日志输出必须先满足审计前提
没有合规日志,审计就是空中楼阁。等保三级要求的字段缺一不可,不能只改 log_format,要联动四件事:
- 用
$realip_remote_addr替代$remote_addr,并在http块启用real_ip模块,指定可信代理网段(如set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; real_ip_recursive on;) - 日志格式中强制包含:
$realip_remote_addr $time_iso8601 $request_uri $request_method $status $body_bytes_sent $request_time $upstream_response_time $http_referer $http_user_agent $upstream_addr - 敏感参数脱敏用
map指令前置清洗,例如:map $args $clean_args { default $args; "~*token=[^&]*" ""; "~*password=[^&]*" ""; } log_format audit '$realip_remote_addr [$time_iso8601] "$request_method $clean_args ..." ...';
日志切割必须支持审计追溯
每天一份独立、带时间戳、权限受控的日志是审计基础:
- 在
/etc/logrotate.d/nginx中配置:/var/log/nginx/access.log { daily dateext dateformat -%Y%m%d rotate 365 compress delaycompress missingok notifempty create 0640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) endscript } - 关键点:
dateext + dateformat确保文件名形如access.log-20260729;create 0640 nginx adm防未授权读取;delaycompress让当日日志保持明文便于审计脚本直接解析。
审计脚本要能跑在切割后第一时间
别用 cron 直接扫 access.log——那是正在写的活跃文件。应监听归档完成事件或定时扫昨日压缩包:
-
示例脚本
audit_daily.sh(放在/opt/nginx-audit/):#!/bin/bash YESTERDAY=$(date -d "yesterday" +%Y%m%d) LOG_FILE="/var/log/nginx/access.log-$YESTERDAY.gz" if [ -f "$LOG_FILE" ]; then zcat "$LOG_FILE" | \ awk -F' ' '{print $1,$4,$5,$6,$7,$9,$10,$11}' | \ grep -E "(SELECT.*UNION|\.\/\.|eval\(|passwd:)" > /var/log/nginx/audit-alerts-$YESTERDAY.log 2>/dev/null # 可替换为 teler、goaccess 或自定义 Python 脚本做深度检测 [ -s "/var/log/nginx/audit-alerts-$YESTERDAY.log" ] && \ echo "ALERT: $(wc -l 加入 crontab:
0 2 * * * /opt/nginx-audit/audit_daily.sh(凌晨2点执行,避开业务高峰且确保昨日日志已归档完成)
不复杂但容易忽略的是:审计脚本必须和 logrotate 的 postrotate 错开时间,否则可能读到未完全写入的压缩包;所有路径、权限、用户组都要提前验证,避免因 nginx 用户无权读 /var/log/nginx/ 下归档文件而静默失败。











