南方
一,设计思路
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),欢迎交流:
关注公众号留言,或者在下方直接留言: