跳转到内容
搜索 RHEL 文档

    浏览当前文档目录

    RHEL 10 SELinux:文件上下文与布尔值

    SELinux 的“拒绝”通常不是权限位问题,而是类型不对或布尔值没开。本页用 RHEL 10.2 实测两条最常用的修复路径:改文件上下文、开布尔值,并给出可回退的命令。

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

    Terminal window
    getenforce
    sestatus
    sudo dnf -y install policycoreutils-python-utils setools-console
    sudo mkdir -p /srv/web && echo hello | sudo tee /srv/web/index.html
    sudo ls -Z /srv/web/index.html
    sudo semanage fcontext -a -t httpd_sys_content_t '/srv/web(/.*)?'
    sudo semanage fcontext -l | grep '/srv/web'
    sudo restorecon -Rv /srv/web
    sudo ls -Z /srv/web/index.html
    sudo setsebool -P httpd_can_network_connect on
    getsebool httpd_can_network_connect

    E3 记录:plans/content-expansion/evidence/rhel/rhel-selinux-context/run.json(13 步,含每步输出 sha256)。

    层次看什么改什么
    模式getenforce / sestatus/etc/selinux/config 或 setenforce(临时)
    文件上下文ls -Z、semanage fcontext -lsemanage fcontext + restorecon
    布尔值getsebool、semanage boolean -lsetsebool -P

    模式是 Enforcing/Permissive;上下文决定“这个文件属于哪个域可读”;布尔值决定“这个策略开关是否允许某类行为”。三者不要混为一谈。

    文件上下文:semanage 写规则,restorecon 落地

    Section titled “文件上下文:semanage 写规则,restorecon 落地”

    新建文件默认是 var_t:

    $ sudo ls -Z /srv/web/index.html
    unconfined_u:object_r:var_t:s0 /srv/web/index.html

    加规则(只写策略数据库,不改文件):

    Terminal window
    sudo semanage fcontext -a -t httpd_sys_content_t '/srv/web(/.*)?'
    sudo semanage fcontext -l | grep '/srv/web'
    # /srv/web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0

    应用规则:

    Terminal window
    sudo restorecon -Rv /srv/web
    # Relabeled /srv/web from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

    再核对:

    $ sudo ls -Z /srv/web/index.html
    unconfined_u:object_r:httpd_sys_content_t:s0 /srv/web/index.html

    注意 semanage 规则里的 user 是 system_u,而文件实际是 unconfined_u。这是正常的:restorecon 只保证 type 与规则一致,user 字段保留创建进程的域。判断“能不能被 httpd 读”看 type,不要因为 user 不一致就以为没生效。

    Terminal window
    sudo setsebool -P httpd_can_network_connect on
    getsebool httpd_can_network_connect
    # httpd_can_network_connect --> on

    -P 写入策略(重启后仍生效);不加 -P 只改运行时,重启即丢。查看所有布尔值:

    Terminal window
    sudo semanage boolean -l | grep httpd_can_network_connect
    Terminal window
    # 布尔值回退
    sudo setsebool -P httpd_can_network_connect off
    # 上下文规则回退:删规则 + 重新标注
    sudo semanage fcontext -d '/srv/web(/.*)?'
    sudo restorecon -Rv /srv/web
    sudo ls -Z /srv/web/index.html
    # unconfined_u:object_r:var_t:s0
    1. sudo ausearch -m AVC -ts recent 或 sudo journalctl -t audit | grep AVC 找拒绝记录;
    2. 看 scontext/tcontext/tclass,确认是 type 还是布尔值;
    3. 能用布尔值解决就别写自定义策略;
    4. 自定义策略用 audit2allow 生成后必须人工审,不要把 dontaudit 当修复。
    • getenforce 是 Enforcing 才谈“被 SELinux 拒”;
    • ls -Z 看 type,不只看权限位;
    • semanage fcontext -a 后一定跟 restorecon -Rv;
    • 布尔值用 setsebool -P,并记录回退值;
    • 变更前后各留一份 ls -Z / getsebool 输出。
    • 未测试 audit2allow 自定义策略模块的加载与回退;
    • 未测试 semanage fcontext -e 等价规则、restorecond 常驻;
    • 未测试容器/虚机内的 SELinux 嵌套;
    • 未测试 MLS/MCS 多级安全场景。

    以下截图来自 PVE 上的实测环境,仅保留关键步骤。

    SELinux Enforcing
    SELinux Enforcing