chatgpt脚本系列 - 通过分析nginx日志检测可疑的攻击行为

analysis_nginx.sh

#!/bin/bash

# 定义日志文件的路径
ACCESS_LOG="/var/log/nginx/access.log"
ERROR_LOG="/var/log/nginx/error.log"

# 定义阈值
THRESHOLD=100  # 同一 IP 地址发起的超过此数量的请求视为异常
TIME_FRAME=600  # 以秒为单位的时间范围(例如,10 分钟)

# 获取最近 TIME_FRAME 内的日志记录
RECENT_LOG=$(date --date="$TIME_FRAME seconds ago" +"%Y-%m-%dT%H:%M:%S")

# 检查是否存在潜在攻击的 IP
echo "检测来自相同 IP 的大量请求..."
suspicious_ips=$(awk -v timeframe="$RECENT_LOG" '$4 > timeframe {print $1}' $ACCESS_LOG | sort | uniq -c | sort -nr | awk -v threshold=$THRESHOLD '$1 > threshold {print $2}')

if [ -z "$suspicious_ips" ]; then
    echo "没有检测到异常的大量请求。"
else
    echo "发现潜在攻击的 IP 地址:"
    echo "$suspicious_ips"
fi

# 检查多次失败的登录尝试(假设访问 /wp-login.php 等为失败登录尝试)
echo "检测多次失败的登录尝试..."
failed_logins=$(grep -i "login" $ACCESS_LOG | awk '{print $1}' | sort | uniq -c | sort -nr | awk -v threshold=$THRESHOLD '$1 > threshold {print $2}')

if [ -z "$failed_logins" ]; then
    echo "没有检测到多次失败的登录尝试。"
else
    echo "发现多次失败的登录尝试 IP 地址:"
    echo "$failed_logins"
fi

# 检查访问不存在或敏感文件的情况
echo "检测访问不存在或敏感文件的情况..."
sensitive_files=("admin" "wp-admin" "phpmyadmin" "etc/passwd" "error.log" "access.log")
for file in "${sensitive_files[@]}"; do
    matches=$(grep "$file" $ACCESS_LOG)
    if [ ! -z "$matches" ]; then
        echo "发现访问敏感文件 '$file' 的记录:"
        echo "$matches"
    fi
done

# 检查 error.log 中的错误记录
echo "分析 error.log 中的错误记录..."
error_entries=$(grep -iE "error|failed|denied" $ERROR_LOG)

if [ -z "$error_entries" ]; then
    echo "没有发现错误记录。"
else
    echo "发现以下错误记录:"
    echo "$error_entries"
fi

# 统计各个 IP 的访问频次
echo "统计各个 IP 的访问频次..."
awk '{print $1}' $ACCESS_LOG | sort | uniq -c | sort -nr > ip_frequency.txt

echo "访问频次统计已完成,结果保存在 ip_frequency.txt 文件中。"
echo "前 10 个访问频次最高的 IP:"
head -n 10 ip_frequency.txt

echo "查询各个 IP 的归属地..."
while read -r line; do
        count=$(echo "$line" | awk '{print $1}')
        ip=$(echo "$line" | awk '{print $2}')
        response=$(curl -s "http://www.cip.cc/$ip")
        location=$(echo "$response" | grep -oP '地址\s*:\s*\K.*?(?=\s*$)') 
        echo "$count $ip $location"
        echo "$count $ip $location" >> ip_with_location.txt
        sleep 2
done < ip_frequency.txt
echo "IP 归属地查询已完成,结果保存在 ip_with_location.txt 文件中。"

echo "日志分析完成。"
posted @   BrianSun  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示