AIDE是唯一合理选项,因其专为系统级完整性扫描设计,能同时比对权限、属主、大小、SHA256等10+类属性,且不依赖外部服务;而md5sum或脚本无法检测权限变更、属主替换等关键入侵痕迹,rpm -Va则仅覆盖RPM管理文件,遗漏真实攻击面。

怎么选对扫描工具:AIDE 是唯一合理选项
别折腾 md5sum 或手写脚本做系统级完整性扫描——它防不了恶意篡改,也抓不住权限变更、属主替换、ACL 修改这些关键入侵痕迹。AIDE 是专为此设计的工具,能同时比对 p+i+n+u+g+s+sha256 等 10+ 类属性,且不依赖外部服务。
常见错误是用 rpm -Va 替代 AIDE:它只检查 RPM 包管理的文件,漏掉 /etc/nginx/conf.d/、/usr/local/bin/、手动部署的二进制等真实攻击面。
- Debian/Ubuntu:
sudo apt install aide - RHEL/CentOS 8+:
sudo dnf install aide;CentOS 7:sudo yum install aide - 安装后不自动初始化数据库,必须手动运行
aide --init
初始化数据库前必须确认三件事
数据库一旦生成就代表“可信基线”,如果系统已遭入侵或存在异常进程,后续所有比对都失去意义。这不是可跳过的步骤,而是安全前提。
- 系统刚重装完成,或已通过
ps auxf、netstat -tulpn、journalctl -b确认无异常进程和服务 - 没运行可疑容器、没挂载未知 NFS/Samba 共享、
/tmp和/var/tmp为空 - 执行
sudo aide --init后,必须立刻重命名:sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz(否则aide --check永远报database not found)
/etc/aide.conf 配置最容易踩的五个坑
默认配置太宽泛,90% 的误报都来自这里。规则不是越多越好,而是越准越稳。
-
database=file:/var/lib/aide/aide.db.gz这行必须存在,路径大小写、.gz后缀、开头file:协议都不能错 - 排除路径要用完整匹配:
!/var/log/.*不会屏蔽/var/log/nginx/access.log,得写成!/var/log/**(需启用 glob)或逐条列!/var/log/nginx/、!/var/log/journal/ - 动态文件如
/etc/resolv.conf、/etc/mtab必须显式排除,否则每次网络切换都触发Changed - 别直接套用网上示例的
/etc p+i+n+u+g+s+sha512—— 如果你不用 SELinux,selinux属性永远变,加了反而干扰判断 - 测试语法是否正确:
sudo aide --config-check,无输出才表示通过;有报错就别跑--check
crontab 定时任务里必须判断退出码
靠 grep "Changed" 发邮件是典型幻觉——AIDE 出错(比如数据库损坏、权限不足)时也会输出文本,但此时返回值是 2,不是 1。只看日志内容等于放弃故障发现能力。
- 正确写法示例(每天 2:30 执行):
30 2 * * * /usr/bin/aide --check --config=/etc/aide.conf > /var/log/aide/$(date +\%Y\%m\%d).log 2>&1 || echo "AIDE failed with exit code $?" | /bin/mail -s "AIDE CRITICAL $(hostname)" admin@company.com -
aide --check返回0:无变更;返回1:发现变更(Added/Removed/Changed);返回2:执行失败(数据库损坏、配置错误、权限拒绝) - 日志目录要提前建好:
sudo mkdir -p /var/log/aide && sudo chown root:root /var/log/aide,否则 cron 会静默失败 - 别把
aide.db.gz和日志放在同一分区——根分区满时,aide --init和日志写入会同时失效
AIDE 的复杂点不在安装,而在“干净初始化”和“精准排除”。多数人卡在第一次 aide --check 报几百行 Changed,其实只是 /etc/ 下某个临时备份文件没被排除,或者数据库根本没重命名成功。


















