全系列回顾
前三篇构建了完整的防御体系:从边界的 SSH + UFW + Fail2ban、系统层的内核与权限加固、到内核级的 AppArmor + Auditd。
最后一章回答一个问题:怎么知道这些配置真的生效了?怎么及时发现系统被入侵了?
工具组合策略
安全审计没有银弹。四款开源工具各有分工,组合使用才完整:
| 工具 | 回答什么问题 | 频率 |
|---|---|---|
| Lynis | 系统配置有没有安全漏洞? | 每月 |
| AIDE | 关键文件有没有被篡改? | 每日自动 |
| chkrootkit | 系统有没有被植入 Rootkit? | 每周 |
| grep/journalctl | 有没有可疑的登录或操作? | 每天 |
三工具在 2025 年学术文献中已被纳入统一合规聚合框架(权重:Lynis 0.4 + OpenSCAP 0.4 + AIDE 0.2)。chkrootkit 补充入侵检测维度。
Lynis —— 系统安全审计
Lynis 是一个无依赖的 Shell 脚本,扫描 200+ 项安全检查,输出 0-100 的**硬化指数(Hardening Index)**和详细修复建议。
1. 安装
# Ubuntu/Debiansudo apt install lynis -y
# 或直接从 GitHub 获取最新版git clone https://github.com/CISOfy/lynis.gitcd lynis && sudo ./lynis audit systemLynis Community Edition 使用 GPLv3 许可。CISOfy 另提供企业版(集中管理面板),但社区版完全够用。
2. 运行系统审计
# 基础审计sudo lynis audit system
# 只检查内核和网络相关sudo lynis audit system --tests "KRNL-* NETW-* FIRE-*"3. 解读输出
# 执行后关注三段内容:
# ===== 1. 警告 (Warnings) =====# 需要立即处理的严重问题,例如:# - No password set for account 'root'# - Syslog is not running# 每个 Warning 后面会给出修复建议。
# ===== 2. 建议 (Suggestions) =====# 优化项,例如:# - Consider hardening SSH configuration# - Install a file integrity tool to monitor changes
# ===== 3. 硬化指数 (Hardening Index) =====# 输出示例:# Hardening index : 72 [###########.........]# 目标:生产服务器至少 75+,高安全环境 85+
# 详细报告保存在 /var/log/lynis-report.dat4. 持续改进
# 每次审计后跟踪进展sudo lynis audit system | grep "Hardening index"
# 对比上次评分# 修复 Warning → 再扫一次 → 看分数涨了多少AIDE —— 文件完整性监控
AIDE(Advanced Intrusion Detection Environment)是文件完整性检查器。它先对所有关键文件生成加密哈希基线,之后定期比对——任何文件的增、删、改都会被检测到。
1. 安装与基线初始化
sudo apt install aide -y
# 初始化基线数据库sudo aideinit
# aideinit 会生成 /var/lib/aide/aide.db.new# 需要重命名才能正式生效sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db2. 配置监控范围
编辑 /etc/aide/aide.conf 定制要监控的文件和目录。以下是核心配置:
# 数据库路径database=file:/var/lib/aide/aide.dbdatabase_out=file:/var/lib/aide/aide.db.new
# 监控规则定义# p: 权限 i: inode n: 链接数 u: 所有者 g: 组# s: 大小 m: mtime c: ctime a: atime# md5: MD5 校验 sha256: SHA256 校验
# 对所有关键目录使用最严格规则/etc NORMAL/bin NORMAL/sbin NORMAL/usr/bin NORMAL/usr/sbin NORMAL
# 对日志目录只检查权限和所有者(日志内容频繁变更)/var/log LOGS
# 排除不需要检查的路径!/var/log/journal!/var/log/lastlog!/var/tmpNORMAL 和 LOGS 是预定义规则组,默认配置文件中已定义好。
3. 检查变更
# 运行完整性检查sudo aide --check
# 检查完后比对结果。如果有变更,输出格式:# - Added: 新文件# - Removed: 文件被删# - Changed: 文件内容/权限被修改
# 如果变更是你自己做的(如更新了 nginx 配置):# 更新基线数据库sudo aide --updatesudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db4. 自动化每日检查
# 创建 cron 任务sudo tee /etc/cron.daily/aide-check << 'EOF'#!/bin/bash/usr/bin/aide --check | mail -s "AIDE Report $(hostname)" admin@yourdomain.comEOF
sudo chmod +x /etc/cron.daily/aide-check关键安全实践:AIDE 基线数据库应离线保存一份副本。如果攻击者拿到了 root,他可以修改 AIDE 基线以隐藏痕迹。把
.db文件复制到只读介质或离线存储,定期交叉比对。
chkrootkit —— Rootkit 检测
chkrootkit 是 Rootkit 扫描工具,检测隐藏进程、被替换的系统命令、异常网络端口和已知 Rootkit 签名。
为什么选 chkrootkit 而不是 rkhunter?rkhunter 上游自 2009 年起已停止维护,虽有发行版打补丁但无新签名。chkrootkit 使用 BSD 许可,2025 年仍持续更新 v0.59,新增了 XZ 后门和 Bottkitty UEFI Bootkit 检测。
1. 安装
sudo apt install chkrootkit -y2. 运行扫描
# 基础扫描sudo chkrootkit
# 输出会逐项检查,关注以下几类结果:# - "INFECTED" — 发现已知 Rootkit# - "not found" / "nothing found" — 未检测到# - "Warning" — 可能的异常,需人工判断
# 只运行特定检查sudo chkrootkit -x bind # 检查 bind 后门sudo chkrootkit -x lkm # 检查内核级 Rootkit(LKM)3. 自动化周检
sudo tee /etc/cron.weekly/chkrootkit-check << 'EOF'#!/bin/bashOUTPUT=$(/usr/sbin/chkrootkit)if echo "$OUTPUT" | grep -qi "INFECTED"; then echo "$OUTPUT" | mail -s "⚠️ chkrootkit INFECTED on $(hostname)" admin@yourdomain.comfiEOF
sudo chmod +x /etc/cron.weekly/chkrootkit-check4. chkrootkit 的局限性
- 依赖签名库,对新 Rootkit 可能有漏报
- 只检测本地系统,不提供实时防护
- 误报可能发生在合法软件修改系统命令时(如包管理器更新了
ls)
因此 chkrootkit 应作为交叉验证工具与其他手段配合使用——它不是唯一的入侵检测手段,而是多证据链条中的一环。
应急响应流程
如果发现入侵迹象——CPU 异常高、陌生进程、日志中的异常登录、AIDE 报告文件变更——按以下步骤排查:
第一步:隔离
# 立即断网——先阻止攻击者进一步操作sudo ufw default deny incomingsudo ufw default deny outgoingsudo ufw allow out 53 # 保留 DNS# 或物理断网:sudo ip link set eth0 down
# 注意:断网会断开你的 SSH 连接。如果有控制台/VNC 访问权限,优先使用。# 如果你只有 SSH,先执行以下取证再断网。第二步:采集现场证据
# 1. 所有当前网络连接sudo ss -tulnp > /tmp/forensic_ss.txt
# 2. 所有运行中的进程sudo ps auxf > /tmp/forensic_ps.txt
# 3. 当前登录用户w > /tmp/forensic_who.txtlast -n 50 > /tmp/forensic_last.txt
# 4. 最近的认证日志sudo journalctl -u ssh -n 500 > /tmp/forensic_ssh.txtsudo grep "Accepted\|Failed" /var/log/auth.log | tail -100 > /tmp/forensic_auth.txt
# 5. 异常文件(最近24小时内修改的文件)sudo find /etc /var /tmp -type f -mtime -1 -ls > /tmp/forensic_files.txt
# 6. crontab 和启动项sudo ls -la /var/spool/cron/crontabs/ > /tmp/forensic_cron.txtsudo cat /etc/crontab > /tmp/forensic_cron2.txt
# 7. bash 历史cat ~/.bash_history > /tmp/forensic_bash.txt
# 把以上文件打包下载到本地tar czf forensic-$(date +%Y%m%d-%H%M).tar.gz /tmp/forensic_*.txt第三步:排查
# 1. Auditd 回溯sudo ausearch -ts $(date -d '3 days ago' '+%m/%d/%Y') -k root_commands -i
# 2. chkrootkit 全扫sudo chkrootkit
# 3. 检查是否有未知的 SUID 文件sudo find / -perm -4000 -type f 2>/dev/null | grep -v -E "(/usr/bin/|/usr/sbin/|/bin/|/sbin/)"
# 4. 检查异常内核模块sudo lsmod | grep -v -E "(^Module|^$)"
# 5. 检查 systemd 启动项sudo systemctl list-unit-files | grep enabled | grep -v -E "(ssh|ufw|fail2ban|apparmor|auditd|nginx|cron|docker)"第四步:恢复
# 1. 从备份恢复被篡改的文件# 2. 重置所有密码和 SSH 密钥# 3. 重建服务器(推荐——不信任被入侵过的系统)
# 如果决定不重建,至少:# - 更换所有 SSH 密钥对# - 重置所有用户密码# - 检查所有 crontab 和 systemd service 文件# - 重新初始化 AIDE 基线# - 运行完整 Lynis 审计一键月度安全审查脚本
将日常检查整合为一个自动化脚本,放入 cron 月度执行:
#!/bin/bashHOST=$(hostname)DATE=$(date +%Y-%m-%d)REPORT="/tmp/security-audit-${DATE}.txt"EMAIL="admin@yourdomain.com"
{ echo "==========================================" echo " Security Audit Report — $HOST — $DATE" echo "==========================================" echo ""
echo "=== 1. UFW Status ===" sudo ufw status verbose echo ""
echo "=== 2. Fail2ban Status ===" sudo fail2ban-client status for jail in $(sudo fail2ban-client status | grep "Jail list" | cut -d: -f2 | tr -d ','); do sudo fail2ban-client status "$jail" done echo ""
echo "=== 3. AppArmor Status ===" sudo aa-status | head -5 echo ""
echo "=== 4. Recent Failed Logins ===" sudo grep "Failed password" /var/log/auth.log | tail -10 echo ""
echo "=== 5. AIDE Integrity Check ===" sudo aide --check 2>&1 | tail -20 echo ""
echo "=== 6. chkrootkit Scan ===" sudo chkrootkit | grep -E "INFECTED|Warning" echo ""
echo "=== 7. Lynis Hardening Index ===" sudo lynis audit system --quiet 2>&1 | grep "Hardening index" echo ""
echo "=== 8. Disk Usage ===" df -h echo ""
echo "=== 9. Pending Security Updates ===" sudo apt list --upgradable 2>/dev/null | grep -i security echo ""
} > "$REPORT" 2>&1
# 如果不想暴露邮箱,输出到文件然后手动查看# mail -s "Security Audit - $HOST - $DATE" "$EMAIL" < "$REPORT"
echo "Report saved to $REPORT"# 设置 cron 每月 1 号凌晨 3 点执行sudo chmod +x /usr/local/sbin/monthly-security-audit.shsudo tee /etc/cron.d/monthly-security-audit << 'EOF'0 3 1 * * root /usr/local/sbin/monthly-security-audit.shEOF全系列总结
| 层级 | 工具 | 解决什么问题 | CIS |
|---|---|---|---|
| 边界 | SSH 加固 + UFW + Fail2ban | 阻止未授权访问 | Level 1 |
| 系统 | sysctl + PAM + 自动更新 + 文件系统 | 限制已入侵用户的破坏范围 | Level 1-2 |
| 内核 | AppArmor + Auditd | 进程隔离 + 审计溯源 | Level 2 |
| 检测 | Lynis + AIDE + chkrootkit | 发现配置漏洞 + 文件篡改 + Rootkit | Level 2 |
四篇系列覆盖了从预防、限制、记录到检测的完整安全生命周期。安全不是一次配置就完事的——把这些工具纳入日常运维流程,保持周期性审计和更新,才是真正的安全。
速查表
# ===== Lynis =====sudo lynis audit system # 完整系统审计sudo lynis audit system --tests "FIRE-* SSH-*" # 指定类别审计sudo lynis show details <test-id> # 查看某测试详情grep "Hardening index" /var/log/lynis.log # 查看历史评分
# ===== AIDE =====sudo aide --check # 检查文件变更sudo aide --update # 更新基线sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db # 确认更新
# ===== chkrootkit =====sudo chkrootkit # 全量扫描sudo chkrootkit -x lkm # 内核模块检测sudo chkrootkit -q # 安静模式(只输出异常)
# ===== 应急取证 =====sudo ss -tulnp # 所有网络连接sudo ps auxf # 进程树sudo ausearch -ts today -k root_commands # 今日 root 操作sudo find / -perm -4000 -type f # 所有 SUID 文件last -n 50 # 最近登录记录延伸阅读
- Lynis Documentation — 完整审计项说明
- AIDE Manual — 文件完整性监控规则编写
- chkrootkit — 最新检测能力与使用文档
- awesome-security-hardening — 安全加固资源合集
- FABRIC: Unified Compliance Aggregator — 多工具合规聚合框架论文(2025)