Skip to content
Search RHEL

This page uses Chinese content. Search opens the Chinese documentation.

    Browse this documentation

    RHEL 10 fapolicyd:应用白名单与信任库

    This content is not available in your language yet.

    fapolicyd 管的是“哪些可执行文件允许跑”,不是文件权限。它按信任库(rpm 安装的 + 手工加入的)判断;不在库里的二进制,非 root 执行会得到 Operation not permitted(126)。本页把这条链路跑通,并指出两个容易误判的点。

    在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上实际执行:

    Terminal window
    sudo dnf -y install fapolicyd
    sudo systemctl start fapolicyd
    systemctl is-active fapolicyd
    sudo fapolicyd-cli --list | head
    sudo cp /usr/bin/true /tmp/fap-demo && sudo chmod +x /tmp/fap-demo
    /tmp/fap-demo; echo $? # 非 root,预期 126
    sudo fapolicyd-cli --file add /tmp/fap-demo
    sudo fapolicyd-cli --update
    /tmp/fap-demo; echo $? # 等待后,预期 0
    sudo fapolicyd-cli --file delete /tmp/fap-demo
    sudo fapolicyd-cli --update
    /tmp/fap-demo; echo $? # 预期又回到 126

    E3 记录:plans/content-expansion/evidence/rhel/rhel-fapolicyd/run.json(11 步,含每步输出 sha256 与退出码)。

    • permissive = 0 表示 enforcing;
    • 默认规则里 allow perm=any uid=0 trust=1 : all 会给 root 很大空间;
    • 普通用户执行未信任二进制 → 126;
    • fapolicyd-cli --file add/delete 改信任库,--update 通知重载。

    fapolicyd-cli --list 的前几条:

    1. allow perm=any uid=0 : dir=/var/tmp/
    2. allow perm=any uid=0 trust=1 : all
    3. 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 permitted
    126
    $ sudo /tmp/fap-demo; echo $?
    0
    Terminal window
    sudo fapolicyd-cli --file add /tmp/fap-demo
    sudo fapolicyd-cli --update
    # 等待 1–2 秒或重启服务后再测
    /tmp/fap-demo; echo $? # 0
    sudo fapolicyd-cli --file delete /tmp/fap-demo
    sudo fapolicyd-cli --update
    /tmp/fap-demo; echo $? # 126

    信任库文件:

    /etc/fapolicyd/fapolicyd.trust
    /tmp/fap-demo 28256 6205e6c8...

    格式是 完整路径 + 大小 + SHA256。文件内容一变,哈希就不匹配,信任失效——这既是完整性保护,也是“为什么我替换了二进制又被拒”的原因。

    --update 返回 “Fapolicyd was notified” 不代表立刻生效;实测刚 add 完马上执行仍可能 126,等待/重启后稳定。自动化里要加“验证-重试”,不要 add 完就断言成功。

    1. 先在测试机 permissive = 1 观察日志,确认业务二进制都被覆盖;
    2. 切 permissive = 0,保留控制台/带外通道;
    3. 出问题先 systemctl stop fapolicyd(或切回 permissive),再补信任库;
    4. 信任库变更走配置管理,不要手工 add 后无记录;
    5. 把 /etc/fapolicyd/fapolicyd.trust 纳入审计。
    • permissive 当前值;
    • 用非 root 验证拒绝,不用 root;
    • --file add 后 --update 并等待/重启再验证;
    • 信任库条目含路径/大小/SHA256,替换文件后重新 add;
    • 有 permissive 观察期与 stop 回退预案;
    • 升级/CI 产物目录已纳入信任策略。
    • 未测试 fapolicyd-cli --file add 对脚本/解释型语言的细粒度规则;
    • 未测试自定义 rules.d 规则与 --test-filter 的完整语义;
    • 未测试 fapolicyd 与 rpm-plugin 在 dnf 升级时的交互;
    • 未测试大规模信任库(数万条)的性能。