RHEL 10 SELinux:文件上下文与布尔值
This content is not available in your language yet.
SELinux 的“拒绝”通常不是权限位问题,而是类型不对或布尔值没开。本页用 RHEL 10.2 实测两条最常用的修复路径:改文件上下文、开布尔值,并给出可回退的命令。
在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上实际执行:
getenforcesestatussudo dnf -y install policycoreutils-python-utils setools-consolesudo mkdir -p /srv/web && echo hello | sudo tee /srv/web/index.htmlsudo ls -Z /srv/web/index.htmlsudo semanage fcontext -a -t httpd_sys_content_t '/srv/web(/.*)?'sudo semanage fcontext -l | grep '/srv/web'sudo restorecon -Rv /srv/websudo ls -Z /srv/web/index.htmlsudo setsebool -P httpd_can_network_connect ongetsebool httpd_can_network_connectE3 记录:plans/content-expansion/evidence/rhel/rhel-selinux-context/run.json(13 步,含每步输出 sha256)。
先分清三个层次
Section titled “先分清三个层次”| 层次 | 看什么 | 改什么 |
|---|---|---|
| 模式 | getenforce / sestatus | /etc/selinux/config 或 setenforce(临时) |
| 文件上下文 | ls -Z、semanage fcontext -l | semanage fcontext + restorecon |
| 布尔值 | getsebool、semanage boolean -l | setsebool -P |
模式是 Enforcing/Permissive;上下文决定“这个文件属于哪个域可读”;布尔值决定“这个策略开关是否允许某类行为”。三者不要混为一谈。
文件上下文:semanage 写规则,restorecon 落地
Section titled “文件上下文:semanage 写规则,restorecon 落地”新建文件默认是 var_t:
$ sudo ls -Z /srv/web/index.htmlunconfined_u:object_r:var_t:s0 /srv/web/index.html加规则(只写策略数据库,不改文件):
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应用规则:
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.htmlunconfined_u:object_r:httpd_sys_content_t:s0 /srv/web/index.html注意 semanage 规则里的 user 是 system_u,而文件实际是 unconfined_u。这是正常的:restorecon 只保证 type 与规则一致,user 字段保留创建进程的域。判断“能不能被 httpd 读”看 type,不要因为 user 不一致就以为没生效。
布尔值:setsebool -P 才持久化
Section titled “布尔值:setsebool -P 才持久化”sudo setsebool -P httpd_can_network_connect ongetsebool httpd_can_network_connect# httpd_can_network_connect --> on-P 写入策略(重启后仍生效);不加 -P 只改运行时,重启即丢。查看所有布尔值:
sudo semanage boolean -l | grep httpd_can_network_connect# 布尔值回退sudo setsebool -P httpd_can_network_connect off
# 上下文规则回退:删规则 + 重新标注sudo semanage fcontext -d '/srv/web(/.*)?'sudo restorecon -Rv /srv/websudo ls -Z /srv/web/index.html# unconfined_u:object_r:var_t:s0AVC 排错顺序
Section titled “AVC 排错顺序”sudo ausearch -m AVC -ts recent或sudo journalctl -t audit | grep AVC找拒绝记录;- 看
scontext/tcontext/tclass,确认是 type 还是布尔值; - 能用布尔值解决就别写自定义策略;
- 自定义策略用
audit2allow生成后必须人工审,不要把dontaudit当修复。
-
getenforce是 Enforcing 才谈“被 SELinux 拒”; -
ls -Z看 type,不只看权限位; -
semanage fcontext -a后一定跟restorecon -Rv; - 布尔值用
setsebool -P,并记录回退值; - 变更前后各留一份
ls -Z/getsebool输出。
未实测与边界
Section titled “未实测与边界”- 未测试
audit2allow自定义策略模块的加载与回退; - 未测试
semanage fcontext -e等价规则、restorecond常驻; - 未测试容器/虚机内的 SELinux 嵌套;
- 未测试 MLS/MCS 多级安全场景。
- RHEL 安全基线与加固 — 系统级基线
- RHEL 安全公告与 errata — 补丁与 CVE
- 官方:Using SELinux
以下截图来自 PVE 上的实测环境,仅保留关键步骤。
