Linux运维7 min read次阅读

AIDE 文件完整性监控与主机入侵检测实战

为什么需要文件完整性监控

安全加固(关端口、改密码、上 SELinux)解决的是"门有没有锁好",但挡不住已经进来的攻击者。一旦拿到权限,黑客最常见的动作是:

  • 篡改 /etc/passwd/etc/shadow 加后门账号;
  • 替换 sshdls 等二进制文件(rootkit);
  • crontab、systemd 里挂持久化脚本;
  • /etc/ld.so.preload 做库劫持。

这些改动不会触发防火墙,也不会写业务日志。等发现时往往已经丢了很久。文件完整性监控(FIM / HIDS 的轻量形态)就是给关键文件建"指纹",定期比对,谁动了文件立刻报警。

AIDE(Advanced Intrusion Detection Environment)是开源领域最成熟的 FIM 工具,纯比对、无 agent 依赖,适合做主机基线校验的"最后一道可见防线"。

核心原理

AIDE 的工作分两步:

  1. 初始化(建基线):扫描指定目录,对每种文件计算多种校验值(md5/sha256/文件大小/mtime/ctime/权限/owner/inode 等),写入数据库。
  2. 校验(查篡改):再次扫描,与基线数据库比对,输出"哪些文件被新增/删除/修改"。

判断改动的字段叫 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 条实战底线

  1. 基线必须在干净系统上建,已中招机器建的基线会把后门合法化。
  2. 校验规则至少 p+i+u+g+s+m+c,敏感目录加 sha256
  3. 只盯系统骨架目录(/etc /bin /sbin /usr/bin /boot /root),别全量扫 /var /home,否则天天误报。
  4. AIDE 不报警,必须接 cron + 告警脚本(邮件/钉钉/Prometheus)。
  5. 任何变更后的人工确认是基线更新的前提,绝不让部署脚本自动更新基线。
  6. 基线数据库本身要只读 + 单独备份到异地,防止被攻击者一并改掉。
  7. 校验失败先别慌:分清"授权变更"还是"真实入侵",靠变更工单比对。
  8. 容器环境用 AIDE 意义不大(镜像不可变、生命周期短),改用镜像签名 + 运行时扫描。
  9. 定期(季度)做一次"红蓝对抗":故意改一个受监控文件,验证告警链路真的通。
  10. AIDE 是"发现"不是"防御",发现异常后要联动隔离、取证、重装流程,别只停留在报警。
分享:

评论区