在CentOS服务器上使用AIDE(Advanced Intrusion Detection Environment)结合cron定时任务生成文件完整性报告,是Linux系统安全运维中非常实用且必要的手段。简单来说,AIDE会对系统关键文件建立指纹数据库,之后定期扫描对比,一旦发现文件被篡改、新增或删除,就会生成告警报告。而cron负责让这个扫描过程自动化、周期性执行,不需要人工干预。下面我把从安装、配置、初始化到定时任务设置的完整流程一步步讲清楚。
为什么要做文件完整性监控
很多人觉得服务器装了防火墙、关了不必要的端口就安全了,其实远远不够。攻击者一旦通过漏洞拿到权限,第一件事往往是篡改系统文件——比如替换二进制命令、植入后门、修改配置文件。这些改动如果不主动去查,根本发现不了。AIDE就是专门干这个事的,它通过记录文件的inode、权限、大小、哈希值等属性,定期比对变化,相当于给系统文件拍了一张"底片",后续随时对照。
CentOS上安装AIDE
CentOS 7和CentOS 8/Stream的安装方式略有不同。CentOS 7上直接用yum:
yum install aide -y
CentOS 8或Rocky Linux、AlmaLinux上:
dnf install aide -y
安装完成后,AIDE的主配置文件在/etc/aide.conf,二进制程序在/usr/sbin/aide。装好之后不要急着跑,先要初始化数据库。
初始化AIDE数据库
第一次使用必须先建立基准数据库,这个数据库就是后续比对的"标准答案"。执行:
aide --init
这条命令会在/var/lib/aide/目录下生成aide.db.new.gz文件。然后把它重命名为正式数据库:
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
这一步非常关键,很多人跳过或者做错,导致后面比对全是误报。初始化一定要在系统刚装好、还没被入侵、也没做过大量文件变更的时候做,这样基准才干净。
理解AIDE配置文件的核心规则
打开/etc/aide.conf,你会看到里面有大量的规则定义。核心逻辑是:每一行定义一种文件属性的检测规则,格式是"级别=属性"。常见的级别有:
p:权限(permissions)
i:inode
n:链接数(number of links)
u:用户
g:组
s:大小
b:块数
m:修改时间
a:访问时间
c:创建时间
md5:MD5哈希
sha256:SHA256哈希
sha512:SHA512哈希
r:真实大小(对于稀疏文件等)
比如这一行:
NORMAL = p+i+n+u+g+s+m+c+md5
意思是正常检测用权限、inode、链接数、用户、组、大小、修改时间、创建时间和MD5哈希。如果你想检测更严格,可以加上sha512:
NORMAL = p+i+n+u+g+s+m+c+md5+sha512
配置文件里还有大量的路径定义,比如/bin、/sbin、/etc、/usr等目录分别用什么规则检测。一般不需要大改,默认配置已经覆盖了大部分关键路径。但如果你有自定义的应用目录,比如/opt/myapp,记得加进去。
手动测试AIDE扫描
在设置定时任务之前,先手动跑一次确认正常:
aide --check
执行后会在/var/lib/aide/下生成aide.db.new.gz,同时如果有变化会输出到屏幕上或者生成报告。你可以看到哪些文件有变动,如果是你自己更新系统产生的正常变动,那就需要重新初始化数据库;如果是不明变动,就要警惕了。
编写自动化扫描脚本
直接让cron跑aide --check是可以的,但更规范的做法是写一个shell脚本,把扫描、报告生成、日志记录、邮件通知都整合在一起。创建脚本文件:
vim /usr/local/bin/aide_report.sh
脚本内容如下:
#!/bin/bash
# AIDE完整性检查并生成报告
DATE=$(date +%Y%m%d_%H%M%S)
REPORT_DIR="/var/log/aide_reports"
REPORT_FILE="${REPORT_DIR}/aide_report_${DATE}.txt"
LOG_FILE="/var/log/aide_scan.log"
MAIL_TO="admin@yourdomain.com"
# 创建报告目录
mkdir -p ${REPORT_DIR}
# 执行AIDE检查
aide --check 2>&1 | tee ${REPORT_FILE}
# 判断是否有异常
if [ $? -ne 0 ]; then
echo "[${DATE}] AIDE检测到文件变更,请检查报告: ${REPORT_FILE}" >> ${LOG_FILE}
# 发送邮件通知
cat ${REPORT_FILE} | mail -s "AIDE Alert: 文件完整性异常 - ${DATE}" ${MAIL_TO}
else
echo "[${DATE}] AIDE扫描完成,无异常" >> ${LOG_FILE}
fi
# 保留最近30天的报告
find ${REPORT_DIR} -name "aide_report_*.txt" -mtime +30 -delete
保存后给脚本执行权限:
chmod +x /usr/local/bin/aide_report.sh
这个脚本做了几件事:带时间戳生成报告文件、记录日志、有异常时发邮件、自动清理过期报告。生产环境中邮件通知非常重要,不然你不会天天去看日志。
配置cron定时任务
接下来设置cron让脚本定期执行。编辑crontab:
crontab -e
添加以下内容,比如每天凌晨3点执行:
0 3 * * * /usr/local/bin/aide_report.sh
如果你想更频繁,比如每12小时一次:
0 */12 * * * /usr/local/bin/aide_report.sh
如果是高安全要求的环境,比如金融、政务服务器,建议每6小时甚至每小时扫描一次。频率越高,发现问题越及时,但也会增加系统I/O负担,需要根据实际情况权衡。
AIDE数据库的更新策略
这里有一个很多人忽略的问题:系统正常更新(yum update)会导致大量文件变动,如果不更新数据库,AIDE会疯狂报警。正确的做法是:每次系统更新完成后,重新初始化数据库。
aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
更聪明的做法是把这个操作也放进脚本里,在yum更新后自动触发。可以在/etc/yum/post-actions/目录下创建一个钩子脚本,或者直接在cron里加一个判断逻辑——但一般建议手动在更新后执行,避免自动化误操作。
报告解读和异常处理
AIDE的报告输出格式大致是这样的:
Changed attributes: /usr/bin/passwd: p+i+u+g+s+md5 /etc/passwd: p+u+g Added files: /tmp/suspicious_file Removed files: /var/log/old_log
看到Changed attributes不一定就是被入侵,也可能是正常的系统更新。关键是要结合变更时间、变更内容来判断。如果/usr/bin/passwd的MD5变了,这是非常严重的信号,因为passwd是关键系统命令。如果只是/etc/hosts多了一行注释,那大概率没事。
安全加固建议
除了AIDE本身,还有几点建议:第一,AIDE的数据库文件/var/lib/aide/aide.db.gz要做好权限控制,chmod 600,防止被篡改;第二,报告文件和日志也要限制访问;第三,如果条件允许,把报告通过syslog转发到独立的日志服务器,这样即使本机被入侵,报告还在别处;第四,考虑使用AIDE配合其他工具如OSSEC、Wazuh做更全面的入侵检测。
CentOS 8/Stream的注意事项
CentOS 8开始用dnf替代yum,AIDE的包名和路径可能有细微变化。另外SELinux在CentOS 8上默认开启,可能会影响AIDE对某些路径的扫描权限,需要确保aide用户有足够的访问权限,或者在SELinux策略中添加相应规则。如果遇到权限拒绝的情况,可以先用ausearch -m avc查看SELinux拒绝日志,再用audit2allow生成策略。
总结
AIDE加cron的组合是CentOS服务器安全基线中成本最低、效果最直接的完整性监控方案。整个部署过程不复杂,核心就是三步:安装初始化、配置规则、设置定时扫描。真正的难点在于后续的运维——及时更新数据库、正确解读报告、建立异常响应流程。把这套机制跑起来,你的服务器安全水位会提升一个档次。不要等到被入侵了才想起来做监控,现在就动手配置吧。
