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

🛡️ 服务器被黑,往往在你发现之前就已经发生。 黑客入侵服务器后,通常会植入后门、挖矿程序或窃取数据。等到发现时,损失往往已经造成。本文带你系统掌握 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 | 异常提权 |
| 异常文件 | find | SUID、最近修改文件 |
1.2 快速检查脚本
#!/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 检查可疑进程
# 查看所有进程
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下有) - 进程名伪装成系统进程(如
systemd、kthreadd)
检查隐藏进程:
# 对比 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_pids2.2 检查网络连接
# 查看所有监听端口
ss -tlnp
ss -ulnp
# 查看所有建立的连接
ss -tnp
ss -unp
# 查看异常连接(连接到可疑 IP)
ss -tn | grep -v "127.0.0.1" | grep -v "::1"
# 查看网络统计
ss -s检查可疑连接:
# 查看连接到矿池的常见端口
ss -tn | grep -E ":(3333|4444|5555|7777|9000)"# 查看连接的外部 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn排查思路:
- 连接到未知 IP 的进程
- 监听了不该监听的端口
- 大量连接到同一 IP(可能是 C2 服务器)
2.3 检查用户账号
# 查看所有用户
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 的系统用户
# 检查最近创建的用户
grep -v "nologin\|false" /etc/passwd | grep "/home"
ls -lt /home/2.4 检查 SSH 密钥
# 检查 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 检查定时任务
# 检查所有用户的 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检查内容:
- 可疑的下载命令(
wget、curl) - 执行未知脚本
- 定时清除日志的命令
- 频繁执行的异常任务
2.6 检查异常文件
# 查找 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)是文件完整性检查工具,可以检测文件是否被篡改。
# Ubuntu / Debian
sudo apt install -y aide
# CentOS / RHEL
sudo yum install -y aide3.2 初始化数据库
# 初始化数据库(需要一些时间)
sudo aideinit
# 或手动初始化
sudo aide --init
# 将新数据库设为基准
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db⚠️ 重要: 数据库初始化必须在系统干净时进行,否则会以被篡改的状态为基准。
3.3 执行检查
# 执行完整性检查
sudo aide --check
# 更新数据库(确认修改合法后)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db3.4 配置监控范围
编辑配置文件 /etc/aide/aide.conf:
# 监控规则
# 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
!/tmp3.5 定时检查
# 添加定时任务
sudo crontab -e
# 每天凌晨 4 点检查
0 4 * * * /usr/bin/aide --check | mail -s "AIDE 检查报告" admin@example.com四、Rootkit 检测
4.1 RKHunter
# 安装
sudo apt install -y rkhunter
# 更新数据库
sudo rkhunter --update
sudo rkhunter --propupd
# 执行检查
sudo rkhunter --check
# 仅输出警告
sudo rkhunter --check --report-warnings-only检查内容包括:
- 系统命令是否被篡改
- Rootkit 特征文件
- 可疑文件和目录
- 异常的网络端口
- 启动项检查
4.2 Chkrootkit
# 安装
sudo apt install -y chkrootkit
# 执行检查
sudo chkrootkit
# 仅检查特定项目
sudo chkrootkit | grep -i "INFECTED"4.3 Lynis(综合安全审计)
# 安装
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.log | Nginx 访问日志 |
/var/log/nginx/error.log | Nginx 错误日志 |
/var/log/audit/audit.log | 审计日志 |
~/.bash_history | 用户命令历史 |
5.2 SSH 登录分析
# 成功登录记录
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 -rn5.3 异常行为检测
# 检查 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.log5.4 Nginx 访问日志分析
# 访问量最高的 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 -105.5 命令历史检查
# 检查 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%
- 进程名可能是
kdevtmpfsi、kinsing、xmrig等 - 连接到矿池 IP
- 存在定时任务自动重启
排查:
# 查找高 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/清除步骤:
# 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_keys6.2 Webshell
特征:
- 网站目录下有可疑 PHP/JSP 文件
- 文件内容包含
eval、system、exec等函数 - 访问日志中有频繁访问某文件
排查:
# 查找 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 f6.3 SSH 暴力破解
特征:
- 大量失败登录记录
- 来自同一 IP 的频繁尝试
排查:
# 统计失败登录
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:隔离服务器
# 断开网络(如果确认被入侵)
# 注意:这会断开 SSH 连接
sudo ifdown eth0
# 或
sudo ip link set eth0 down💡 如果需要保持 SSH 连接,可以只阻断出站流量:
bashsudo iptables -A OUTPUT -d 攻击者IP -j DROP
步骤 2:保留证据
# 记录当前状态
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 被入侵后的清理清单
# 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 加固
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config
# 关键配置
Port 2222 # 修改默认端口
PermitRootLogin no # 禁止 root 登录
PasswordAuthentication no # 禁用密码登录
PubkeyAuthentication yes # 使用密钥登录
MaxAuthTries 3 # 最大尝试次数
AllowUsers your_username # 只允许指定用户8.2 防火墙配置
# 使用 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 enable8.3 安装 Fail2ban
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban8.4 禁用不必要的服务
# 查看运行的服务
systemctl list-units --type=service --state=running
# 禁用不必要的服务
sudo systemctl disable unnecessary-service
sudo systemctl stop unnecessary-service8.5 自动安全更新
# 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
# 安装
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 logins9.3 使用 Logwatch
# 安装
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 = High9.4 定期安全检查脚本
#!/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# 设置定时任务
sudo crontab -e
# 每周一早上 8 点执行
0 8 * * 1 /opt/scripts/weekly-security-check.sh十、常用命令速查
# 进程检查
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 # 综合审计十一、总结
服务器安全是一个持续的过程:
- 预防为主:及时更新、关闭不必要的服务、配置防火墙
- 定期检查:定期运行安全检查脚本和工具
- 实时监控:使用 AIDE、Auditd 等工具持续监控
- 快速响应:发现入侵后按流程快速处理
- 总结复盘:每次安全事件后总结经验,完善防护
🛡️ 安全没有银弹,但你可以通过系统化的检测和加固,将风险降到最低。最好的入侵检测,是你在黑客之前发现自己的漏洞。
相关文章推荐: