当前位置:首页>Linux>linux /var/log 下日志分析脚本

linux /var/log 下日志分析脚本

  • 2026-09-02 19:36:57
linux /var/log 下日志分析脚本

南方

一,设计思路

1、先查找分类日志,目录下有多少种类型日志

  • Web/认证日志(如 access.log, secure):这些是黑客攻击的“前线”,脚本会对它们进行全量攻击特征扫描。

  • 系统日志(如 messages, syslog):这些主要反映系统健康度,脚本主要扫描错误、崩溃、OOM等系统级故障。

避免了在系统日志里找 SQL 注入,或在 Web 日志里找内核错误,提高分析效率。

2、再匹配能想到的错误类型日志

  • 已知攻击模式:内置了 SQL 注入、XSS、目录遍历、Webshell 等常见攻击的正则表达式。

  • 工具指纹识别:不仅找攻击行为,还找攻击工具(如 sqlmap, nmap 的 User-Agent),这是典型的入侵检测思路。

  • 暴力破解识别:通过统计 Failed password 等关键词,识别撞库行为。

3、上下文关联分析

  • 看前因:攻击发生前,系统在执行什么操作?看后果:攻击发生后,系统是否崩溃或返回了敏感数据?

  • 宏观:先 wc -l 统计该类问题出现的总次数(例如:“发现 500 次 SQL 注入”)。这有助于判断攻击的严重程度。

  • 微观:只 head -9 展示前几条带上下文的样本。

防止日志量过大瞬间刷屏,既让你知道问题有多严重,又给你看具体长什么样,兼顾了信息量和可读性。

带时间戳的文件名:security_audit_report_YYYYMMDD_HHMM.txt,方便历史回溯。

双重输出:既在屏幕上用颜色高亮显示(方便实时查看),又同步写入文件(方便后续汇报或存档)。

二,简易流程图

三,脚本代码

