核心是快速识别、精准归因、分级响应,而非删日志;需结构化采集(含$binary_remote_addr、$time_local等关键字段)、轻量命令实时初筛、fail2ban自动封禁,并将恶意行为沉淀为威胁情报。

处理大规模安全访问违规记录,核心不是“删日志”,而是“快速识别、精准归因、分级响应”。日志量大本身不是问题,问题在于缺乏结构化采集、关键字段缺失、分析路径不闭环。重点落在日志质量、自动化筛选和响应动作的衔接上。
确保日志具备可分析性
没有高质量原始数据,后续所有分析都会失真。必须在 nginx.conf 的 http 块中明确定义日志格式,至少包含以下字段:
- $binary_remote_addr:二进制IP,用于高效聚合(比 $remote_addr 节省空间且兼容 IPv6)
- $time_local:带毫秒精度的时间戳,便于时间窗口统计
-
$request 和 $status:判断是否为扫描路径(如
/wp-admin/)、SQLi/XSS特征(如union select、<script></script>)及异常状态码(403/404/500 高频出现) - $http_user_agent 和 $http_referer:识别扫描器(sqlmap、dirb)、爬虫(Baiduspider 异常行为)、Referer 欺骗等
- $request_length 和 $body_bytes_sent:辅助判断大 payload 攻击或响应泄露
同时启用错误日志级别为 warn 或更高,避免 debug 级别淹没关键信号。
用轻量工具做实时初筛
不依赖重型平台也能快速定位问题。日常可用组合命令快速发现异常模式:
- 查单 IP 分钟级高频请求:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20 - 查高频 404 扫描路径:
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 - 查可疑 User-Agent:
grep -iE "(sqlmap|nmap|gobuster|wget|curl -s)" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c - 查含攻击特征的请求:
grep -E "(union.*select|sleep\(|base64_decode|\.php\?a=)" /var/log/nginx/access.log
这些命令可封装为定时脚本,每5分钟运行一次,只输出超过阈值的结果(如单IP >100次/分钟),避免告警噪音。
自动封禁与联动闭环
发现恶意IP后,不能只靠人工加 deny。推荐两层防御协同:
-
即时限流:用
limit_req对已知高危IP段或全部流量做基础防护,例如limit_req zone=req_per_ip burst=5 nodelay,防住突发扫描流量 -
持久封禁:通过 Fail2Ban 监控 access.log 中特定 pattern(如连续5次403或匹配到 sqlmap 字符串),自动写入
blocksip.conf并重载 Nginx;或更进一步,将恶意IP推送至云防火墙API或本地 iptables -
关键路径隔离:对
/admin、/wp-login.php等敏感路径单独配置日志,并叠加 IP 白名单或二次验证(如 auth_basic),降低误报影响面
长期治理:从日志中沉淀威胁情报
把每次大规模违规记录转化为可复用的安全资产:
- 定期导出高频恶意 UA、扫描路径、攻击 payload 模式,更新到 Nginx 的
if规则或 WAF 规则库 - 将封禁IP按地域、ASN、时间规律聚类,识别攻击团伙特征(如某C段IP集中出现在凌晨2–4点)
- 保留至少90天的压缩归档日志(
gzip+logrotate),支持回溯取证和合规审计 - 对反复出现的IP或UA,加入主动拒绝规则而非仅限流,减少日志污染
不复杂但容易忽略











