Debian系统中,Nginx的日志默认存储在/var/log/nginx/目录下,主要包括两类文件:
通过分析日志中的字段值,可快速定位可疑请求,常见特征包括:
404(未找到资源,可能是扫描攻击)、500(服务器内部错误,可能是漏洞利用尝试)或403(禁止访问,可能是权限探测)状态码;.git、.env、/etc/passwd、/admin后台)、带特殊参数的路径(如?id=1' OR 1=1--、?redirect=http://malicious.com);bot、scan、nmap、sqlmap、curl等关键词的自动化工具或恶意爬虫;spam.com、sex.site),或为空(-),可能是伪造的请求来源;PUT、DELETE等非GET/POST方法的请求(除非业务需要),可能是攻击者尝试修改数据。通过Linux命令行工具可快速筛选出可疑请求,常用命令如下:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
grep ' 404 ' /var/log/nginx/access.log | awk '{print $1, $7}' | sort | uniq -c | sort -nr
bot关键词的请求,识别自动化工具。grep -i 'bot' /var/log/nginx/access.log | awk '{print $1, $11}'
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
手动分析日志效率低,可通过Fail2Ban等工具自动识别并封禁恶意IP:
sudo apt-get install fail2ban
/etc/fail2ban/filter.d/nginx-badbots.conf文件,定义恶意请求的正则表达式(如频繁404、异常User-Agent)。[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 404
^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" ".*(bot|scan|nmap|sqlmap).*"
ignoreregex =
/etc/fail2ban/jail.local,启用Nginx监控。[nginx-badbots]
enabled = true
filter = nginx-badbots
action = iptables-multiport[name=BadBots, port="http,https", protocol=tcp]
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl restart fail2ban
/etc/nginx/nginx.conf),添加server_tokens off;,避免泄露服务器信息;limit_req模块防止DDoS攻击,例如限制单个IP每秒最多10次请求。http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location / {
limit_req zone=mylimit burst=20;
}
}
}
Content-Security-Policy、X-XSS-Protection等响应头,防御XSS、点击劫持等攻击;