日志审计与安全监控
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;
}
错误日志级别可选:
debug、info、notice、warn、error、crit、alert、emerg。生产环境建议warn或error。
安全事件条件日志
记录可疑请求
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 等日志聚合系统解析
📝 发现内容有误?点击此处直接编辑