一、概述
1.1 背景介绍
在一次生产环境监控告警中,几台服务器的CPU使用率异常飙升至100%。经排查,发现是攻击者通过一个旧版本Redis的未授权访问漏洞植入挖矿病毒所致。本次事件促使我们总结了一套完整的入侵后应急响应与系统加固方案。
1.2 技术特点
- 时效性:响应需迅速,攻击者可能在线并随时清理痕迹。
- 系统性:需对进程、网络、用户、定时任务、启动项等进行全方位排查。
- 证据保全:在处置前,应首先收集并保存相关证据,便于后续溯源与分析。
1.3 适用场景
- 服务器资源(CPU/内存)异常飙升,疑似挖矿。
- 发现可疑进程或异常外连。
- 收到云平台安全告警(如DDoS、挖矿、木马)。
- 系统日志中出现大量异常登录记录。
1.4 环境要求
| 组件 |
版本要求 |
说明 |
| 操作系统 |
CentOS 7+ / Ubuntu 18.04+ |
本文命令兼容主流发行版 |
| 排查工具 |
rkhunter, chkrootkit, unhide |
可选,用于深度检测 |
| 网络工具 |
netstat/ss, lsof |
系统自带 |
二、详细步骤
2.1 应急响应第一步:冷静,别瞎操作
发现入侵迹象后,切忌立即杀死进程或重装系统。正确步骤如下:
1. 评估业务影响,决定是否断网
# 查看当前业务连接数
ss -ant | grep ESTABLISHED | wc -l
# 若非核心业务且可隔离,可考虑断开公网(保留自身SSH连接)
iptables -I INPUT -j DROP
iptables -I OUTPUT -j DROP
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
# 建议在云平台控制台为系统盘创建快照
2.2 入侵排查流程
进行Linux安全排查时,需遵循系统化流程。
◆ 2.2.1 检查异常进程
# 按资源使用排序
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
ps auxf # 查看进程树
# 查看进程真实信息(假设PID为12345)
ls -la /proc/12345/exe # 真实可执行文件路径
cat /proc/12345/cmdline | tr ‘\0‘ ‘ ‘ # 命令行参数
cat /proc/12345/environ | tr ‘\0‘ ‘\n‘ # 环境变量
关注点:/tmp、/var/tmp、/dev/shm下的进程;进程名随机或伪装。
◆ 2.2.2 检查异常网络连接
# 查看所有连接
ss -antup
# 查看监听端口
ss -tlnp
# 使用lsof查看
lsof -i
lsof -i @外网IP
lsof -p 12345 -i
# 查询可疑IP信息
curl ipinfo.io/12.34.56.78
关注点:连接陌生IP或矿池端口(如3333, 5555);存在大量对外连接。
◆ 2.2.3 检查异常用户和权限
# 检查UID为0的用户(除root外)
awk -F: ‘$3==0 {print $1}‘ /etc/passwd
# 检查可登录用户
grep -v ‘/nologin\|/false‘ /etc/passwd
# 检查新增用户
ls -lt /home/
# 检查sudoers
cat /etc/sudoers && ls -la /etc/sudoers.d/
# 检查SSH公钥
cat /root/.ssh/authorized_keys
for user in $(ls /home); do cat /home/$user/.ssh/authorized_keys 2>/dev/null; done
◆ 2.2.4 检查定时任务
# 检查各用户任务
crontab -l
for user in $(cut -d: -f1 /etc/passwd); do crontab -l -u $user 2>/dev/null; done
# 检查系统任务
cat /etc/crontab
ls -la /etc/cron.*/
# 检查systemd定时器
systemctl list-timers --all
# 查找最近修改的任务文件
find /etc/cron* -mtime -7 -type f
◆ 2.2.5 检查启动项
# SysV Init
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
◆ 2.2.6 检查系统日志
# 登录历史
last -n 50
lastb -n 50 # 失败尝试
# 认证日志(CentOS/Ubuntu)
tail -500 /var/log/secure | grep -i ‘accepted\|failed‘ # CentOS
tail -500 /var/log/auth.log | grep -i ‘accepted\|failed‘ # Ubuntu
# 分析暴力破解
grep “Failed password” /var/log/secure | awk ‘{print $(NF-3)}‘ | sort | uniq -c | sort -rn
# 系统日志
tail -500 /var/log/messages
journalctl -xe --no-pager | tail -200
◆ 2.2.7 检查Rootkit
# 使用rkhunter
yum install -y rkhunter # CentOS
apt install -y rkhunter # Ubuntu
rkhunter --update && rkhunter --check --sk
# 使用chkrootkit
yum install -y chkrootkit
chkrootkit
# 使用unhide检测隐藏项
yum install -y unhide
unhide proc && unhide sys && unhide-tcp
2.3 清除恶意程序
确认后按顺序清理,防止复活。
# 1. 终止进程
kill -9 <PID>
# 2. 删除文件(注意解除锁定)
lsattr /tmp/恶意文件
chattr -i /tmp/恶意文件
rm -f /tmp/恶意文件
# 3. 清理定时任务
crontab -e # 手动删除
rm -f /etc/cron.d/可疑文件
# 4. 清理启动项
systemctl disable 可疑服务
rm -f /etc/systemd/system/可疑服务.service
systemctl daemon-reload
# 5. 清理后门用户及SSH公钥
userdel -r 后门用户名
vim /root/.ssh/authorized_keys # 删除不明密钥
2.4 系统加固
清理后必须进行Linux安全加固,防止再次入侵。
# 1. SSH加固
vim /etc/ssh/sshd_config
# Port 22222
# PermitRootLogin no
# PasswordAuthentication no
systemctl restart sshd
# 2. 防火墙配置
# CentOS 7+
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
# 3. 系统及软件更新
yum update -y # CentOS
apt update && apt upgrade -y # Ubuntu
# 4. 修复漏洞(如Redis)
vim /etc/redis.conf
# requirepass 你的强密码
# bind 127.0.0.1
# 5. 安装fail2ban防暴破
yum install -y fail2ban
systemctl enable fail2ban && systemctl start fail2ban
三、示例代码和配置
3.1 完整排查脚本
以下脚本用于一键收集安全状态信息。
#!/bin/bash
# security_check.sh - Linux安全排查脚本
echo “========================================"
echo “检查时间: $(date ‘+%Y-%m-%d %H:%M:%S‘)“
echo “主机名: $(hostname)“
echo “========================================"
echo “=== 1. 系统基本信息 ==="
uname -a
cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null
echo “=== 2. 资源占用TOP10进程 ==="
ps aux --sort=-%cpu | head -11
ps aux --sort=-%mem | head -11
ps auxf
echo “=== 3. 网络信息 ==="
ss -antup 2>/dev/null || netstat -antup
ss -tlnp 2>/dev/null || netstat -tlnp
echo “=== 4. 用户与权限 ==="
awk -F: ‘$3==0 {print $1}‘ /etc/passwd
grep -v ‘/nologin\|/false‘ /etc/passwd
cat /root/.ssh/authorized_keys 2>/dev/null
echo “=== 5. 计划任务 ==="
crontab -l 2>/dev/null
cat /etc/crontab 2>/dev/null
ls -la /etc/cron.d/ 2>/dev/null
echo “=== 6. 登录日志 ==="
last -n 20
lastb -n 20 2>/dev/null
echo “=== 7. 可疑文件 ==="
find /tmp /var/tmp /dev/shm -mtime -7 -type f 2>/dev/null
echo “=== 8. 系统服务 ==="
systemctl list-unit-files --type=service | grep enabled
cat /etc/rc.local 2>/dev/null
echo “=== 排查完成 ==="
使用方法:
chmod +x security_check.sh
./security_check.sh > check_result_$(date +%Y%m%d).txt 2>&1
3.2 实际应用案例
◆ 案例一:挖矿病毒排查
症状:CPU 100%,存在kworkerds进程。
排查:
ps aux | grep kworkerds # 发现路径 /tmp/.X11-unix/kworkerds
ls -la /proc/<PID>/exe # 确认路径
ss -antp | grep <PID> # 发现连接矿池端口3333
crontab -l # 发现恶意定时任务
处置:杀进程、删文件、清定时任务。
根源:Redis未授权访问漏洞。
◆ 案例二:SSH暴力破解
症状:/var/log/secure中大量失败记录,某弱密码账户被攻破。
排查:
grep “Failed password” /var/log/secure | awk ‘{print $(NF-3)}‘ | sort | uniq -c | sort -rn
grep “Accepted” /var/log/secure | tail -20
cat /home/<被攻破用户>/.bash_history
crontab -l -u <被攻破用户>
加固:禁用密码登录,配置fail2ban。
四、最佳实践和注意事项
4.1 最佳实践
◆ 4.1.1 日常安全加固清单
# SSH加固
cat >> /etc/ssh/sshd_config << ‘EOF‘
Port 22222
PermitRootLogin no
PasswordAuthentication no
AllowUsers ops deploy
EOF
# 系统账户安全
for user in bin daemon adm lp sync shutdown halt mail operator games ftp; do
usermod -s /sbin/nologin $user 2>/dev/null
done
# 文件权限
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 700 /root
◆ 4.1.2 定期安全审计
建议通过定时任务每周执行安全检查并发送报告。
0 2 * * 1 /opt/scripts/security_check.sh | mail -s “周安全检查报告” admin@company.com
4.2 注意事项
- 谨慎使用本地命令:攻击者可能替换
ps、netstat等,建议使用从可信源获取的静态工具。
- 彻底清理:注意守护进程、文件锁定(
chattr +i)、多个持久化位置(定时任务、服务、启动脚本)。
- 考虑横向移动:检查同一内网其他服务器是否受影响。
- 重装系统的时机:发现Rootkit、内核被篡改、或无法确认清理干净时,重装可能是更高效的选择。
五、故障排查和监控
5.1 日志分析技巧
# 统计登录失败TOP 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 -E ‘useradd|userdel|passwd|sudo|su ‘ /var/log/secure
5.2 监控指标与简易脚本
| 指标 |
告警阈值 |
说明 |
| CPU使用率 |
>90% 持续5分钟 |
排除业务峰值 |
| 异常外连数 |
>200/分钟 |
可能扫描或DDoS |
| SSH登录失败 |
>100/小时 |
可能暴力破解 |
| 新增用户/定时任务 |
>0 |
立即告警 |
#!/bin/bash
# 简易监控脚本 (可通过cron每分钟执行)
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
suspicious_ports=“3333 4444 5555“
for port in $suspicious_ports; do
count=$(ss -ant | grep “:$port” | grep ESTAB | wc -l)
[ $count -gt 0 ] && echo “告警:发现连接到可疑端口 $port”
done
六、总结
- 应急响应:保持冷静,先取证后处置。
- 排查方法:系统化检查进程、网络、用户、任务、启动项及日志。
- 清理加固:彻底清除并修复漏洞,实施最小权限原则。
- 进阶方向:考虑部署HIDS(如OSSEC)、搭建集中化日志分析平台(如ELK)、定期进行安全基线扫描。
附录:命令速查表
# 进程
ps aux --sort=-%cpu | head -20
ls -la /proc/<PID>/exe
# 网络
ss -antup
lsof -i
# 用户
awk -F: ‘$3==0 {print $1}‘ /etc/passwd
last -n 50
# 任务
crontab -l
systemctl list-timers
# 文件
find /tmp -mtime -7 -type f
lsattr <file> ; chattr -i <file>