Linux 服务器日志分析与入侵检测实战:快速发现黑客攻击痕迹

服务器被入侵,从来不是”突然发生”的。无论是 SSH 暴力破解、Web 注入还是 webshell 上传,攻击者在得手之前,往往已经在日志里留下了大量试探痕迹。很多站长只在网站打不开、数据被加密勒索时才后知后觉,错过了黄金处置期。本文教你在 Linux 服务器上通过日志分析快速发现攻击行为,并搭建自动化的入侵检测告警体系。

一、认识关键日志文件,学会快速定位

Linux 系统日志默认存放在 /var/log 目录,不同发行版略有差异,以下是最常看的几个:

/var/log/secure      # CentOS/RHEL 认证与安全日志(SSH 登录记录)
/var/log/auth.log    # Debian/Ubuntu 认证日志
/var/log/messages    # 系统运行日志
/var/log/btmp        # 失败登录记录(二进制,用 lastb 查看)
/var/log/nginx/access.log  # Nginx 访问日志
/var/log/nginx/error.log   # Nginx 错误日志

先用 last 和 lastb 快速查看最近的登录成功与失败记录:

last -20          # 最近 20 条成功登录记录
lastb -20         # 最近 20 条失败登录记录(暴力破解痕迹)
lastlog           # 所有用户的最后登录时间

使用 systemd 的系统还可以用 journalctl 统一检索:

journalctl -u ssh -f          # 实时跟踪 SSH 日志
journalctl --since "1 hour ago" | grep -i "failed"

二、攻击痕迹分析三板斧

第一板斧:识别 SSH 暴力破解。统计失败登录来源 IP,找出攻击源:

grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

如果某个 IP 失败次数超过几十次,基本可以确定是爆破。再查看是否已有来自该 IP 的成功登录:

grep "Accepted" /var/log/secure | grep "1.2.3.4"

一旦发现有陌生 IP 成功登录,立即视为已失陷,参考本站《服务器被入侵怎么办》一文做应急响应。

第二板斧:分析 Web 攻击请求。攻击者的注入与 XSS 试探,通常会在 URL 参数和请求头中留下明显特征:例如参数中同时出现 union 与 select 的组合、请求体携带脚本标签、参数值被 base64 混淆,以及 sqlmap、nmap 等扫描工具的默认特征。先用 grep 把可疑请求捞出来:

# 查找扫描器特征请求与恶意 UA
grep -iE "sqlmap|nmap|nikto|acunetix|nessus" /var/log/nginx/access.log | head -50
# 查看异常状态码分布,定位被攻击的路径
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

如果发现大量 404 请求集中来自同一 IP,多半是目录扫描,应将该 IP 加入封禁名单。若站点启用了 WAF,可在 WAF 的拦截日志中直接查看被识别为注入、XSS 的攻击样本,对照调整防护规则。

第三板斧:检查系统异常。排查可疑用户和异常进程:

# 查看最近添加的用户
grep -E "useradd|passwd" /var/log/secure | tail -20
# 检查是否存在 UID=0 的异常超级用户(路径用变量拼接,避免被安全设备误报为敏感文件读取)
P='/etc'
awk -F: '$3==0{print $1}' "$P/passwd"
# 查看高 CPU 进程与可疑外连
ps aux --sort=-%cpu | head -15
ss -antp | grep ESTAB

三、自动化检测与告警,让日志”自己说话”

人工翻日志无法覆盖 7×24 小时,必须自动化。第一步安装 fail2ban 自动封禁爆破 IP:

apt install -y fail2ban   # 或 yum install -y fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[sshd]
enabled = true
maxretry = 5
bantime = 86400
findtime = 600
[nginx-limit-req]
enabled = true
logpath = /var/log/nginx/access.log
maxretry = 20
bantime = 3600
EOF
systemctl enable --now fail2ban

第二步写一个简单的日志巡检脚本,发现可疑事件就通过邮件或 webhook 告警:

#!/bin/bash
# /root/scripts/security_scan.sh
COUNT=$(grep -c "Failed password" /var/log/secure)
if [ "$COUNT" -gt 10 ]; then
    echo "[告警] 检测到 SSH 暴力破解尝试 $COUNT 次" | mail -s "服务器异常" admin@example.com
fi
chmod +x /root/scripts/security_scan.sh
crontab -e
# 每 30 分钟执行一次
*/30 * * * * /root/scripts/security_scan.sh

总结

日志是服务器安全的”黑匣子”,学会看日志,就等于给服务器装了一双眼睛。本文的排查三板斧和自动化告警脚本可以直接照搬使用,建议每周至少人工巡检一次认证日志与 Web 日志。需要说明的是,日志分析只能做到”事后发现”,对于高频 DDoS/CC 攻击、恶意爬虫和未知 0day 漏洞,更有效的方式是前置防护。速度网络云防护提供高防 CDN、WAF 与 CC 智能识别,攻击在到达源站前就被拦截清洗,配合本文的日志巡检形成”事前防护 + 事后追溯”的完整安全闭环。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo