温馨提示×

如何通过日志排查Nginx攻击

小樊
34
2025-11-06 17:40:06
栏目: 网络安全

一、前期准备:确认日志配置完整性

要有效排查Nginx攻击,首先需确保日志记录足够详细,能覆盖攻击行为的特征。Nginx的核心日志分为两类:

  • 访问日志(Access Log):记录客户端每次请求的详细信息(如IP、时间、请求方法/路径、状态码、User-Agent等),是识别攻击的主要依据;
  • 错误日志(Error Log):记录Nginx服务运行中的错误(如404/500错误、后端连接失败、权限问题等),可辅助定位攻击造成的影响。

需检查Nginx配置文件(通常为nginx.conf或站点配置文件)中的log_formataccess_log/error_log指令,确保记录关键字段(如$remote_addr$request$status$http_user_agent$http_referer)。例如,自定义日志格式可包含更多上下文信息,便于后续分析。

二、访问日志分析:识别异常访问模式

访问日志是排查攻击的“入口”,需重点关注异常行为指标,通过以下步骤逐步缩小范围:

1. 统计高频访问IP,定位可疑源头

使用命令提取访问日志中的IP地址,按访问次数排序,找出短时间内发起大量请求的IP(如Top 10):

cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

若某IP的访问次数远高于正常用户(如单IP 1分钟内发起1000+次请求),可能是DDoS攻击或暴力破解的源头。

2. 分析状态码分布,识别错误类型

通过状态码判断攻击类型:

  • 大量404错误:可能是攻击者在扫描网站目录结构(如尝试访问/admin/wp-login.php等不存在的路径);
  • 大量500错误:可能是攻击者利用漏洞(如SQL注入、文件包含)导致服务器内部错误;
  • 大量403错误:可能是攻击者尝试访问未授权的目录或文件(如/etc/passwd)。

统计状态码的命令示例:

# 统计所有状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr  
# 筛选特定状态码(如404)
awk '$9 == 404 {print $0}' /var/log/nginx/access.log

3. 检测异常请求路径,识别攻击意图

分析请求路径($request字段),找出非正常业务的路径(如尝试访问/phpmyadmin/api/v1/login等敏感接口,或包含unionselect<script>等关键字的路径):

# 查找包含敏感路径的请求
grep -E '/phpmyadmin|/wp-admin|/api/v1/login' /var/log/nginx/access.log  
# 查找SQL注入关键字
grep -i -E 'union|select|insert|delete|update|drop' /var/log/nginx/access.log  
# 查找XSS攻击关键字
grep -i -E '<script>|javascript:|onerror=|onload=' /var/log/nginx/access.log

4. 分析User-Agent,识别恶意工具

User-Agent字段可反映客户端类型,非主流浏览器或包含“bot”“scan”“curl”等关键词的UA可能是恶意工具(如爬虫、扫描器):

# 统计高频User-Agent
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10  
# 筛选可疑User-Agent(如包含bot)
grep -i 'bot|scan|curl|wget' /var/log/nginx/access.log

三、错误日志分析:定位攻击造成的影响

错误日志能提供攻击的“后果”信息,帮助确认攻击是否成功:

1. 查看404错误详情,确认扫描行为

大量404错误可能意味着攻击者在探测网站结构,可通过时间戳关联访问日志,找出扫描的路径和IP:

# 实时查看错误日志中的404错误
tail -f /var/log/nginx/error.log | grep '404'
# 结合访问日志找出扫描IP
grep '404' /var/log/nginx/error.log | awk '{print $7}' | cut -d'"' -f2 | sort | uniq -c | sort -nr

2. 查看500错误详情,确认漏洞利用

500错误可能是攻击者利用漏洞(如SQL注入、文件上传)导致的,需结合访问日志中的请求路径和参数,确认漏洞类型:

# 查看错误日志中的500错误及对应时间
grep '500' /var/log/nginx/error.log | awk '{print $1, $2, $4, $5}'
# 关联访问日志,找出导致500错误的请求
grep '500' /var/log/nginx/error.log | awk '{print $1, $2}' | xargs -I {} grep {} /var/log/nginx/access.log

四、工具辅助:提升分析效率

手动分析日志适用于小规模数据,大规模场景建议使用工具自动化处理:

1. 日志分析工具

  • ELK Stack(Elasticsearch+Logstash+Kibana):实现日志的集中存储、实时分析和可视化,可通过Dashboard展示异常趋势(如404错误率飙升、高频IP分布);
  • GoAccess:实时分析访问日志,生成HTML报告,直观展示访问量、状态码分布、高频路径等信息。

2. 监控告警工具

  • Prometheus+Grafana:收集Nginx的指标(如请求速率、错误率、响应时间),设置阈值告警(如5分钟内的404错误超过100次);
  • Fail2Ban:自动封锁恶意IP(如短时间内发起大量404/500请求的IP),通过配置jail.local文件启用Nginx日志监控。

五、后续行动:阻断攻击与修复漏洞

1. 封锁恶意IP

通过防火墙(如iptables)封锁识别出的攻击IP,阻止其继续访问:

# 封锁单个IP
iptables -A INPUT -s 攻击IP -j DROP  
# 封锁IP段(如192.168.1.0/24)
iptables -A INPUT -s 192.168.1.0/24 -j DROP  
# 保存规则(CentOS 7+)
service iptables save

2. 修复安全漏洞

根据攻击特征修复漏洞:

  • 若存在SQL注入,需对用户输入进行过滤(如使用预编译语句),避免直接拼接SQL;
  • 若存在目录扫描,可配置Nginx隐藏敏感目录(如返回403):
    location ~ ^/(admin|wp-login\.php) {
        deny all;
        return 403;
    }
    
  • 若存在文件上传漏洞,需限制上传文件类型(如仅允许图片),并将上传目录设置为不可执行。

通过以上步骤,可系统性地通过Nginx日志排查攻击行为,及时阻断威胁并修复漏洞,提升网站安全性。

0