1. 为什么需要日志审计?
想象你开了一家24小时营业的网红餐厅,每天都有大量客人进出。想要知道哪些时段最繁忙、哪些菜品最受欢迎、有没有可疑人物出入,你会怎么做?答案很简单——查看监控录像和点餐记录。在Web服务器领域,Nginx的日志就是你的"监控系统"和"点餐记录本"。
2. 基础配置三步走
2.1 配置日志格式
# /etc/nginx/nginx.conf 主配置文件
http {
log_format audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'urt="$upstream_response_time"';
# 扩展字段示例(需要安装realip模块)
set_real_ip_from 192.168.1.0/24;
real_ip_header X-Forwarded-For;
log_format enhanced '$remote_addr ($http_x_real_ip) - $remote_user [...]';
}
$request_time
:记录请求处理总耗时upstream_*
:记录反向代理各阶段时间real_ip
设置解决代理服务器场景下的真实IP获取
2.2 启用访问日志
server {
access_log /var/log/nginx/access.log audit;
error_log /var/log/nginx/error.log warn;
# 按虚拟主机分离日志
access_log /var/log/nginx/shop.example.com.access.log audit;
# 条件日志示例:记录慢请求
map $request_time $is_slow {
default 0;
~^[5-9]. 1; # 5秒以上
~^[1-9][0-9]+ 1; # 10秒+
}
access_log /var/log/nginx/slow.log audit if=$is_slow;
}
2.3 错误日志分级
# 错误级别说明:
# debug | info | notice | warn | error | crit | alert | emerg
error_log /var/log/nginx/error.log notice;
# 调试特定IP的错误日志
events {
debug_connection 192.168.1.100;
}
3. 高级审计技巧
3.1 日志切割策略
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/bin/systemctl reload nginx >/dev/null 2>&1 || true
endscript
}
rotate 30
:保留30天日志compress
:启用gzip压缩历史日志delaycompress
:延迟压缩当前日志
3.2 实时监控方案
# 实时监控错误日志
tail -f /var/log/nginx/error.log | grep --line-buffered 'error'
# 使用GoAccess生成实时仪表盘
goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --port=7890
4. 关联技术整合
4.1 ELK日志分析系统
# filebeat.yml 配置示例
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
fields:
type: "nginx"
output.elasticsearch:
hosts: ["http://es-server:9200"]
4.2 Prometheus监控集成
# 启用stub_status模块
server {
listen 127.0.0.1:8080;
location /nginx-status {
stub_status on;
access_log off;
}
}
5. 典型应用场景
5.1 恶意请求检测
# 查找可疑User-Agent
grep -E 'nmap|sqlmap|hydra' access.log
# 检测路径遍历攻击
grep '\.\./' access.log | awk '{print $1,$7}'
5.2 API性能分析
# 统计最慢的API端点
cat access.log | awk '{print $7, $NF}' | sort -k2 -nr | head -20
# 计算各状态码占比
awk '{print $9}' access.log | sort | uniq -c | sort -nr
6. 技术优缺点分析
优势亮点:
- 毫秒级响应时间统计
- 支持自定义字段扩展
- 原生支持日志缓冲写入
- 多虚拟主机独立日志
潜在局限:
- 日志文件可能快速膨胀
- 缺少可视化分析界面
- 原始日志可读性较差
- 正则过滤性能消耗大
7. 关键注意事项
7.1 隐私合规要求
# 屏蔽敏感字段
map $arg_password $password {
default "***";
~^(?<pw>.+)$ $pw; # 演示逻辑,实际应做脱敏处理
}
7.2 存储安全建议
# 设置日志目录权限
chown -R www-data:adm /var/log/nginx
chmod 640 /var/log/nginx/*.log
# 加密存储历史日志
openssl aes-256-cbc -salt -in access.log -out access.log.enc
8. 实战经验总结
通过合理配置Nginx日志审计功能,我们成功实现了:
- 精准追踪到某次API接口响应慢的问题根源
- 发现并阻止了来自特定IP的CC攻击
- 优化了高峰时段的服务器资源配置
- 满足等保2.0三级的安全审计要求
建议每季度进行一次日志策略评审,结合业务发展调整日志格式和存储周期。