Nginx日志是识别和防范恶意攻击的重要资源。以下是利用Nginx日志增强安全性的方法:
首先确保Nginx日志记录足够的信息:
http {
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_x_forwarded_for';
access_log /var/log/nginx/security.log security;
}
'
, "
, <script>
, UNION SELECT
等)../
或敏感路径的请求# 统计IP访问量
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 查找可疑请求
grep -E "(union.*select|eval\(|base64_decode|<\s*script)" /var/log/nginx/access.log
goaccess /var/log/nginx/access.log --log-format=COMBINED
配置Fail2Ban规则示例:
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/security.log
maxretry = 2
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/security.log
maxretry = 2
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location /login {
limit_req zone=one burst=20;
}
}
#!/bin/bash
# 自动分析Nginx日志并封禁可疑IP
LOG_FILE="/var/log/nginx/security.log"
BLACKLIST="/etc/nginx/conf.d/blacklist.conf"
# 查找1小时内请求超过100次的IP
BAD_IPS=$(awk -vDate=`date -d'now-1 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1 }' $LOG_FILE | sort | uniq -c | sort -nr | awk '{if($1 > 100) print $2}')
# 更新黑名单
echo "geo \$bad_ips {" > $BLACKLIST
echo " default 0;" >> $BLACKLIST
for ip in $BAD_IPS; do
echo " $ip 1;" >> $BLACKLIST
echo "已封禁IP: $ip"
done
echo "}" >> $BLACKLIST
# 重载Nginx配置
nginx -s reload
通过合理配置和分析Nginx日志,您可以有效识别和防范多种网络攻击,提升服务器安全性。