必须先运行aide --init生成aide.db.new.gz,再重命名为aide.db.gz并设600权限,否则aide --check会报“database not found”或静默失效;排除规则须前置、路径须精确、退出码才是唯一可信判断依据。

直接用 aide,别折腾 md5sum 脚本或定时 sha256sum ——它不防增删、不看权限、不处理硬链接和 SELinux 上下文,纯属自欺欺人。
为什么必须先跑 aide --init 再重命名数据库
安装完 aide 后,aide --init 生成的是 /var/lib/aide/aide.db.new.gz,不是正式库。不重命名就执行 aide --check,会直接报错 database not found。
- 重命名命令必须是
sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz(不是mv,避免跨文件系统失败) - 随后立即设权限:
sudo chmod 600 /var/lib/aide/aide.db.gz,否则非 root 用户可能篡改或读取 - 这一步只能在系统刚重装/确认干净时做一次;补做等于拿被污染的系统当基线,后续所有告警都不可信
/etc/aide.conf 配置最容易踩的三个坑
默认配置几乎必误报,新手常卡在这一步:语法没错但天天收“Changed”邮件,最后发现是 /etc/resolv.conf 或 /etc/mtab 这类动态文件没排除。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 规则顺序敏感:排除项(如
!/var/log/)必须写在监控项(如/var/log F)之前,否则不生效 - 路径匹配要精确:
!/etc/.*\.log不会匹配/etc/nginx/access.log,得写成!/etc/**.log(需开启 glob 支持)或逐条列!/etc/nginx/access.log - 数据库路径必须严格一致:配置里写的是
database=file:/var/lib/aide/aide.db.gz,少个.gz、大小写错、斜杠多一个都会让--check失败
crontab 定时检查必须判断退出码,不能只靠 grep
aide --check 的退出码才是唯一可信信号:0 表示无变更,1 表示有文件变动(Added/Removed/Changed),2 表示出错(如权限不足、数据库损坏)。只用 grep 管道捕获输出,会漏掉 2 错误且无法区分“真变更”和“日志写入失败”。
- 安全写法示例:
15 3 * * * /usr/bin/aide --check > /var/log/aide/$(date +\%Y\%m\%d).log 2>&1 || echo "AIDE failed with exit code $?" | /usr/bin/mail -s "AIDE ERROR $(hostname)" admin@company.com
- 日志目录要提前建好:
sudo mkdir -p /var/log/aide && sudo chown root:root /var/log/aide - 别把
aide.db.gz和日志放在同一分区——根分区满会导致--init失败且日志也写不进去
看到 Added 或 Removed 比 Changed 更危险
收到告警后,第一反应不该是查哈希值,而是确认新增或删除行为是否合理。例如 Added: /tmp/.X11-unix/xauth-12345 是临时文件可忽略;但 Added: /usr/local/bin/.shellshock 就极可能是后门。
- 快速定位变更类型:
sudo tail -n 50 /var/log/aide/$(date +\%Y\%m\%d).log | grep -E "(Added|Removed|Changed)" - 对比新旧哈希用
aide --compare,但它只输出差异字段,不解释原因——得结合journalctl --since "2 hours ago"查谁改的、何时改的 -
Changed中优先盯sha256字段:如果只有m(修改时间)变而哈希不变,大概率是运维更新;哈希变了才真正可疑

















