为什么需要文件完整性监控
安全加固(关端口、改密码、上 SELinux)解决的是"门有没有锁好",但挡不住已经进来的攻击者。一旦拿到权限,黑客最常见的动作是:
- 篡改
/etc/passwd、/etc/shadow加后门账号; - 替换
sshd、ls等二进制文件(rootkit); - 在
crontab、systemd 里挂持久化脚本; - 改
/etc/ld.so.preload做库劫持。
这些改动不会触发防火墙,也不会写业务日志。等发现时往往已经丢了很久。文件完整性监控(FIM / HIDS 的轻量形态)就是给关键文件建"指纹",定期比对,谁动了文件立刻报警。
AIDE(Advanced Intrusion Detection Environment)是开源领域最成熟的 FIM 工具,纯比对、无 agent 依赖,适合做主机基线校验的"最后一道可见防线"。
核心原理
AIDE 的工作分两步:
- 初始化(建基线):扫描指定目录,对每种文件计算多种校验值(md5/sha256/文件大小/mtime/ctime/权限/owner/inode 等),写入数据库。
- 校验(查篡改):再次扫描,与基线数据库比对,输出"哪些文件被新增/删除/修改"。
判断改动的字段叫 rule,例如:
FIPSR = p+i+n+u+g+s+m+c+acl+selinux
# p=权限 i=inode n=硬链接数 u=uid g=gid
# s=大小 m=mtime c=ctime + acl + selinux 上下文
只比对 mtime 会被 touch 骗过,所以生产环境至少要 p+i+u+g+s+m+c(权限/属主/大小/mtime/ctime 全比),敏感目录再加 sha256。
安装与初始化
# RHEL/CentOS
yum install -y aide
# Debian/Ubuntu
apt-get install -y aide aide-common
# 初始化数据库(生成 /var/lib/aide/aide.db.new.gz)
aide --init
# 初始化完成后,把基线库"转正"(校验时只读这个)
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
关键点:基线必须在系统刚装好、确认干净时建立。一台已经中招的机器建的基线,等于把后门也"合法化"了。
配置文件(/etc/aide.conf)
默认规则偏重,生产上建议收敛,避免噪音:
# 数据库位置
database=/var/lib/aide/aide.db.gz
database_out=/var/lib/aide/aide.db.new.gz
# 校验规则
FIPSR = p+i+n+u+g+s+m+c+acl+selinux
FIPSR+ = sha256
# 重点监控(宁可漏看日志,不能漏看这些)
/etc FIPSR+
/bin FIPSR+
/sbin FIPSR+
/usr/bin FIPSR+
/usr/sbin FIPSR+
/boot FIPSR+
/root FIPSR+
# 排除高频变动、无安全意义的目录(否则天天误报)
!/etc/mtab
!/etc/.*~
!/var/log/.*
!/tmp/.*
!/proc/.*
经验:把
/var、/home、/tmp整体排除,只盯"系统骨架"目录。FIM 的目标是发现系统级篡改,不是做全量备份比对。
定时校验 + 告警
AIDE 本身不报警,要配合 cron 跑校验、脚本解析结果:
# /etc/cron.d/aide —— 每天 03:30 校验
30 3 * * * root /usr/sbin/aide --check 2>&1 | /usr/local/bin/aide_alert.sh
aide_alert.sh 抓"added/removed/changed"关键字并告警:
#!/bin/bash
# aide_alert.sh
if grep -qiE "found differences|added|removed|changed" /dev/stdin; then
SUBJECT="[AIDE] $(hostname) 文件完整性异常 - $(date +%F)"
# 钉钉/邮件/短信 任选其一
echo "$(hostname) 检测到文件被篡改,请立即登录核查。" | \
mail -s "$SUBJECT" ops@example.com
fi
校验结果非零退出码(aide --check 发现差异返回 1)也可直接被监控采集。建议同时把
aide --check的退出码接入 Prometheus node_exporter 的 textfile collector,做统一看板。
基线更新(别忽略这一步)
系统升级、配置文件正常变更后,基线会和现实不符,校验会"假报警"。两类更新:
# 1)日常小变更后:重新生成并转正(确认变更合法的前提下)
aide --init && mv -f /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 2)用 --update 生成增量报告(保留旧基线,方便审计"改了什么")
aide --update
铁律:每次更新基线前,必须人工确认这次变更是授权的。把"自动更新基线"写进部署脚本是大忌——黑客改完文件顺手更新基线,就再也发现不了。
与其他安全手段的关系
| 手段 | 解决什么 | 看不到什么 |
|---|---|---|
| 防火墙 / SELinux | 阻止越权访问 | 已被攻破后的文件篡改 |
| 日志审计(auditd) | 记录"谁、何时、做了什么" | 改完即删日志的对抗 |
| AIDE 文件完整性 | 发现"文件被改了"的事实 | 不改文件的纯内存型攻击 |
三者互补。AIDE 的价值在于不依赖攻击者留下的日志,只看文件本身的客观状态。
10 条实战底线
- 基线必须在干净系统上建,已中招机器建的基线会把后门合法化。
- 校验规则至少
p+i+u+g+s+m+c,敏感目录加sha256。 - 只盯系统骨架目录(
/etc /bin /sbin /usr/bin /boot /root),别全量扫/var /home,否则天天误报。 - AIDE 不报警,必须接 cron + 告警脚本(邮件/钉钉/Prometheus)。
- 任何变更后的人工确认是基线更新的前提,绝不让部署脚本自动更新基线。
- 基线数据库本身要只读 + 单独备份到异地,防止被攻击者一并改掉。
- 校验失败先别慌:分清"授权变更"还是"真实入侵",靠变更工单比对。
- 容器环境用 AIDE 意义不大(镜像不可变、生命周期短),改用镜像签名 + 运行时扫描。
- 定期(季度)做一次"红蓝对抗":故意改一个受监控文件,验证告警链路真的通。
- AIDE 是"发现"不是"防御",发现异常后要联动隔离、取证、重装流程,别只停留在报警。