服务器被入侵了怎么判断?Linux安全审计与入侵痕迹排查完整流程

服务器出现 CPU 异常飙高、流量异常增大、账号登录来自陌生 IP——这些信号可能意味着服务器已经被入侵。入侵检测的难点在于:攻击者通常会尽量隐藏自己的痕迹,普通的查看方式可能无法发现。本文提供一套系统的 Linux 服务器入侵排查流程,帮你在发现异常时快速判断是否被入侵,并找到入侵路径。


一、入侵的常见信号:这些情况需要警惕

  • 🔴 CPU 或网络流量持续异常,但业务量没有增加
  • 🔴 系统日志中出现来自陌生 IP 的登录记录
  • 🔴 发现不认识的系统用户或 SSH 公钥
  • 🔴 安全软件或防火墙规则被修改/删除
  • 🔴 /tmp、/dev/shm 等临时目录下有可执行文件
  • 🔴 收到 IDC 通知,服务器在对外发送大量流量(参与 DDoS 或发送垃圾邮件)
  • 🔴 定时任务(crontab)中出现不认识的条目

二、第一步:排查异常登录记录

# 查看成功登录的历史记录
last | head -30

# 查看登录失败记录(暴力破解尝试)
sudo lastb | head -30

# 查看当前在线用户
who
w

# 查看 SSH 认证日志(关注 Accepted 表示登录成功)
sudo grep "Accepted\|Failed" /var/log/auth.log | tail -50

重点关注:

  • 登录时间是否在非工作时间(凌晨等)
  • 登录来源 IP 是否是你熟悉的地址
  • 是否有来自多个不同 IP 的短时间内大量失败尝试(暴力破解)

三、第二步:检查系统用户与 SSH 授权密钥

# 查看所有可登录的系统用户(UID 大于 1000 通常是普通用户)
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3, $7}' /etc/passwd # 查看有 sudo 权限的用户 grep -v '^#' /etc/sudoers | grep -v '^$' sudo cat /etc/sudoers.d/* # 检查所有用户的 SSH 授权密钥(攻击者常在此添加后门公钥) for user in $(awk -F: '$3 >= 0 {print $1}' /etc/passwd); do
    home=$(eval echo ~$user)
    if [ -f "$home/.ssh/authorized_keys" ]; then
        echo "=== $user ==="
        cat "$home/.ssh/authorized_keys"
    fi
done

如果发现有不认识的 SSH 公钥,说明攻击者已经为自己添加了持久访问后门。


四、第三步:排查可疑进程

# 按 CPU 使用率排序,查看前15个进程
ps aux --sort=-%cpu | head -15

# 查看进程的完整可执行文件路径
ls -la /proc/$(pgrep suspicious_process)/exe 2>/dev/null

# 查找从临时目录运行的进程(高度可疑)
ps aux | awk '{print $11}' | grep -E "^/tmp|^/dev/shm|^/var/tmp"

# 列出所有进程及其可执行文件路径
for pid in /proc/[0-9]*; do
    exe=$(readlink "$pid/exe" 2>/dev/null)
    if [ -n "$exe" ]; then
        echo "PID: ${pid##*/} → $exe"
    fi
done | grep -E "/tmp|/dev/shm|/var/tmp|deleted"

特别警惕进程名后显示 (deleted) 的情况——这意味着进程对应的可执行文件已被删除(攻击者常用的反取证手段)。


五、第四步:检查定时任务(持久化常用手段)

# 检查当前用户的 crontab
crontab -l

# 检查 root 的 crontab
sudo crontab -l

# 检查系统级定时任务
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/