#!/bin/bash# 定义颜色RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'BLUE='\033[0;34m'CYAN='\033[0;36m'MAGENTA='\033[0;35m'NC='\033[0m'LOG_DIR="/var/log"REPORT_FILE="security_audit_report_$(date +%Y%m%d_%H%M).txt"# 初始化报告echo "========================================" > "$REPORT_FILE"echo "   🛡️ 系统安全与攻击日志审计报告" >> "$REPORT_FILE"echo "   生成时间: $(date)" >> "$REPORT_FILE"echo "========================================" >> "$REPORT_FILE"echo "" >> "$REPORT_FILE"# --- 核心配置:攻击特征库 ---declare -a ATTACK_REGEX_LISTdeclare -a ATTACK_DESC_LIST# 1. Web 攻击ATTACK_REGEX_LIST+=('union.*select|select.*from|insert.*into|drop.*table')ATTACK_DESC_LIST+=("SQL 注入尝试")ATTACK_REGEX_LIST+=('<script>|alert\(|onerror=|onload=')ATTACK_DESC_LIST+=("XSS 跨站脚本")ATTACK_REGEX_LIST+=('\.\./|\.\.\\\\|%2e%2e%2f|%2e%2e/')ATTACK_DESC_LIST+=("目录遍历/文件包含")ATTACK_REGEX_LIST+=('/etc/passwd|/etc/shadow|cmd.exe|/bin/sh|/bin/bash')ATTACK_DESC_LIST+=("敏感文件/命令执行")ATTACK_REGEX_LIST+=('eval\(|base64_decode|system\(|exec\(')ATTACK_DESC_LIST+=("代码执行尝试")# 2. 扫描器特征ATTACK_REGEX_LIST+=('sqlmap|nmap|hydra|burp|havij|masscan')ATTACK_DESC_LIST+=("扫描器/攻击工具特征")ATTACK_REGEX_LIST+=('Mozilla/4.0.*MSIE 6.0|curl/|wget/|python-requests')ATTACK_DESC_LIST+=("可疑 User-Agent")# 3. 暴力破解ATTACK_REGEX_LIST+=('Failed password|authentication failure|Invalid user|FAILED SU')ATTACK_DESC_LIST+=("暴力破解/认证失败")ATTACK_REGEX_LIST+=('Too many authentication failures')ATTACK_DESC_LIST+=("暴力破解(锁定)")# 4. 异常扫描ATTACK_REGEX_LIST+=('404.*\.php|404.*\.asp|404.*\.bak|404.*\.sql')ATTACK_DESC_LIST+=("404 敏感文件扫描")# --- 核心配置:系统错误库 ---declare -a ERROR_REGEX_LISTdeclare -a ERROR_DESC_LISTERROR_REGEX_LIST+=('[Ee]rror|FAILED|failure')ERROR_DESC_LIST+=("系统错误")ERROR_REGEX_LIST+=('[Ww]arning|WARN')ERROR_DESC_LIST+=("系统警告")ERROR_REGEX_LIST+=('[Cc]ritical|[Ff]atal|[Aa]lert')ERROR_DESC_LIST+=("严重故障")ERROR_REGEX_LIST+=('[Oo]ut of memory|OOM|Killed process')ERROR_DESC_LIST+=("内存溢出")ERROR_REGEX_LIST+=('[Ss]egmentation fault')ERROR_DESC_LIST+=("系统崩溃")# 函数:分析单个文件function analyze_file() {    local file="$1"    local filename=$(basename "$file")    local is_web_log=0    local is_auth_log=0    # 判断日志类型    if [[ "$filename" =~ access|nginx|apache|httpd ]]; then        is_web_log=1    elif [[ "$filename" =~ secure|auth|sshd ]]; then        is_auth_log=1    fi    # 检查文件可读性与大小    if [ ! -r "$file" ] || [ ! -s "$file" ]; then return; fi    echo -e "${CYAN}正在审计: $file${NC}"    echo "审计文件: $file" >> "$REPORT_FILE"    echo "----------------------------------------" >> "$REPORT_FILE"    local grep_cmd="grep"    if [[ "$file" == *.gz ]]; then grep_cmd="zgrep"; fi    # 1. 分析攻击特征    if [ $is_web_log -eq 1 ] || [ $is_auth_log -eq 1 ]; then        for i in "${!ATTACK_REGEX_LIST[@]}"; do            local regex="${ATTACK_REGEX_LIST[$i]}"            local desc="${ATTACK_DESC_LIST[$i]}"            # 统计攻击次数 (仅统计匹配行,不统计上下文)            local count=$($grep_cmd -E -i "$regex" "$file" 2>/dev/null | wc -l)            if [ "$count" -gt 0 ]; then                echo -e "   ${RED}🚨 [$desc] 发现 $count 次攻击/异常${NC}"                echo "🚨 [$desc] 发现 $count 次" >> "$REPORT_FILE"                # 打印前 3 条样本,带前后 2 行上下文 (-C 2)                $grep_cmd -E -i -C 2 "$regex" "$file" 2>/dev/null | head -9 | while read line; do                    # 截断过长的行,防止刷屏                    local short_line=$(echo "$line" | cut -c1-120)                    if [ ${#line} -gt 120 ]; then short_line="$short_line..."; fi                    echo -e "   ${YELLOW}样本: $short_line${NC}"                    echo "样本: $short_line" >> "$REPORT_FILE"                done            fi        done    fi    # 2. 分析系统错误    for i in "${!ERROR_REGEX_LIST[@]}"; do        local regex="${ERROR_REGEX_LIST[$i]}"        local desc="${ERROR_DESC_LIST[$i]}"        local count=$($grep_cmd -E -i "$regex" "$file" 2>/dev/null | wc -l)        if [ "$count" -gt 0 ]; then            if [ $is_web_log -eq 0 ]; then                 echo -e "   ${MAGENTA}⚙️ [$desc] 发现 $count 条${NC}"                 echo "⚙️ [$desc] 发现 $count 条" >> "$REPORT_FILE"                 # 打印前 3 条样本,带前后 2 行上下文 (-C 2)                 $grep_cmd -E -i -C 2 "$regex" "$file" 2>/dev/null | head -9 | while read line; do                     local short_line=$(echo "$line" | cut -c1-120)                     if [ ${#line} -gt 120 ]; then short_line="$short_line..."; fi                     echo -e "   ${YELLOW}样本: $short_line${NC}"                     echo "样本: $short_line" >> "$REPORT_FILE"                 done            fi        fi    done    echo "" >> "$REPORT_FILE"}# 主扫描function main_scan() {    echo -e "${GREEN}🛡️ 开始安全审计扫描 $LOG_DIR ...${NC}"    # 重点扫描 Web 日志、安全日志和系统日志    while IFS= read -r -d '' file; do        analyze_file "$file"    done < <(find "$LOG_DIR" -maxdepth 2 -type f \( -name "*.log" -o -name "messages*" -o -name "secure*" -o -name "access*" -o -name "*.gz" \) -print0 2>/dev/null)    echo ""    echo -e "${GREEN}审计完成!详细报告已保存至: $REPORT_FILE${NC}"}# 执行main_scan

