怎样用nginx日志监控网络攻击
导读:用 Nginx 日志监控网络攻击的实操方案 一 基础准备与日志规范 启用并规范日志格式,确保包含可用于溯源与安全分析的字段:客户端 $remote_addr、请求 $request、状态码 $status、响应体大小 $body_byte...
用 Nginx 日志监控网络攻击的实操方案
一 基础准备与日志规范
- 启用并规范日志格式,确保包含可用于溯源与安全分析的字段:客户端 $remote_addr、请求 $request、状态码 $status、响应体大小 $body_bytes_sent、来源 $http_referer、用户代理 $http_user_agent、以及经过代理时的 $http_x_forwarded_for。示例:
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 /var/log/nginx/error.log; - 若经过 CDN/反向代理,优先使用 $http_x_forwarded_for 作为源 IP 判断依据,并在日志分析侧据此聚合与告警。
- 配置 日志轮转(如 logrotate)避免磁盘被占满,保证长期可分析性。
二 快速发现攻击的常用方法
- 实时监控与基线观察
- 实时查看新增日志:
tail -f /var/log/nginx/access.log - 快速筛查异常状态码:
grep -E " 404|403|500 " /var/log/nginx/access.log | tail -n 50 - 观察错误日志中的异常路径与扫描迹象:
tail -n 200 /var/log/nginx/error.log
- 实时查看新增日志:
- 常见攻击特征举例
- 敏感文件与信息泄露探测:如 /.env、/.git/、/phpinfo.php、/debug.php、/status.php 等
- 目录遍历与后台入口扫描:如 /admin/、/config/、/uploads/、/backup/ 等
- 已知产品与漏洞路径探测:如 /solr/、/jasperserver/、/owncloud/status.php、/Telerik.Web.UI 等
- 恶意载荷与僵尸网络特征:如 wget/chmod、/tmp/、Mozi.m 等
- 异常 User-Agent、异常 Referer、短路径随机探测(如 /[a-zA-Z0-9]{ 4,8} )等
- 速率与错误异常
- 短时间内大量请求(潜在 DDoS/暴力扫描)
- 大量 404(内容探测)、500(漏洞利用尝试或后端异常)
三 自动化检测与封禁
- 使用 Fail2Ban(推荐)
- 启用 Nginx 相关 jail,配置监控访问/错误日志并自动封禁恶意 IP。
- 可自定义过滤器,覆盖敏感路径、扫描特征、登录爆破等模式;支持 iptables/nftables/firewalld 等动作。
- 示例(在 jail.local 启用或新增自定义 filter.d 规则后重启服务):
[nginx-http-auth] enabled = true filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 5 bantime = 3600 [nginx-badbots] enabled = true filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 100 findtime = 600 bantime = 86400
- 轻量脚本自动封禁(无外部依赖时的临时方案)
- 思路:按时间窗口统计 IP 请求数,超过阈值即加入 iptables DROP;支持白名单与自动解封。
- 示例(每分钟检查一次,阈值 200 req/min,封禁 3600 秒):
LOG_FILE="/var/log/nginx/access.log" TIME_WINDOW=$(date --date='1 minute ago' "+%d/%b/%Y:%H:%M") THRESHOLD=200 BAN_TIME=3600 WHITELIST=("127.0.0.1" "192.168.0.0/24") is_whitelisted() { local ip=$1 for w in "${ WHITELIST[@]} "; do if [[ $w == *"/"* ]]; then ipcalc -nb "$w" "$ip" 2> /dev/null | grep -q "YES" & & return 0 elif [[ $ip == $w ]]; then return 0 fi done return 1 } grep "$TIME_WINDOW" "$LOG_FILE" | awk '{ print $1} ' | sort | uniq -c | sort -nr | while read cnt ip; do if ! is_whitelisted "$ip" & & [ "$cnt" -gt "$THRESHOLD" ]; then iptables -C INPUT -s "$ip" -j DROP 2> /dev/null || { iptables -A INPUT -s "$ip" -j DROP echo "$(date) BAN $ip ($cnt req/min)" > > /var/log/nginx/ban.log (sleep "$BAN_TIME"; iptables -D INPUT -s "$ip" -j DROP) & } fi done - 建议:生产环境优先使用 Fail2Ban;脚本方案务必配置白名单、解封与审计日志。
四 集中化监控与可视化
- 日志集中与检索
- 使用 ELK Stack(Elasticsearch + Logstash + Kibana)、Graylog 或 Splunk 收集与索引 Nginx 日志,构建仪表盘与告警规则。
- 指标与告警
- 以 IP/URI/UA/状态码/返回大小 为维度建立基线,对以下指标设置阈值告警:
- 单位时间请求速率(按 IP/URI 分桶)
- 404/403/500 错误率突增
- 敏感路径命中次数
- 异常 User-Agent 与非常规 Referer
- 可结合 Prometheus + Grafana(通过 nginx-exporter/日志转指标)或 Zabbix/Nagios 实现可视化与通知。
- 以 IP/URI/UA/状态码/返回大小 为维度建立基线,对以下指标设置阈值告警:
五 防护加固与最佳实践
- 在 Nginx 层面降低可被利用面
- 启用速率限制:使用 limit_req_zone/limit_req 限制单 IP 请求速率,缓解 DDoS/暴力 场景。
- 配置 IP 黑名单 或 geoip 限制高风险来源。
- 添加安全响应头:如 X-Frame-Options、X-XSS-Protection、X-Content-Type-Options、Strict-Transport-Security 等。
- 运维与治理
- 保持 Nginx 与依赖组件及时更新,移除无用模块与默认页面。
- 规范日志保留与归档,定期审计异常模式与趋势。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 怎样用nginx日志监控网络攻击
本文地址: https://pptw.com/jishu/754002.html
