Shell脚本如何分析日志中异常请求

wen 实用脚本 1

本文目录导读:

Shell脚本如何分析日志中异常请求

  1. 基础异常分析脚本
  2. 实时异常监控脚本
  3. 综合异常分析系统
  4. 高级异常分析脚本
  5. 使用技巧

我来介绍几种使用Shell脚本分析日志中异常请求的常用方法:

基础异常分析脚本

#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/tmp/abnormal_report.txt"
# 清空旧报告
> $REPORT_FILE
echo "=== 异常请求分析报告 ===" > $REPORT_FILE
echo "分析时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 1. 统计4xx和5xx状态码
echo "=== 4xx/5xx 错误请求统计 ===" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | grep -E '^[45][0-9]{2}$' | sort | uniq -c | sort -rn >> $REPORT_FILE
# 2. 统计返回404最多的URL
echo "" >> $REPORT_FILE
echo "=== 404错误最多的URL ===" >> $REPORT_FILE
awk '$9 == 404 {print $7}' $LOG_FILE | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
# 3. 统计请求量异常的IP
echo "" >> $REPORT_FILE
echo "=== 请求量异常IP (超过100次) ===" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | awk '$1 > 100 {print}' >> $REPORT_FILE

实时异常监控脚本

#!/bin/bash
# 实时监控日志中的异常
tail -f /var/log/nginx/access.log | while read line; do
    # 提取状态码
    status_code=$(echo $line | awk '{print $9}')
    # 检查异常状态码
    if [[ $status_code =~ ^[45][0-9]{2}$ ]]; then
        ip=$(echo $line | awk '{print $1}')
        url=$(echo $line | awk '{print $7}')
        time=$(echo $line | awk '{print $4}' | tr -d '[')
        echo "[WARNING] 异常请求: $time | IP: $ip | 状态码: $status_code | URL: $url"
    fi
    # 检测异常请求频率(同一IP的请求间隔)
    # 可以在这里添加更复杂的逻辑
done

综合异常分析系统

#!/bin/bash
LOG_DIR="/var/log/nginx"
CURRENT_DATE=$(date +%Y-%m-%d)
analyze_abnormal_requests() {
    local log_file="$1"
    echo "=== 分析日志文件: $log_file ==="
    # 1. SQL注入尝试检测
    echo "### SQL注入尝试检测 ###"
    grep -i -E "(union.*select|select.*from|insert into|delete from|drop table)" $log_file | \
        awk '{print $1, $7, $9}' | sort -u
    # 2. XSS攻击尝试检测
    echo "### XSS攻击尝试检测 ###"
    grep -i -E "(<script|<iframe|alert\(|onerror=|onload=)" $log_file | \
        awk '{print $1, $7, $9}' | sort -u
    # 3. 路径遍历尝试检测
    echo "### 路径遍历尝试检测 ###"
    grep -E "\.\./|\.\.\\\\" $log_file | awk '{print $1, $7, $9}' | sort -u
    # 4. 扫描器检测
    echo "### 爬虫/扫描器检测 ###"
    grep -i -E "(sqlmap|nikto|nmap|nessus|acunetix)" $log_file | \
        awk '{print $1, $7, $9}' | sort -u
    # 5. 短时间内高频访问检测
    echo "### 高频访问IP检测 (10秒内超过50次) ###"
    awk '{print $1, $4}' $log_file | sort | \
        awk '{
            ip=$1
            time=$2
            if (ip != last_ip) {
                count=1
                start_time=time
            } else {
                count++
                if (count > 50 && time_diff < 10) {
                    print ip " 在短时间内访问了" count "次"
                }
            }
            last_ip=ip
        }'
}
# 按需分析
case "$1" in
    "daily")
        analyze_abnormal_requests "$LOG_DIR/access.log"
        ;;
    "realtime")
        # 实时监控
        tail -f "$LOG_DIR/access.log" | while read line; do
            # 实时分析逻辑
            echo "$line" | grep -E "error|warning|403|404|500|502|503" && \
                echo "[$(date)] 发现异常: $line"
        done
        ;;
    *)
        echo "用法: $0 {daily|realtime}"
        exit 1
        ;;
esac

高级异常分析脚本

#!/bin/bash
# 定义异常模式
declare -A PATTERNS
PATTERNS["SQL注入"]="(union.*select|select.*from|insert into|drop table|delete from|--|#|/\*)"
PATTERNS["XSS攻击"]="(<script|<iframe|alert\(|onerror=|onload=|javascript:)"
# 检测并报告
detect_anomalies() {
    local log_file=$1
    local output_file="/tmp/anomalies_$(date +%Y%m%d_%H%M%S).txt"
    echo "开始检测异常请求..." > $output_file
    for pattern_name in "${!PATTERNS[@]}"; do
        echo "检测: $pattern_name" >> $output_file
        # 使用grep的-P选项支持Perl正则
        grep -P "${PATTERNS[$pattern_name]}" $log_file | \
            awk '{ip=$1; url=$7; status=$9; print ip" | "status" | "url}' >> $output_file
        echo "---" >> $output_file
    done
    # 生成统计
    echo "=== 异常统计 ===" >> $output_file
    for pattern_name in "${!PATTERNS[@]}"; do
        count=$(grep -cP "${PATTERNS[$pattern_name]}" $log_file)
        echo "$pattern_name: $count 次" >> $output_file
    done
    echo "报告已生成: $output_file"
}
# 执行检测
detect_anomalies "/var/log/nginx/access.log"

使用技巧

实时监控并告警

#!/bin/bash
# 添加告警功能
threshold=100
ip_count=$(tail -1000 access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -1 | awk '{print $1}')
if [ "$ip_count" -gt "$threshold" ]; then
    echo "检测到异常流量,发送告警..."
    # mail -s "异常流量告警" admin@example.com < /tmp/report.txt
fi

日志旋转后分析

#!/bin/bash
# 分析昨天的日志
yesterday=$(date -d "yesterday" +%Y%m%d)
log_file="/var/log/nginx/access.log.$yesterday"
if [ -f "$log_file" ]; then
    analyze_abnormal_requests "$log_file"
fi

这些脚本可以帮助你:

  • 快速识别异常请求
  • 发现潜在的安全威胁
  • 生成分析报告
  • 实现实时监控

根据具体需求选择合适的脚本,并可以组合使用不同的分析方法。

抱歉,评论功能暂时关闭!