RHEL 10 fapolicyd:应用白名单与信任库
fapolicyd 管的是“哪些可执行文件允许跑”,不是文件权限。它按信任库(rpm 安装的 + 手工加入的)判断;不在库里的二进制,非 root 执行会得到 Operation not permitted(126)。本页把这条链路跑通,并指出两个容易误判的点。
在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上实际执行:
sudo dnf -y install fapolicydsudo systemctl start fapolicydsystemctl is-active fapolicydsudo fapolicyd-cli --list | headsudo cp /usr/bin/true /tmp/fap-demo && sudo chmod +x /tmp/fap-demo/tmp/fap-demo; echo $? # 非 root,预期 126sudo fapolicyd-cli --file add /tmp/fap-demosudo fapolicyd-cli --update/tmp/fap-demo; echo $? # 等待后,预期 0sudo fapolicyd-cli --file delete /tmp/fap-demosudo fapolicyd-cli --update/tmp/fap-demo; echo $? # 预期又回到 126E3 记录:plans/content-expansion/evidence/rhel/rhel-fapolicyd/run.json(11 步,含每步输出 sha256 与退出码)。
先给结论:信任库决定放行
Section titled “先给结论:信任库决定放行”permissive = 0表示 enforcing;- 默认规则里
allow perm=any uid=0 trust=1 : all会给 root 很大空间; - 普通用户执行未信任二进制 → 126;
fapolicyd-cli --file add/delete改信任库,--update通知重载。
规则里的 uid=0
Section titled “规则里的 uid=0”fapolicyd-cli --list 的前几条:
1. allow perm=any uid=0 : dir=/var/tmp/2. allow perm=any uid=0 trust=1 : all3. allow perm=open exe=/usr/bin/rpm : all...9. allow perm=execute all : trust=1第 2 条意味着 root 执行未信任文件也可能被放行。所以:
- 验证“拒绝”必须用普通用户,不要用 root 测试后误以为策略没生效;
- 生产上不要用 root 跑来路不明的二进制,fapolicyd 不会替你挡。
$ /tmp/fap-demo; echo $?bash: /tmp/fap-demo: Operation not permitted126$ sudo /tmp/fap-demo; echo $?0sudo fapolicyd-cli --file add /tmp/fap-demosudo fapolicyd-cli --update# 等待 1–2 秒或重启服务后再测/tmp/fap-demo; echo $? # 0
sudo fapolicyd-cli --file delete /tmp/fap-demosudo fapolicyd-cli --update/tmp/fap-demo; echo $? # 126信任库文件:
/tmp/fap-demo 28256 6205e6c8...格式是 完整路径 + 大小 + SHA256。文件内容一变,哈希就不匹配,信任失效——这既是完整性保护,也是“为什么我替换了二进制又被拒”的原因。
--update 返回 “Fapolicyd was notified” 不代表立刻生效;实测刚 add 完马上执行仍可能 126,等待/重启后稳定。自动化里要加“验证-重试”,不要 add 完就断言成功。
上线顺序与回退
Section titled “上线顺序与回退”- 先在测试机
permissive = 1观察日志,确认业务二进制都被覆盖; - 切
permissive = 0,保留控制台/带外通道; - 出问题先
systemctl stop fapolicyd(或切回 permissive),再补信任库; - 信任库变更走配置管理,不要手工 add 后无记录;
- 把
/etc/fapolicyd/fapolicyd.trust纳入审计。
-
permissive当前值; - 用非 root 验证拒绝,不用 root;
-
--file add后--update并等待/重启再验证; - 信任库条目含路径/大小/SHA256,替换文件后重新 add;
- 有 permissive 观察期与 stop 回退预案;
- 升级/CI 产物目录已纳入信任策略。
未实测与边界
Section titled “未实测与边界”- 未测试
fapolicyd-cli --file add对脚本/解释型语言的细粒度规则; - 未测试自定义 rules.d 规则与
--test-filter的完整语义; - 未测试 fapolicyd 与 rpm-plugin 在 dnf 升级时的交互;
- 未测试大规模信任库(数万条)的性能。
- RHEL 10 OpenSCAP 基线扫描 — 合规扫描
- RHEL 10 文件完整性:AIDE 基线与检查 — 文件完整性
- RHEL 10 SELinux:文件上下文与布尔值 — 访问控制
- 官方:Security hardening