深色模式
文件完整性监控 FIM:守住关键文件不被篡改
摘要:FIM 通过"基线 + 定期比对"发现二进制、配置、定时任务被替换或植入。本文用 AIDE 做全量基线比对,用 auditd 做实时事件捕获,并给出误报治理方法。
适用环境
bash
cat /etc/os-release
command -v aide && aide --version | head -1
command -v auditctl && auditctl -s | head -2
systemctl is-active auditd1
2
3
4
2
3
4
操作步骤
1. 明确监控范围:只监控不该变的东西
推荐范围:
- 系统二进制:
/usr/bin/usr/sbin/bin/sbin - 配置文件:
/etc(排除频繁变动的子目录) - 定时任务:
/etc/cron*/var/spool/cron - 启动项:
/etc/systemd/system/etc/rc.d - Web 目录(视发布方式而定)
排除:日志、缓存、数据目录、临时目录。
2. 安装并配置 AIDE
bash
# RHEL
dnf install -y aide
# Debian/Ubuntu
apt-get install -y aide
cp /etc/aide/aide.conf /etc/aide/aide.conf.bak1
2
3
4
5
2
3
4
5
bash
cat >/etc/aide/aide.conf.d/99-custom.conf <<'EOF'
# 定义规则
Bin = p+u+g+s+b+m+c+md5+sha256
Conf = p+u+g+s+b+m+c+md5+sha256
Logs = p+u+g+s+n
/usr/bin Bin
/usr/sbin Bin
/bin Bin
/sbin Bin
/etc Conf
!/etc/(mtab|adjtime|resolv.conf|hosts.deny)$
!/etc/(shadow-?|gshadow-?)$
!/etc/(passwd-?|group-?)$
!/etc/(localtime|hostname)$
!/etc/(ld.so.cache|prelink.cache)$
!/var/log/.*
!/var/lib/.*
!/tmp/.*
!/dev/.*
!/proc/.*
EOF1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
部分发行版不支持 aide.conf.d,直接把这些行追加到 /etc/aide/aide.conf 末尾即可。
3. 初始化基线
bash
aide --init && echo "init done"
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
ls -l /var/lib/aide/1
2
3
2
3
基线必须在"干净状态"下生成
如果主机可能已被入侵,先排查再建基线,否则等于把后门写进基线。基线文件建议离线留存一份。
4. 定时比对与告警
bash
cat >/etc/cron.daily/aide-check <<'EOF'
#!/bin/bash
/usr/sbin/aide --check | tee /var/log/aide-check-$(date +%F).log \
| mail -s "[FIM] $(hostname) 文件完整性检查 $(date +%F)" ops@example.com
EOF
chmod +x /etc/cron.daily/aide-check
aide --check | head -301
2
3
4
5
6
7
2
3
4
5
6
7
输出解读:
Added files:新增文件(可能是包安装,也可能是后门)。Changed files:内容或属性变化。Removed files:删除(危险信号)。
5. 用 auditd 做实时捕获(补足定期比对的空窗)
bash
cat >/etc/audit/rules.d/95-fim.rules <<'EOF'
-w /etc/passwd -p wa -k fim_identity
-w /etc/shadow -p wa -k fim_identity
-w /etc/crontab -p wa -k fim_cron
-w /etc/cron.d/ -p wa -k fim_cron
-w /etc/systemd/system/ -p wa -k fim_systemd
-w /usr/bin/ -p wa -k fim_bin
-w /usr/sbin/ -p wa -k fim_bin
-a always,exit -F arch=b64 -S execve -F dir=/tmp -k fim_tmp_exec
EOF
augenrules --load1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
最后一条尤其重要:可执行文件从 /tmp 运行是典型入侵特征。
bash
ausearch -k fim_tmp_exec --start today1
6. 基线更新流程(否则告警会淹没人)
包更新后基线必然变化,必须有规范流程:
bash
# 1) 确认变更来源(工单/变更单)
rpm -V nginx 2>/dev/null | head
# 2) 逐条核对 aide --check 输出
aide --check > /tmp/aide-diff.txt; less /tmp/aide-diff.txt
# 3) 确认无误后更新基线
aide --update
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 4) 记录变更单号与时间
echo "$(date +%F) 变更单 CHG-xxxx 更新基线" >> /var/log/aide-baseline.log1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
7. 基线文件自身要防篡改
bash
chmod 600 /var/lib/aide/aide.db.gz
chown root:root /var/lib/aide/aide.db.gz
# 离线留存
cp /var/lib/aide/aide.db.gz /mnt/backup/aide-$(hostname)-$(date +%F).db.gz1
2
3
4
2
3
4
验证
bash
aide --check | tail -5
# 制造变更验证
echo "# test" >> /etc/crontab
aide --check | grep -A2 "crontab" ; ausearch -k fim_cron --start recent | tail -3
# 还原
sed -i '/# test/d' /etc/crontab && aide --update && \
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz1
2
3
4
5
6
7
2
3
4
5
6
7
判定标准:任何对 /etc/crontab 的修改都能在下一轮检查或 auditd 中被发现;基线文件不可被普通用户写。
常见坑
基线在有后门的机器上生成
等于给后门发通行证。新机器上线的第一件事就是建基线;存量机器先排查。
不排除日志与缓存目录,告警爆炸
/var/log、/var/lib 每时每刻都在变,必须排除,否则没人会看报告。
更新基线时不核对直接覆盖
这会让真实的篡改被"合法化"。每次 --update 前必须逐条核对并留变更单号。
只做定期比对,空窗期太长
一天一次意味着最多 24 小时盲区。关键路径用 auditd 实时捕获互补。
基线文件与主机共存
主机被拿下后基线可一并被改。必须离线/异地保存一份基线副本。