openeuler 虚拟机:Nginx 日志分析脚本

深度剖析 Nginx 日志分析脚本:从数据挖掘到安全防护的进阶之路

在数字化浪潮席卷全球的今天,Web 服务承载着海量的用户请求与数据交互。Nginx 作为高性能的 Web 服务器和反向代理服务器,其产生的访问日志蕴含着丰富的信息。这些日志不仅记录了用户的访问行为,更是保障服务安全、优化服务性能的关键数据源。本文将深入剖析一个 Nginx 访问日志分析脚本,探索如何通过日志分析实现流量统计、异常检测、自动封禁与邮件告警,从而构建起一套完整的 Web 服务安全防护体系。

脚本核心功能概述

该脚本的核心目标是从 Nginx 访问日志中挖掘有价值的信息,对访问行为进行分析和监控。具体功能包括:

  1. 统计 TOP 5 访问 IP 和 URL:通过对日志的解析和处理,快速定位访问量最高的 IP 地址和 URL,帮助运维人员了解用户的访问热点,为资源优化和服务改进提供依据。

  2. 异常高频访问检测:设定每分钟请求阈值,实时检测异常高频访问行为。一旦发现某个 IP 的请求次数超过阈值,即判定为异常访问,触发后续的封禁和告警操作,有效防范恶意攻击和流量滥用。

  3. 自动封禁异常 IP:利用 iptables 防火墙工具,自动封禁异常高频访问的 IP 地址,阻止其继续访问服务器,降低安全风险。同时,设置封禁时长,实现自动解封,避免过度封禁影响正常用户访问。

  4. 邮件告警通知:当检测到异常访问并封禁 IP 后,自动发送邮件告警,及时通知相关人员,以便快速响应和处理安全事件。

脚本实现细节与原理剖析

配置信息定义

脚本开头部分定义了一系列关键配置信息,包括 Nginx 访问日志路径、异常访问阈值、封禁时长、临时目录、iptables 规则注释以及 QQ 邮箱配置等。这些配置信息为后续的日志分析和处理提供了必要的参数。

复制代码
\# 配置信息


LOG\_FILE="/var/log/nginx/access.log"  # Nginx 访问日志路径


THRESHOLD=50                           # 每分钟请求阈值(超过该值判定为异常高频访问)


BAN\_TIME=3600                          # 封禁时长,单位为秒(封禁后多久自动解封)


TEMP\_DIR="/tmp/nginx\_analyzer"         # 临时目录,用于存储中间分析结果


IPTABLES\_RULE\_COMMENT="nginx\_analyzer\_auto\_ban"  # iptables 规则注释,用于标识自动封禁的规则


\# QQ 邮箱配置


QQ\_EMAIL="[email protected]"        # 替换为你的 QQ 邮箱地址


QQ\_PASSWORD="wssarzpdfdsfdsfcjobbbbac"   # 替换为 QQ 邮箱的授权码(不是登录密码,需在邮箱设置里开启 SMTP 后获取)


SMTP\_SERVER="smtp.qq.com"              # QQ 邮箱的 SMTP 服务器地址


SMTP\_PORT=465                          # 使用 465 端口(SSL 直接连接方式,用于加密通信)

其中,QQ 邮箱配置涉及到 SMTP 协议的使用。SMTP(Simple Mail Transfer Protocol)是用于发送邮件的标准协议,通过配置 SMTP 服务器地址、端口、邮箱账号和授权码,脚本能够实现邮件的自动发送。

日志分析函数analyze_logs

analyze_logs函数是整个脚本的核心部分,负责对 Nginx 访问日志进行解析和分析。

  1. 统计 TOP 5 访问 IP 和 URL

    # 统计访问次数最多的前 5 个 IP

    echo "===== 访问次数最多的前 5 个 IP ====="

    tail -n 1000 $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 5

    # 统计访问次数最多的前 5 个 URL

    echo "===== 访问次数最多的前 5 个 URL ====="

    tail -n 1000 $LOG_FILE | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 5

上述代码通过tail命令获取日志文件的最后 1000 行(可根据实际情况调整行数),然后使用awk提取 IP 地址或 URL 字段,再经过sort排序、uniq -c统计出现次数、再次sort -nr按降序排列,最后通过head -n 5获取访问次数最多的前 5 个 IP 或 URL。这种处理方式利用了 Linux 命令行工具的强大功能,能够高效地对日志数据进行筛选和统计。

  1. 检测异常高频访问的 IP

    current_time=$(date "+%d/%b/%Y:%H:%M") # 获取当前时间,格式与 Nginx 日志时间格式匹配

    last_minute=$(date -d "1 minute ago" "+%d/%b/%Y:%H:%M") # 获取 1 分钟前的时间,用于筛选最近 1 分钟的日志

    grep "$last_minute" $LOG_FILE > $TEMP_DIR/recent_logs

首先获取当前时间和 1 分钟前的时间,然后使用grep命令按时间筛选日志,将最近 1 分钟的日志写入临时文件recent_logs。如果未找到最近 1 分钟的日志,则取日志文件的最后 1000 行作为备用。

复制代码
cat \$TEMP\_DIR/recent\_logs | awk '{print \$1}' | grep -E '^\[0-9]+\\.\[0-9]+\\.\[0-9]+\\.\[0-9]+\$' | sort | uniq -c > \$TEMP\_DIR/ip\_counts

对临时日志文件进行处理,提取 IP 地址字段,过滤掉非标准 IPv4 格式的内容,统计每个 IP 在最近 1 分钟内的请求次数,并将结果写入ip_counts文件。

复制代码
while read count ip; do

  if \[ \$count -gt \$THRESHOLD ]; then


     echo "发现异常高频访问 IP: \$ip (请求次数: \$count)"

      ban\_ip \$ip \$count  # 调用封禁 IP 的函数


  else

       echo "IP \$ip 的请求次数 \$count 未超过阈值 \$THRESHOLD"

   fi


