跳转到内容

Linux 服务器入侵检测与安全审计实战 2026

Linux 服务器入侵检测与安全审计

🛡️ 服务器被黑,往往在你发现之前就已经发生。 黑客入侵服务器后,通常会植入后门、挖矿程序或窃取数据。等到发现时,损失往往已经造成。本文带你系统掌握 Linux 服务器入侵检测、安全审计与应急响应的全套技能,做到事前防护、事中检测、事后恢复。

本文将带你系统掌握:

  • ✅ 服务器安全检查清单
  • ✅ 入侵痕迹检测(可疑进程、网络连接、用户账号)
  • ✅ 文件完整性检查(AIDE)
  • ✅ Rootkit 检测(RKHunter、Chkrootkit)
  • ✅ 日志分析与异常发现
  • ✅ 常见入侵场景分析
  • ✅ 应急响应流程
  • ✅ 安全加固与持续监控

一、服务器安全检查清单

1.1 日常检查清单

在动手检测之前,先按照以下清单做一次全面检查:

检查项命令说明
当前登录用户w / who是否有异常用户
登录历史last检查异常登录记录
失败登录lastb暴力破解迹象
运行进程ps aux可疑进程
网络连接ss -tlnp异常端口监听
定时任务crontab -l是否被植入恶意任务
SSH 配置检查配置是否允许 root 登录
用户账号cat /etc/passwd异常用户
Sudo 权限cat /etc/sudoers异常提权
异常文件findSUID、最近修改文件

1.2 快速检查脚本

bash
#!/bin/bash
# /opt/scripts/security-check.sh
# 服务器安全快速检查脚本

echo "========== 服务器安全检查 =========="
echo "检查时间: $(date)"
echo ""

echo "--- 当前登录用户 ---"
w
echo ""

echo "--- 最近登录记录(10条)---"
last | head -10
echo ""

echo "--- 失败登录记录(10条)---"
sudo lastb | head -10 2>/dev/null
echo ""

echo "--- 监听端口 ---"
ss -tlnp
echo ""

echo "--- 对外连接 ---"
ss -tnp | grep ESTAB
echo ""

echo "--- 所有用户账号 ---"
cat /etc/passwd | grep -v nologin | grep -v false
echo ""

echo "--- 定时任务 ---"
for user in $(cut -f1 -d: /etc/passwd); do
  crons=$(sudo crontab -u $user -l 2>/dev/null)
  if [ -n "$crons" ]; then
    echo "用户 $user:"
    echo "$crons"
  fi
done
echo ""

echo "--- SUID 文件 ---"
find / -perm -4000 -type f 2>/dev/null
echo ""

echo "--- 最近7天修改的文件 ---"
find / -mtime -7 -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" 2>/dev/null | head -20
echo ""

echo "========== 检查完成 =========="

二、入侵痕迹检测

2.1 检查可疑进程

bash
# 查看所有进程
ps aux --sort=-%cpu | head -20

# 查看占用 CPU 最高的进程
ps aux --sort=-%cpu | head -10

# 查看占用内存最高的进程
ps aux --sort=-%mem | head -10

# 查找可疑进程(挖矿、后门常见特征)
ps aux | grep -iE "miner|xmr|stratum|kdevtmpfsi|kinsing|bash2|sustes"