# 检查所有用户的 crontab 文件
sudo ls /var/spool/cron/crontabs/
sudo cat /var/spool/cron/crontabs/*  2>/dev/null

攻击者通常通过 crontab 实现持久化——即使你杀掉了恶意进程,定时任务会定期重新启动它。


六、第五步:排查可疑文件

# 查找最近24小时内被修改的文件(排除系统正常变化目录)
sudo find / -mtime -1 -type f \
  -not -path "/proc/*" \
  -not -path "/sys/*" \
  -not -path "/run/*" \
  -not -path "/dev/*" \
  2>/dev/null | head -50

# 在临时目录查找可执行文件(极度可疑)
sudo find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null

# 查找具有 SUID 权限的非系统文件(攻击者用于提权)
sudo find / -perm -4000 -type f 2>/dev/null | grep -v -E "^/(bin|sbin|usr/bin|usr/sbin|usr/lib)"

# 查找隐藏文件(以 . 开头)在不寻常位置
sudo find /tmp /var/tmp /dev/shm -name ".*" 2>/dev/null

七、第六步:检查网络外联(是否在向外传输数据)

# 查看当前所有网络连接
ss -tnp

# 查找建立连接的外部 IP(过滤本地地址)
ss -tnp | grep ESTAB | grep -v "127.0.0.1\|::1"

# 使用 netstat 查看(效果类似)
netstat -tnp 2>/dev/null | grep ESTABLISHED

# 实时监控网络连接变化
watch -n 2 'ss -tnp | grep ESTAB'

如果发现服务器与陌生 IP(特别是境外 IP)保持大量 ESTABLISHED 连接,需要重点调查。

# 追踪可疑 IP 的归属地
curl -s https://ipinfo.io/可疑IP/json

八、第七步:检查系统关键文件是否被篡改

# 检查 /etc/passwd 和 /etc/shadow 的最后修改时间
ls -la /etc/passwd /etc/shadow /etc/sudoers

# 检查 SSH 配置是否被修改(重点看 PermitRootLogin 和 AuthorizedKeysFile)
cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"

# 使用 debsums 验证系统软件包文件完整性(Debian/Ubuntu)
sudo apt install debsums -y
sudo debsums -s 2>/dev/null | head -30
# 有输出说明对应文件被修改过

九、使用 Rootkit 检测工具

chkrootkit

sudo apt install chkrootkit -y
sudo chkrootkit 2>/dev/null | grep -i "infected\|suspicious\|found"

rkhunter

sudo apt install rkhunter -y
sudo rkhunter --update
sudo rkhunter --check --skip-keypress 2>/dev/null | grep -E "Warning|Found"

这两个工具会检查常见的 Rootkit 特征、系统命令是否被替换、可疑的网络端口等。有告警信息需要人工判断是否为真正的威胁。


十、应急响应:确认入侵后的处置步骤

如果经过排查确认服务器已被入侵,建议按以下优先级处置:

  1. 隔离服务器:通过 IDC 控制台或防火墙切断服务器的入站网络连接(保留你自己的 SSH 访问),防止攻击者继续操作或数据继续外泄
  2. 完整取证快照:在处理之前,对服务器做一个完整快照(通过 IDC 控制台),保留证据,方便后续分析入侵路径
  3. 修改所有凭证:重置所有系统账号密码、SSH 密钥、数据库密码、应用 API 密钥等
  4. 清除后门:删除可疑文件、恶意 crontab、未授权 SSH 公钥、新增的系统用户
  5. 修复入侵路径:分析攻击者是如何进入的(弱密码、未打补丁的 Web 漏洞、Redis 未授权访问等),针对性修复
  6. 评估数据损失:检查数据库是否被拖库、重要文件是否被加密(勒索软件)
  7. 严重情况:重装系统:如果 Rootkit 已深度植入系统,无法确保彻底清除,最安全的做法是从干净的系统镜像重新部署,从备份恢复数据

十一、常见入侵路径与预防措施

入侵路径预防措施
SSH 弱密码暴力破解禁用密码登录,改用 SSH 密钥认证(参考本系列第12篇)
Redis 未授权访问Redis 绑定 127.0.0.1,设置密码认证,不对公网暴露
Web 应用漏洞(SQL注入/文件上传)及时更新 WordPress 插件、框架版本,配置 WAF
过期软件包漏洞定期执行 sudo apt update && sudo apt upgrade
数据库弱密码MySQL/Redis 设置强密码,禁止远程 root 登录
供应链攻击(恶意 npm/pip 包)仔细审查依赖包来源,使用 lockfile 锁定版本

总结

Linux 服务器入侵排查遵循"由表及里"的原则:

  1. 🔍 异常登录 → 检查 auth.log、last 命令
  2. 👤 可疑用户/公钥 → 检查 /etc/passwd、authorized_keys
  3. ⚙️ 异常进程 → ps aux、/proc 目录分析
  4. 持久化手段 → crontab、systemd service
  5. 📁 恶意文件 → find 命令、Rootkit 检测工具
  6. 🌐 网络外联 → ss -tnp 实时监控

最有效的安全策略永远是预防:购买后浪云香港云服务器后,建议立即完成 SSH 密钥配置、禁用密码登录、配置 UFW 防火墙等基础加固(参考本系列第12篇),将入侵风险降到最低。

THE END