全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

日志审计与安全监控

NGINX 日志是检测攻击、分析异常行为的第一手资料。合理配置日志格式和监控策略,可实现快速响应和溯源。

日志格式配置

自定义安全日志格式

nginx
log_format security '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '$request_time $upstream_response_time '
                    '$ssl_protocol $ssl_cipher';

分离访问日志和错误日志

nginx
http {
    access_log /var/log/nginx/access.log security;
    error_log  /var/log/nginx/error.log warn;
}

错误日志级别可选:debuginfonoticewarnerrorcritalertemerg。生产环境建议 warnerror

安全事件条件日志

记录可疑请求

nginx
map $status $log_security {
    default 0;
    ~^[45] 1;  # 4xx/5xx 错误
}

server {
    access_log /var/log/nginx/access.log;
    access_log /var/log/nginx/security.log security if=$log_security;
}

map 指令配合 if= 参数实现条件日志,仅记录异常请求,减少正常流量干扰。

记录特定路径访问

nginx
map $request_uri $log_sensitive {
    default     0;
    ~*/admin/   1;
    ~*/login    1;
    ~*/api/key  1;
}

server {
    access_log /var/log/nginx/sensitive_access.log security if=$log_sensitive;
}

攻击特征检测

SQL 注入尝试

nginx
# 在日志中包含请求参数便于审计
log_format detailed '$remote_addr - [$time_local] "$request" $status '
                    'args=$args query_string=$query_string';

外部通过日志分析工具检测:

Bash
# 检测 SQL 注入尝试
grep -iE "union.*select|or.*1=1|drop.*table" /var/log/nginx/access.log

# 检测 XSS 尝试
grep -iE "<script|javascript:|onerror=" /var/log/nginx/access.log

路径遍历检测

Bash
# 检测目录穿越
grep -E "\.\./|\.\.\\" /var/log/nginx/access.log

日志轮转

logrotate 配置

ini
/var/log/nginx/*.log {
    daily
    rotate 90
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

USR1 信号通知 NGINX 重新打开日志文件,配合 logrotate 实现无缝切割。

实时监控集成

Fail2ban 集成

nginx
# /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600

[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 7200

ELK Stack 日志聚合

text
# 输出 JSON 格式日志便于 Logstash 解析
log_format json escape=json '{'
    '"time":"$time_iso8601",'
    '"remote_addr":"$remote_addr",'
    '"request":"$request",'
    '"status":$status,'
    '"body_bytes_sent":$body_bytes_sent,'
    '"user_agent":"$http_user_agent"'
'}';

access_log /var/log/nginx/access.json.log json;

要点总结

  • 自定义 log_format 记录安全相关字段(SSL协议、响应时间等)
  • 使用 map + if= 实现条件日志,仅记录异常请求
  • 分离敏感路径日志,便于审计特定区域
  • 配置 logrotate 实现日志轮转,防止磁盘占满
  • 集成 Fail2ban 实现自动封禁恶意 IP
  • 输出 JSON 格式日志便于 ELK 等日志聚合系统解析

📝 发现内容有误?点击此处直接编辑

← 上一篇 反向代理与负载均衡安全
下一篇 → 禁止目录浏览与敏感文件保护
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库