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" ]; thenecho "没有检测到异常的大量请求。"
elseecho "发现潜在攻击的 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" ]; thenecho "没有检测到多次失败的登录尝试。"
elseecho "发现多次失败的登录尝试 IP 地址:"echo "$failed_logins"
fi# 检查访问不存在或敏感文件的情况
echo "检测访问不存在或敏感文件的情况..."
sensitive_files=("admin" "wp-admin" "phpmyadmin" "etc/passwd" "error.log" "access.log")
for file in "${sensitive_files[@]}"; domatches=$(grep "$file" $ACCESS_LOG)if [ ! -z "$matches" ]; thenecho "发现访问敏感文件 '$file' 的记录:"echo "$matches"fi
done# 检查 error.log 中的错误记录
echo "分析 error.log 中的错误记录..."
error_entries=$(grep -iE "error|failed|denied" $ERROR_LOG)if [ -z "$error_entries" ]; thenecho "没有发现错误记录。"
elseecho "发现以下错误记录:"echo "$error_entries"
fi# 统计各个 IP 的访问频次
echo "统计各个 IP 的访问频次..."
awk '{print $1}' $ACCESS_LOG | sort | uniq -c | sort -nr > ip_frequency.txtecho "访问频次统计已完成,结果保存在 ip_frequency.txt 文件中。"
echo "前 10 个访问频次最高的 IP:"
head -n 10 ip_frequency.txtecho "日志分析完成。"