2467 字
12 分钟
Linux 服务器安全防护手册(四):安全审计与入侵检测 —— Lynis、AIDE、chkrootkit

全系列回顾#

前三篇构建了完整的防御体系:从边界的 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. 安装#

Terminal window
# Ubuntu/Debian
sudo apt install lynis -y
# 或直接从 GitHub 获取最新版
git clone https://github.com/CISOfy/lynis.git
cd lynis && sudo ./lynis audit system

Lynis Community Edition 使用 GPLv3 许可。CISOfy 另提供企业版(集中管理面板),但社区版完全够用。

2. 运行系统审计#

Terminal window
# 基础审计
sudo lynis audit system
# 只检查内核和网络相关
sudo lynis audit system --tests "KRNL-* NETW-* FIRE-*"

3. 解读输出#

Terminal window
# 执行后关注三段内容:
# ===== 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.dat

4. 持续改进#

Terminal window
# 每次审计后跟踪进展
sudo lynis audit system | grep "Hardening index"
# 对比上次评分
# 修复 Warning → 再扫一次 → 看分数涨了多少

AIDE —— 文件完整性监控#

AIDE(Advanced Intrusion Detection Environment)是文件完整性检查器。它先对所有关键文件生成加密哈希基线,之后定期比对——任何文件的增、删、改都会被检测到。

1. 安装与基线初始化#

Terminal window
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.db

2. 配置监控范围#

编辑 /etc/aide/aide.conf 定制要监控的文件和目录。以下是核心配置:

Terminal window
# 数据库路径
database=file:/var/lib/aide/aide.db
database_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/tmp

NORMALLOGS 是预定义规则组,默认配置文件中已定义好。

3. 检查变更#

Terminal window
# 运行完整性检查
sudo aide --check
# 检查完后比对结果。如果有变更,输出格式:
# - Added: 新文件
# - Removed: 文件被删
# - Changed: 文件内容/权限被修改
# 如果变更是你自己做的(如更新了 nginx 配置):
# 更新基线数据库
sudo aide --update
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

4. 自动化每日检查#

# 创建 cron 任务
sudo tee /etc/cron.daily/aide-check << 'EOF'
#!/bin/bash
/usr/bin/aide --check | mail -s "AIDE Report $(hostname)" admin@yourdomain.com
EOF
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. 安装#

Terminal window
sudo apt install chkrootkit -y

2. 运行扫描#

Terminal window
# 基础扫描
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/bash
OUTPUT=$(/usr/sbin/chkrootkit)
if echo "$OUTPUT" | grep -qi "INFECTED"; then
echo "$OUTPUT" | mail -s "⚠️ chkrootkit INFECTED on $(hostname)" admin@yourdomain.com
fi
EOF
sudo chmod +x /etc/cron.weekly/chkrootkit-check

4. chkrootkit 的局限性#

  • 依赖签名库,对新 Rootkit 可能有漏报
  • 只检测本地系统,不提供实时防护
  • 误报可能发生在合法软件修改系统命令时(如包管理器更新了 ls

因此 chkrootkit 应作为交叉验证工具与其他手段配合使用——它不是唯一的入侵检测手段,而是多证据链条中的一环。


应急响应流程#

如果发现入侵迹象——CPU 异常高、陌生进程、日志中的异常登录、AIDE 报告文件变更——按以下步骤排查:

第一步:隔离#

Terminal window
# 立即断网——先阻止攻击者进一步操作
sudo ufw default deny incoming
sudo ufw default deny outgoing
sudo ufw allow out 53 # 保留 DNS
# 或物理断网:sudo ip link set eth0 down
# 注意:断网会断开你的 SSH 连接。如果有控制台/VNC 访问权限,优先使用。
# 如果你只有 SSH,先执行以下取证再断网。

第二步:采集现场证据#

Terminal window
# 1. 所有当前网络连接
sudo ss -tulnp > /tmp/forensic_ss.txt
# 2. 所有运行中的进程
sudo ps auxf > /tmp/forensic_ps.txt
# 3. 当前登录用户
w > /tmp/forensic_who.txt
last -n 50 > /tmp/forensic_last.txt
# 4. 最近的认证日志
sudo journalctl -u ssh -n 500 > /tmp/forensic_ssh.txt
sudo 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.txt
sudo 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

第三步:排查#

Terminal window
# 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)"

第四步:恢复#

Terminal window
# 1. 从备份恢复被篡改的文件
# 2. 重置所有密码和 SSH 密钥
# 3. 重建服务器(推荐——不信任被入侵过的系统)
# 如果决定不重建,至少:
# - 更换所有 SSH 密钥对
# - 重置所有用户密码
# - 检查所有 crontab 和 systemd service 文件
# - 重新初始化 AIDE 基线
# - 运行完整 Lynis 审计

一键月度安全审查脚本#

将日常检查整合为一个自动化脚本,放入 cron 月度执行:

/usr/local/sbin/monthly-security-audit.sh
#!/bin/bash
HOST=$(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"
Terminal window
# 设置 cron 每月 1 号凌晨 3 点执行
sudo chmod +x /usr/local/sbin/monthly-security-audit.sh
sudo tee /etc/cron.d/monthly-security-audit << 'EOF'
0 3 1 * * root /usr/local/sbin/monthly-security-audit.sh
EOF

全系列总结#

层级工具解决什么问题CIS
边界SSH 加固 + UFW + Fail2ban阻止未授权访问Level 1
系统sysctl + PAM + 自动更新 + 文件系统限制已入侵用户的破坏范围Level 1-2
内核AppArmor + Auditd进程隔离 + 审计溯源Level 2
检测Lynis + AIDE + chkrootkit发现配置漏洞 + 文件篡改 + RootkitLevel 2

四篇系列覆盖了从预防、限制、记录到检测的完整安全生命周期。安全不是一次配置就完事的——把这些工具纳入日常运维流程,保持周期性审计和更新,才是真正的安全。


速查表#

Terminal window
# ===== 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 # 最近登录记录

延伸阅读#

Linux 服务器安全防护手册(四):安全审计与入侵检测 —— Lynis、AIDE、chkrootkit
https://blog.syomega.top/posts/linux-security-4/
作者
酱w
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0