Skip to content

🔍 入侵检测 ​

安全加固是"防",入侵检测是"发现"。再牢固的防御也有被突破的可能。及早发现入侵迹象,及时响应,才能把损失降到最低。

入侵的典型迹象 ​

当攻击者进入系统后,通常会留下以下痕迹:

迹象具体表现排查命令
异常登录陌生 IP、半夜登录、从未知地域last, lastlog, who
陌生进程CPU/内存异常高、奇怪进程名ps aux, top, htop
异常网络连接连接到境外 IP、非业务端口ss -tunap, netstat
crontab 被改多出陌生定时任务下载/执行脚本crontab -l, ls /etc/cron.*
用户异常新增陌生用户、uid=0 的隐藏账户cat /etc/passwd, awk -F: '$3==0' /etc/passwd
文件变更关键系统文件被替换、多了 SUID 文件rpm -Va 或 AIDE 检查

手动排查 Checklist ​

当你怀疑服务器被入侵时,按以下顺序快速排查:

1. 检查当前登录和登录历史 ​

bash
# 当前谁在登录
who
w

# 最近登录记录
last -n 50
lastlog

# 失败的登录尝试
sudo lastb | tail -30

# 检查当前登录会话
ss -tnp | grep sshd

2. 检查用户和权限 ​

bash
# 所有 UID=0 的用户(root 权限)
awk -F: '($3 == 0) {print}' /etc/passwd

# 最近创建的用户
sudo find /etc -name passwd -exec cat {} \; | tail -5
sudo cat /etc/group | grep sudo

# 检查无密码用户
awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow

3. 检查异常进程和网络连接 ​

bash
# 查看所有进程(异常:名字里带空格/tmp路径/高CPU但名字奇怪)
ps auxf

# 查看所有监听端口和对应进程
sudo ss -tunap

# 查看对外连接(排查反弹 shell)
sudo ss -tnp state established

# 查找隐藏进程(对比 /proc 和 ps 输出)
ls /proc | grep -E '^[0-9]+$' | while read pid; do
    if ! ps -p $pid > /dev/null 2>&1; then
        echo "可能的隐藏进程: PID=$pid, cmdline=$(cat /proc/$pid/cmdline 2>/dev/null)"
    fi
done

反弹 shell 特征

连接目标端口是常见反弹 shell 端口(4444/5555/6666/7777/8888),或者连接的远程 IP 在可疑地区(朝鲜/伊朗/东欧等),进程命令行中含有 /dev/tcp、nc、bash -i 等特征。

4. 检查计划任务和启动项 ​

bash
# 所有用户的 crontab
for user in $(cut -d: -f1 /etc/passwd); do
    sudo crontab -u $user -l 2>/dev/null
done

# 系统级 cron
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/ /etc/cron.monthly/

# systemd 定时器
systemctl list-timers --all

# 启动项
ls -la /etc/init.d/
ls -la /etc/systemd/system/
ls -la /etc/rc*.d/

# 用户级启动
cat ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/null

5. 检查可疑文件和 SUID ​

bash
# 查找最近 24 小时内修改的文件
find / -type f -mtime -1 2>/dev/null | grep -v '^/proc\|^/sys\|^/dev'

# 查找 SUID 文件(普通用户能以 root 权限执行的程序)
find / -perm -4000 -type f 2>/dev/null

# 查找隐藏文件(非正常位置)
find / -name ".*" -type f 2>/dev/null | grep -v '^/proc\|^/sys'

# 检查 /tmp 目录
ls -la /tmp /var/tmp /dev/shm

rkhunter / chkrootkit 使用 ​

自动化的 rootkit 扫描工具,能检测常见后门和 rootkit:

bash
# === rkhunter ===
sudo apt install rkhunter

# 更新特征库
sudo rkhunter --update

# 更新文件属性数据库
sudo rkhunter --propupd

# 执行扫描
sudo rkhunter --check --skip-keypress

# 查看详细报告
sudo cat /var/log/rkhunter.log

# === chkrootkit ===
sudo apt install chkrootkit

# 执行扫描
sudo chkrootkit

# 每日自动扫描(加入 cron)
echo "0 4 * * * root /usr/sbin/chkrootkit 2>&1 | mail -s 'chkrootkit report' admin@example.com" \
  >> /etc/cron.d/chkrootkit

rkhunter 常见误报

rkhunter 有时会误报 /usr/bin/ldd、/usr/sbin/unhide 等文件为可疑。这是正常现象,先确认再行动。

AIDE 文件完整性监控 ​

AIDE 不仅能做一次性的文件检查,更适合持续监控:

bash
# 每日检查计划(加入 cron)
cat > /etc/cron.daily/aide-check <<'EOF'
#!/bin/bash
/usr/bin/aide -c /etc/aide/aide.conf --check | \
  mail -s "AIDE Report $(date +%Y-%m-%d)" admin@example.com
EOF
chmod +x /etc/cron.daily/aide-check

关键配置文件被篡改时,AIDE 会精确地告诉哪些文件的什么属性变了。

实战:发现异常登录后的排查步骤 ​

假设场景:凌晨 3 点,你在日志中发现来自一个境外 IP 的 SSH 成功登录。

Step 1:立即取证,不要关机 ​

bash
# 保留当前状态的一切证据!
# ⚠ 不要关机、不要 reboot、不要轻易修改任何文件

# 记录当前时间
date > /root/incident_$(date +%Y%m%d_%H%M%S).log

# 记录进程快照(防止攻击者清理后丢失)
ps auxf >> /root/incident_$(date +%Y%m%d_%H%M%S).log
ss -tunap >> /root/incident_$(date +%Y%m%d_%H%M%S).log
netstat -s >> /root/incident_$(date +%Y%m%d_%H%M%S).log

Step 2:分析入侵 ​

bash
# 查这个 IP 做了什么
sudo journalctl -u ssh --since "2026-07-24" | grep "那个可疑IP"

# 检查该 IP 登录后运行了什么
sudo cat /var/log/auth.log | grep "那个IP" | tail -50

# 检查 history
cat /home/受影响用户/.bash_history
# 查看 root 的操作记录
cat /root/.bash_history

Step 3:确认影响范围 ​

bash
# 检查是否新增了后门账号
grep -v "^#" /etc/passwd | awk -F: '($3 >= 1000 || $3 == 0) {print}'

# 检查 SSH authorized_keys
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys

# 检查是否以 root 运行了恶意进程
ps aux | grep -v grep | grep "^\s*root" | grep -E "tmp|dev/shm|\.hidden"

Step 4:隔离与清除 ​

bash
# 先封禁攻击 IP
sudo ufw deny from <攻击IP>

# 或直接用 iptables
sudo iptables -A INPUT -s <攻击IP> -j DROP

# 修改所有用户密码
sudo passwd root
sudo passwd 受影响用户

# 排查并清理后门(参考 Step 3 的结果)

🧪 练习题 ​

  1. 用 last、lastb、ss 命令做一次完整的登录和网络连接审计
  2. 安装 rkhunter,运行一次完整扫描,分析报告中的警告
  3. 模拟一个入侵场景:创建一个隐藏 SUID 文件和一条奇怪的 crontab,然后做一次完整的入侵排查

入侵检测靠的是"看见"——下一节我们来搭建—套完善的日志审计体系。


🎯 本章要点 ​

  • 先取证再处理。who 看当前谁在线,last 看最近登录
  • 正常情况只有 root 的 uid=0。
  • 半夜陌生 IP 登录、多出下载脚本的 cron 任务
加载练习题中...