通过Nginx日志防止攻击的核心方法
chmod 640 /var/log/nginx/*.log)和访问控制列表(ACL),限制仅管理员、监控系统等合法主体能访问Nginx日志文件,避免未授权读取或篡改。logrotate工具配置定期轮转(如每天生成新日志、保留7天历史),并启用压缩(如gzip),防止日志文件无限膨胀占用磁盘空间,影响服务器性能。grep -v或sed剔除IP地址、用户凭证等敏感字段(如sed 's/\b[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\b/XXX.XXX.XXX.XXX/g'),降低数据泄露风险。rsyslog的TLS模块或logstash的ssl配置),防止数据在传输过程中被窃取。$remote_addr(客户端IP)、$status(HTTP状态码)、$http_user_agent(User-Agent)、$http_referer(引用来源)、$body_bytes_sent(响应大小)等字段。例如:
404错误(如"GET /admin.php HTTP/1.1" 404)可能意味着攻击者在扫描网站目录;500错误(如"POST /login.php HTTP/1.1" 500)可能是攻击者尝试SQL注入或文件包含漏洞;User-Agent(如包含sqlmap、nmap等关键词)可能来自自动化攻击工具;/wp-login.php请求)可能是DDoS或暴力破解。"GET /.* HTTP/1.1" 404;".*union.*select.*";".*bot.*|.*scan.*|.*exploit.*"。
通过grep、awk或日志分析工具(如ELK Stack)批量筛选异常日志。iptables、fail2ban),对异常IP进行自动封禁。例如:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr),若某IP超过阈值(如50次/分钟),则用iptables -A INPUT -s <IP> -j DROP封禁;fail2ban监控Nginx日志(如access.log、error.log),自动添加iptables规则,封禁指定时长的IP(如1小时),并支持自动解封。limit_req_zone和limit_req指令,限制单个IP的请求频率。例如:limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s; # 每秒最多10个请求
server {
location / {
limit_req zone=req_zone burst=20 nodelay; # 允许突发20个请求,无延迟
# 其他配置...
}
}
这种方式可有效缓解DDoS攻击和暴力破解。access_log指令开启,并使用自定义格式记录足够的信息(如IP、时间、请求方法、URL、状态码、User-Agent、Referer)。例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
详细的日志是识别异常行为的基础。error_log级别设置为debug或info(生产环境建议warn或error),记录服务器错误(如连接失败、权限问题、模块异常)。例如:error_log /var/log/nginx/error.log warn;
错误日志能帮助快速定位攻击尝试(如SQL注入、文件上传漏洞)。add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持
add_header X-XSS-Protection "1; mode=block"; # 启用XSS防护
add_header X-Content-Type-Options "nosniff"; # 防止MIME类型嗅探
add_header Content-Security-Policy "default-src 'self'"; # 控制资源加载来源
这些Headers能有效降低XSS、点击劫持等攻击的风险。http、server或location块中添加server_tokens off;,关闭响应头中的Nginx版本信息(如Server: nginx/1.25.3),防止攻击者根据版本号查找已知漏洞。allow/deny指令限制访问IP。例如:location /admin/ {
allow 192.168.1.0/24; # 允许内网IP
deny all; # 拒绝其他IP
auth_basic "Restricted Access"; # 启用基础认证
auth_basic_user_file /etc/nginx/.htpasswd; # 认证文件路径
}
减少暴露面,降低被攻击的概率。