四,测试

[root@localhost valog]# cat security_audit_report_20260329_1725.txt ========================================   系统安全与攻击日志审计报告   生成时间: 2026年 03月 29日 星期日 17:25:28 CST========================================审计文件: /var/log/audit/audit.log----------------------------------------[系统错误] 发现 11 条样本: type=DAEMON_START msg=audit(1774446999.837:2363): op=start ver=2.8.5 format=raw kernel=3.10.0-1160.71.1.el7.x86_64 auid=...审计文件: /var/log/cups/access_log----------------------------------------审计文件: /var/log/gdm/:0.log----------------------------------------[系统错误] 发现 2 条样本: Markers: (--) probed, (**) from config file, (==) default setting,样本: (++) from command line, (!!) notice, (II) informational,[系统警告] 发现 1 条样本: Markers: (--) probed, (**) from config file, (==) default setting,审计文件: /var/log/tuned/tuned.log---------------------------------------- [系统警告] 发现 6 条样本: 2026-03-25 21:56:45,273 INFO     tuned.plugins.base: instance cpu: assigning devices cpu2, cpu3, cpu0, cpu1审计文件: /var/log/messages---------------------------------------- [系统错误] 发现 412 条样本: Mar 25 21:56:33 localhost kernel: pci 0000:00:10.0: BAR 6: assigned [mem 0xc0008000-0xc000bfff pref]样本: Mar 25 21:56:33 localhost kernel: pci 0000:00:15.3: BAR 13: no space for [io  size 0x1000][系统警告] 发现 53 条样本: Mar 25 21:56:33 localhost kernel: Booting paravirtualized kernel on VMware hypervisor样本: Mar 25 21:56:33 localhost kernel: Detected CPU family 6 model 140 stepping 1[严重故障] 发现 1 条样本: Mar 26 10:46:42 localhost pulseaudio: 这很可能是 ALSA 驱动程序 'snd_ens1371' 中的一个 bug。请向 ALSA 开发人员报告这个问题。审计文件: /var/log/secure----------------------------------------[敏感文件/命令执行] 发现 2 次样本: Mar 25 21:58:04 localhost accounts-daemon: request by system-bus-name::1.184 [/usr/libexec/gnome-initial-setup pid:8996 ...[暴力破解/认证失败] 发现 4 次样本: Mar 27 17:27:26 localhost polkitd[753]: Registered Authentication Agent for unix-session:c1 (system bus name :1.34 [/usr...样本: Mar 27 17:28:53 localhost unix_chkpwd[2222]: password check failed for user (root)样本: Mar 27 17:28:53 localhost sshd[2220]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser=............略

五,总结

以上就是把能想到的日志类型提醒,用脚本统一输出,非常适合用于服务器的日常体检和应急响应。

最后的最后(Last but not least),欢迎交流:

关注公众号留言,或者在下方直接留言:

最新文章

随机文章