done < \$TEMP\_DIR/ip\_counts

逐行读取ip_counts文件,判断每个 IP 的请求次数是否超过设定的阈值。如果超过阈值,则调用ban_ip函数进行封禁,并发送告警邮件。

封禁 IP 函数ban_ip

ban_ip函数负责将异常 IP 地址添加到 iptables 防火墙规则中进行封禁,并安排自动解封任务。

复制代码
if iptables -C INPUT -s \$ip -j DROP -m comment --comment "\$IPTABLES\_RULE\_COMMENT" 2>/dev/null; then


   echo "IP \$ip 已被封禁"

   return  # 已封禁就直接返回,不再重复操作


fi


iptables -A INPUT -s \$ip -j DROP -m comment --comment "\$IPTABLES\_RULE\_COMMENT"

首先检查该 IP 是否已经被封禁,通过iptables -C命令查看是否存在对应的封禁规则。如果已被封禁,则直接返回;否则,使用iptables -A命令添加封禁规则,拒绝该 IP 的输入流量,并标记注释。

复制代码
(


   sleep \$BAN\_TIME  # 等待指定的封禁时长


   if iptables -C INPUT -s \$ip -j DROP -m comment --comment "\$IPTABLES\_RULE\_COMMENT" 2>/dev/null; then


       iptables -D INPUT -s \$ip -j DROP -m comment --comment "\$IPTABLES\_RULE\_COMMENT"

       echo "IP \$ip 已自动解封"

   fi


) 

通过在后台运行一个子进程,等待指定的封禁时长后,再次检查该 IP 的封禁规则是否仍然存在。如果存在,则使用iptables -D命令删除规则,实现自动解封。

发送告警邮件函数send_alert_email

send_alert_email函数利用mailx工具发送告警邮件,通知相关人员异常访问事件。

复制代码
echo "\$message" | mailx -v -r "\$QQ\_EMAIL" -s "\$subject" \\


-S smtp="smtps://\$SMTP\_SERVER:\$SMTP\_PORT" \\


-S smtp-auth=login \\


-S smtp-auth-user="\$QQ\_EMAIL" \\


-S smtp-auth-password="\$QQ\_PASSWORD" \\


-S ssl-verify=ignore \\


-S nss-config-dir=/etc/pki/nssdb \\


"\$QQ\_EMAIL"

通过echo命令将邮件内容传递给mailx,并配置发件人、邮件主题、SMTP 服务器、认证方式、加密验证等参数,实现邮件的发送。其中,ssl-verify=ignore表示忽略 SSL 证书验证,在某些测试环境中可以使用,但在生产环境中应谨慎处理,确保通信的安全性。

清理临时文件函数cleanup与主函数main

cleanup函数用于删除临时目录及其内容,释放磁盘空间。main函数则按顺序调用analyze_logs函数进行日志分析和处理,以及cleanup函数进行清理操作,确保脚本的正常运行和资源的合理使用。

实践应用与优化建议

实践应用场景

该脚本在实际应用中具有广泛的用途,特别是在 Web 服务的安全防护和性能优化方面。例如,在高流量的电商网站、社交平台等场景下,通过实时监控访问日志,能够及时发现并阻止恶意攻击,如 DDoS 攻击、暴力破解等,保障服务的可用性和数据安全。同时,通过分析 TOP 5 访问 IP 和 URL,运维人员可以了解用户的访问偏好,优化服务器资源分配,提升用户体验。

优化建议

  1. 日志采样策略优化:在处理大规模日志时,仅取日志文件的最后 1000 行进行分析可能无法准确反映整体情况。可以考虑采用更科学的日志采样策略,如按时间间隔抽取日志样本,或者根据日志文件大小进行动态采样,以提高分析结果的准确性。

  2. 异常检测算法改进:目前的异常检测仅基于每分钟请求阈值,这种单一的判断标准可能存在误判或漏判的情况。可以引入机器学习算法,如基于历史访问数据训练异常检测模型,结合多种特征(如请求频率变化趋势、请求时间分布等)进行综合判断,提高异常检测的准确性和可靠性。

  3. 邮件告警内容优化:邮件告警内容可以进一步丰富,例如添加更多的日志细节(如具体的访问 URL、请求时间等),方便相关人员快速定位问题。同时,可以优化邮件的格式和布局,使其更加清晰易读。

  4. 安全性增强 :在使用mailx发送邮件时,忽略 SSL 证书验证存在一定的安全风险。在生产环境中,应确保 SSL 证书的有效性,并采用更安全的认证方式,如 OAuth 2.0 认证,保障邮件通信的安全性。此外,对 iptables 规则的管理也应加强,定期检查和清理无效规则,防止规则冲突和安全漏洞。

相关推荐
小小小小宇1 小时前
ESLint 插件笔记
前端
纪伊路上盛名在1 小时前
jupyter内核崩溃
前端·数据库·jupyter·生物信息·基因组·k-mer
Net蚂蚁代码3 小时前
Angular入门的环境准备步骤工作
前端·javascript·angular.js
小着5 小时前
vue项目页面最底部出现乱码
前端·javascript·vue.js·前端框架
lichenyang4538 小时前
React ajax中的跨域以及代理服务器
前端·react.js·ajax
呆呆的小草8 小时前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
WHOAMI_老猫8 小时前
xss注入遇到转义,html编码绕过了解一哈
javascript·web安全·渗透测试·xss·漏洞原理
一 乐9 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
testleaf9 小时前
前端面经整理【1】
前端·面试
好了来看下一题9 小时前
使用 React+Vite+Electron 搭建桌面应用
前端·react.js·electron