常见恶意进程特征:

  • 名称为随机字符串
  • CPU 占用极高(挖矿程序)
  • 隐藏进程(ps 看不到,但 /proc 下有)
  • 进程名伪装成系统进程(如 systemdkthreadd

检查隐藏进程:

bash
# 对比 ps 和 /proc
ps aux | awk '{print $2}' | sort > /tmp/ps_pids
ls /proc | grep -E '^[0-9]+$' | sort > /tmp/proc_pids
diff /tmp/ps_pids /tmp/proc_pids

2.2 检查网络连接

bash
# 查看所有监听端口
ss -tlnp
ss -ulnp

# 查看所有建立的连接
ss -tnp
ss -unp

# 查看异常连接(连接到可疑 IP)
ss -tn | grep -v "127.0.0.1" | grep -v "::1"

# 查看网络统计
ss -s

检查可疑连接:

bash
# 查看连接到矿池的常见端口
ss -tn | grep -E ":(3333|4444|5555|7777|9000)"
bash
# 查看连接的外部 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn

排查思路:

  • 连接到未知 IP 的进程
  • 监听了不该监听的端口
  • 大量连接到同一 IP(可能是 C2 服务器)

2.3 检查用户账号

bash
# 查看所有用户
cat /etc/passwd

# 查看可登录用户
grep -v "nologin\|false" /etc/passwd

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

# 查看 sudo 权限
cat /etc/sudoers
cat /etc/sudoers.d/*

# 查看用户组
cat /etc/group | grep -E "sudo|wheel|admin"

# 查看空密码用户
awk -F: '($2==""){print "用户 " $1 " 密码为空"}' /etc/shadow

检查异常账号:

  • 新增的未知用户
  • UID 为 0 的非 root 用户
  • 拥有 sudo 权限的异常用户
  • 拥有 shell 的系统用户
bash
# 检查最近创建的用户
grep -v "nologin\|false" /etc/passwd | grep "/home"
ls -lt /home/

2.4 检查 SSH 密钥

bash
# 检查 authorized_keys 是否被添加
for user_home in /home/* /root; do
  if [ -f "$user_home/.ssh/authorized_keys" ]; then
    echo "=== $user_home/.ssh/authorized_keys ==="
    cat "$user_home/.ssh/authorized_keys"
  fi
done

# 检查 SSH 配置
cat /etc/ssh/sshd_config | grep -E "PermitRootLogin|PasswordAuthentication|PubkeyAuthentication"

常见入侵手段: 黑客获取权限后,会在 ~/.ssh/authorized_keys 中添加自己的公钥,实现免密登录。

2.5 检查定时任务

bash
# 检查所有用户的 crontab
for user in $(cut -f1 -d: /etc/passwd); do
  crons=$(sudo crontab -u $user -l 2>/dev/null)
  if [ -n "$crons" ]; then
    echo "=== 用户 $user 的 crontab ==="
    echo "$crons"
  fi
done

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

# 检查 systemd timer
systemctl list-timers --all

检查内容:

  • 可疑的下载命令(wgetcurl
  • 执行未知脚本
  • 定时清除日志的命令
  • 频繁执行的异常任务

2.6 检查异常文件

bash
# 查找 SUID/SGID 文件(可能被植入后门)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 查找最近修改的文件
find / -mtime -7 -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" -not -path "/var/log/*" 2>/dev/null

# 查找隐藏文件
find / -name ".*" -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20

# 查找 /tmp 下的可执行文件
find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null

# 查找大文件(可能是挖矿程序或数据打包)
find / -size +50M -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20

三、文件完整性检查(AIDE)

3.1 安装 AIDE

AIDE(Advanced Intrusion Detection Environment)是文件完整性检查工具,可以检测文件是否被篡改。

bash
# Ubuntu / Debian
sudo apt install -y aide

# CentOS / RHEL
sudo yum install -y aide

3.2 初始化数据库

bash
# 初始化数据库(需要一些时间)
sudo aideinit

# 或手动初始化
sudo aide --init

# 将新数据库设为基准
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

⚠️ 重要: 数据库初始化必须在系统干净时进行,否则会以被篡改的状态为基准。

3.3 执行检查

bash
# 执行完整性检查
sudo aide --check

# 更新数据库(确认修改合法后)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

3.4 配置监控范围

编辑配置文件 /etc/aide/aide.conf

ini
# 监控规则
# p: 权限
# i: inode
# n: 链接数
# u: 用户
# g: 组
# s: 大小
# md5: MD5 校验
# sha1: SHA1 校验

# 正常监控
Normal = p+i+n+u+g+s+md5+sha1

# 仅监控权限和内容
Log = p+i+n+u+g+s

# 数据库规则
Data = p+i+n+u+g

# 应用规则
/boot Normal
/bin Normal
/sbin Normal
/lib Normal
/usr Normal
/etc Normal

# 日志仅监控属性变化
/var/log Log
/var/log/.* Log

# 不监控的目录
!/proc
!/sys
!/dev
!/run
!/tmp

3.5 定时检查

bash
# 添加定时任务
sudo crontab -e

# 每天凌晨 4 点检查
0 4 * * * /usr/bin/aide --check | mail -s "AIDE 检查报告" admin@example.com

四、Rootkit 检测

4.1 RKHunter

bash
# 安装
sudo apt install -y rkhunter

# 更新数据库
sudo rkhunter --update
sudo rkhunter --propupd

# 执行检查
sudo rkhunter --check

# 仅输出警告
sudo rkhunter --check --report-warnings-only

检查内容包括:

  • 系统命令是否被篡改
  • Rootkit 特征文件
  • 可疑文件和目录
  • 异常的网络端口
  • 启动项检查

4.2 Chkrootkit

bash
# 安装
sudo apt install -y chkrootkit

# 执行检查
sudo chkrootkit

# 仅检查特定项目
sudo chkrootkit | grep -i "INFECTED"

4.3 Lynis(综合安全审计)

bash
# 安装
sudo apt install -y lynis

# 执行完整审计
sudo lynis audit system

# 查看报告
sudo cat /var/log/lynis.log | grep -E "Warning|Suggestion"

五、日志分析

5.1 重要日志文件

日志文件说明
/var/log/auth.log认证日志(Ubuntu/Debian)
/var/log/secure认证日志(CentOS/RHEL)
/var/log/syslog系统日志
/var/log/messages系统日志(CentOS)
/var/log/nginx/access.logNginx 访问日志
/var/log/nginx/error.logNginx 错误日志
/var/log/audit/audit.log审计日志
~/.bash_history用户命令历史

5.2 SSH 登录分析

bash
# 成功登录记录
sudo grep "Accepted" /var/log/auth.log

# 失败登录记录
sudo grep "Failed password" /var/log/auth.log

# 统计失败登录的 IP(暴力破解检测)
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

# 查看成功登录的 IP
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn

# 查看登录的用户
sudo grep "Accepted" /var/log/auth.log | awk '{print $9}' | sort | uniq -c | sort -rn

5.3 异常行为检测

bash
# 检查 sudo 使用记录
sudo grep "sudo" /var/log/auth.log

# 检查用户切换
sudo grep "su:" /var/log/auth.log

# 检查新用户创建
sudo grep "useradd" /var/log/auth.log

# 检查密码修改
sudo grep "passwd" /var/log/auth.log

# 检查服务重启
sudo grep -i "systemctl" /var/log/auth.log

5.4 Nginx 访问日志分析

bash
# 访问量最高的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 访问频率异常(可能是爬虫或攻击)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | awk '$1 > 1000'

# 扫描型请求
grep -E "(\.env|\.git|wp-admin|phpmyadmin|\.ssh)" /var/log/nginx/access.log

# SQL 注入特征
grep -iE "union|select|insert|drop|update" /var/log/nginx/access.log | head -20

# 404 错误最多的 IP
awk '$9 == "404" {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

5.5 命令历史检查

bash
# 检查 root 的命令历史
cat /root/.bash_history

# 检查所有用户的命令历史
for user_home in /home/* /root; do
  if [ -f "$user_home/.bash_history" ]; then
    echo "=== $user_home/.bash_history ==="
    cat "$user_home/.bash_history"
  fi
done

# 检查被清空的命令历史
find /home /root -name ".bash_history" -size 0 2>/dev/null

⚠️ 如果 .bash_history 被清空或大小为 0,可能是入侵者为了掩盖痕迹。


六、常见入侵场景分析

6.1 挖矿木马

特征:

  • CPU 占用 100%
  • 进程名可能是 kdevtmpfsikinsingxmrig
  • 连接到矿池 IP
  • 存在定时任务自动重启

排查:

bash
# 查找高 CPU 进程
top -bn1 | head -20

# 查找挖矿进程
ps aux | grep -iE "miner|xmrig|stratum|kdevtmpfsi"

# 查找定时任务
crontab -l
ls /var/spool/cron/
cat /etc/crontab
ls /etc/cron.d/

清除步骤:

bash
# 1. 杀死进程
kill -9 $(pgrep -f "kdevtmpfsi")

# 2. 删除恶意文件
find / -name "kdevtmpfsi" -delete 2>/dev/null
find / -name "kinsing" -delete 2>/dev/null

# 3. 清除定时任务
crontab -r  # 谨慎操作,确认是恶意的
rm -f /var/spool/cron/*

# 4. 检查并删除 SSH 公钥
cat ~/.ssh/authorized_keys

6.2 Webshell

特征:

  • 网站目录下有可疑 PHP/JSP 文件
  • 文件内容包含 evalsystemexec 等函数
  • 访问日志中有频繁访问某文件

排查:

bash
# 查找 Webshell
find /var/www -name "*.php" -exec grep -l "eval\|system\|exec\|passthru\|shell_exec" {} \;

# 查找最近修改的 PHP 文件
find /var/www -name "*.php" -mtime -7

# 查找隐藏文件
find /var/www -name ".*" -type f

6.3 SSH 暴力破解

特征:

  • 大量失败登录记录
  • 来自同一 IP 的频繁尝试

排查:

bash
# 统计失败登录
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

# 检查是否有成功入侵
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn

防护: 使用 Fail2ban 自动封禁恶意 IP。


七、应急响应流程

7.1 应急响应步骤

当发现服务器被入侵时,按以下步骤处理:

步骤 1:隔离服务器

bash
# 断开网络(如果确认被入侵)
# 注意:这会断开 SSH 连接
sudo ifdown eth0
# 或
sudo ip link set eth0 down

💡 如果需要保持 SSH 连接,可以只阻断出站流量:

bash
sudo iptables -A OUTPUT -d 攻击者IP -j DROP

步骤 2:保留证据

bash
# 记录当前状态
ps aux > /tmp/evidence_ps.txt
ss -tlnp > /tmp/evidence_ss.txt
ss -tnp >> /tmp/evidence_ss.txt
last > /tmp/evidence_last.txt
lastb > /tmp/evidence_lastb.txt
dmesg > /tmp/evidence_dmesg.txt

# 备份日志
sudo tar czf /tmp/logs_backup.tar.gz /var/log/

步骤 3:分析入侵路径

  • 检查日志找到入侵入口
  • 确定入侵时间和方式
  • 评估影响范围

步骤 4:清除威胁

  • 杀死恶意进程
  • 删除恶意文件
  • 清除定时任务
  • 删除异常用户
  • 清除 SSH 公钥

步骤 5:修复漏洞

  • 更新系统和软件
  • 修改所有密码
  • 修复被利用的漏洞
  • 加固服务器安全

步骤 6:恢复服务

  • 确认系统干净后重新上线
  • 持续监控一段时间

7.2 被入侵后的清理清单

bash
# 1. 修改 root 密码
sudo passwd root

# 2. 修改所有用户密码
for user in $(cut -f1 -d: /etc/passwd); do
  sudo passwd $user
done

# 3. 重新生成 SSH 密钥
rm -rf ~/.ssh
ssh-keygen -t ed25519 -C "your@email.com"

# 4. 清理 authorized_keys
echo "" > ~/.ssh/authorized_keys

# 5. 删除可疑用户
sudo userdel -r suspicious_user

# 6. 清理定时任务
sudo crontab -r
sudo rm -f /var/spool/cron/*
sudo rm -f /etc/cron.d/*

# 7. 杀死可疑进程
sudo pkill -f suspicious_process

# 8. 更新系统
sudo apt update && sudo apt upgrade -y

八、安全加固

8.1 SSH 加固

bash
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config

# 关键配置
Port 2222                      # 修改默认端口
PermitRootLogin no             # 禁止 root 登录
PasswordAuthentication no      # 禁用密码登录
PubkeyAuthentication yes       # 使用密钥登录
MaxAuthTries 3                 # 最大尝试次数
AllowUsers your_username       # 只允许指定用户

8.2 防火墙配置

bash
# 使用 UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp    # SSH
sudo ufw allow 80/tcp      # HTTP
sudo ufw allow 443/tcp     # HTTPS
sudo ufw enable

8.3 安装 Fail2ban

bash
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

8.4 禁用不必要的服务

bash
# 查看运行的服务
systemctl list-units --type=service --state=running

# 禁用不必要的服务
sudo systemctl disable unnecessary-service
sudo systemctl stop unnecessary-service

8.5 自动安全更新

bash
# Ubuntu/Debian
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

九、持续监控

9.1 日志监控工具

工具说明
Logwatch日志摘要邮件报告
Logcheck异常日志告警
Auditd系统审计
OSSEC开源 HIDS
Wazuh企业级 SIEM

9.2 安装 Auditd

bash
# 安装
sudo apt install -y auditd

# 添加审计规则
sudo auditctl -w /etc/passwd -p wa -k identity
sudo auditctl -w /etc/sudoers -p wa -k actions
sudo auditctl -w /var/log/auth.log -p wa -k logins

# 查看审计日志
sudo ausearch -k identity
sudo ausearch -k logins

9.3 使用 Logwatch

bash
# 安装
sudo apt install -y logwatch

# 手动生成报告
sudo logwatch --detail High --range today

# 配置邮件发送
sudo nano /etc/logwatch/conf/logwatch.conf
# 添加:
# MailTo = your@email.com
# Range = yesterday
# Detail = High

9.4 定期安全检查脚本

bash
#!/bin/bash
# /opt/scripts/weekly-security-check.sh

EMAIL="your@email.com"
REPORT="/tmp/security-report.txt"

echo "每周安全检查报告" > $REPORT
echo "生成时间: $(date)" >> $REPORT
echo "服务器: $(hostname)" >> $REPORT
echo "" >> $REPORT

echo "=== 失败登录 TOP 10 ===" >> $REPORT
sudo grep "Failed password" /var/log/auth.log 2>/dev/null | \
  awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10 >> $REPORT
echo "" >> $REPORT

echo "=== 新增用户 ===" >> $REPORT
sudo grep "useradd" /var/log/auth.log 2>/dev/null >> $REPORT
echo "" >> $REPORT

echo "=== SUID 文件变化 ===" >> $REPORT
sudo aide --check 2>&1 | head -20 >> $REPORT
echo "" >> $REPORT

echo "=== 高 CPU 进程 ===" >> $REPORT
ps aux --sort=-%cpu | head -10 >> $REPORT
echo "" >> $REPORT

# 发送邮件
mail -s "每周安全检查报告 - $(hostname)" $EMAIL < $REPORT
bash
# 设置定时任务
sudo crontab -e

# 每周一早上 8 点执行
0 8 * * 1 /opt/scripts/weekly-security-check.sh

十、常用命令速查

bash
# 进程检查
ps aux --sort=-%cpu | head -10         # CPU 占用最高
ps aux --sort=-%mem | head -10         # 内存占用最高
ps aux | grep -iE "miner|xmrig"        # 查找挖矿进程

# 网络检查
ss -tlnp                               # 监听端口
ss -tnp                                # 建立的连接
ss -tn | awk '{print $5}' | sort | uniq -c | sort -rn  # 连接统计

# 用户检查
w                                      # 当前登录用户
last                                   # 登录历史
awk -F: '$3==0 {print $1}' /etc/passwd  # UID=0 用户

# 文件检查
find / -perm -4000 -type f 2>/dev/null  # SUID 文件
find / -mtime -7 -type f 2>/dev/null | head -20  # 最近修改文件
find /tmp -type f -executable 2>/dev/null  # /tmp 下可执行文件

# 日志检查
grep "Failed password" /var/log/auth.log  # 失败登录
grep "Accepted" /var/log/auth.log         # 成功登录
grep "useradd" /var/log/auth.log          # 用户创建

# 工具
sudo rkhunter --check                   # Rootkit 检测
sudo aide --check                        # 文件完整性
sudo lynis audit system                  # 综合审计

十一、总结

服务器安全是一个持续的过程:

  1. 预防为主:及时更新、关闭不必要的服务、配置防火墙
  2. 定期检查:定期运行安全检查脚本和工具
  3. 实时监控:使用 AIDE、Auditd 等工具持续监控
  4. 快速响应:发现入侵后按流程快速处理
  5. 总结复盘:每次安全事件后总结经验,完善防护

🛡️ 安全没有银弹,但你可以通过系统化的检测和加固,将风险降到最低。最好的入侵检测,是你在黑客之前发现自己的漏洞。


相关文章推荐: