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="fd@qq.com"        # 替换为你的 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 规则的管理也应加强,定期检查和清理无效规则,防止规则冲突和安全漏洞。

相关推荐
加班是不可能的,除非双倍日工资4 小时前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip5 小时前
vite和webpack打包结构控制
前端·javascript
excel5 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼6 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
ZXT6 小时前
promise & async await总结
前端
Jerry说前后端6 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
画个太阳作晴天6 小时前
A12预装app
linux·服务器·前端