AlmaLinux 10:SELinux 布尔值——别把它当成权限开关
AlmaLinux 10.2 Server 组虚拟机,SELinux Enforcing,policycoreutils-python-utils 3.10。
实测内容:枚举布尔值、运行时切换、持久化切换、查看本地修改、清理。截图:public/evidence/selinux/alma-booleans.png。
有多少个布尔值
Section titled “有多少个布尔值”$ getsebool -a | wc -l328328 个开关,全部是策略预留的开关。getsebool -a 只给名字与 on/off;要看描述和默认值用 semanage boolean -l:
$ semanage boolean -l | grep -E "^httpd_can_sendmail "httpd_can_sendmail (off , off) Allow httpd to can sendmail括号里是「当前值, 默认值」。默认值来自策略,你改的只是「与默认不同」的本地覆盖。
setsebool 与 setsebool -P 的差别,可以被测量
Section titled “setsebool 与 setsebool -P 的差别,可以被测量”$ setsebool httpd_can_sendmail on$ getsebool httpd_can_sendmailhttpd_can_sendmail --> on$ semanage boolean -l -C | tail -n +2 | wc -l0布尔值变了,但本地修改数仍然是 0——因为 setsebool 只改进程里的策略,重启或 reload 策略就回默认。
$ setsebool -P httpd_can_sendmail on$ semanage boolean -l -C | tail -n +2 | wc -l2$ semanage boolean -l -C | grep "^httpd_can_sendmail"httpd_can_sendmail (on , on) Allow httpd to can sendmail-P 才写进策略库。semanage boolean -l -C 是「本地覆盖」的权威视图——判断是否持久化,就看它。

持久化写在哪
Section titled “持久化写在哪”$ ls /var/lib/selinux/targeted/active/booleans.local/var/lib/selinux/targeted/active/booleans.local/etc/selinux/targeted/active/ 在现代策略库里已经不存在(老文档常写这个路径),实际文件在 /var/lib/selinux/targeted/active/。
它只是开关,不是放行
Section titled “它只是开关,不是放行”布尔值不创造新权限,只在已编译进策略的规则之间切换:
| 你以为 | 实际 |
|---|---|
打开 httpd_can_network_connect 就能连任意端口 | 只是允许 httpd 域发起网络连接,目标端口仍受策略约束 |
| 关掉某个布尔就能加固 | 可能直接打断业务,且没关掉真正的攻击面 |
所以顺序应该是:先看 AVC 拒绝 → 判断是哪条规则 → 再决定用布尔还是改标签/端口。
$ ausearch -m AVC -ts recent | tail -5audit2why 可以把 AVC 翻译成人话;sesearch 需要额外装 setools-console,最小化/Server 组都没有。
清理本地覆盖
Section titled “清理本地覆盖”$ semanage boolean -D$ semanage boolean -l -C | tail -n +2 | wc -l0-D 会清掉所有布尔值的本地覆盖(不是某一个)。在共享机器上执行前先 semanage boolean -l -C 看一眼有什么,别把别人调好的开关一起清掉。
setsebool之后重启失效:没加-P;semanage boolean -l -C显示 0 但布尔值不是默认:说明当前是运行时修改,重启会回退;- 拿布尔当防火墙:它不控制网络可达性,端口放行是 firewalld 的事;
-D当「删一个」用:它会清全部。
练习:找出并验证一个布尔
Section titled “练习:找出并验证一个布尔”sudo semanage boolean -l | grep -i nis | head -3sudo getsebool -a | grep nis | head -3sudo setsebool <选中的布尔> onsudo semanage boolean -l -C | tail -n +2 | wc -l # 应为 0sudo setsebool -P <选中的布尔> onsudo semanage boolean -l -C | tail -n +2 | wc -l # 应为 1sudo setsebool -P <选中的布尔> offsudo semanage boolean -D检查:
-C的计数只在-P后增加;-D后计数归零;- 布尔值回到策略默认;
- 业务功能未受影响(本例未绑定服务)。
常见问题
布尔值和 file context 该先用哪个?
取决于 AVC:提示「avc: denied」且路径标签不对,先修标签(restorecon/semanage fcontext);标签正确但功能被策略挡,才考虑布尔。
能自定义布尔值吗?
可以,需要写自己的策略模块并声明 gen_bool,属于策略开发范畴,不是运维开关。
为什么有些布尔改了没效果?
服务可能没重读策略,或该布尔只影响未启用的代码路径;改完重启对应服务再验证。
- SELinux 基础:/selinux-basics/
- 加固实操:/hardening/
- 服务管理:/ops-monitoring/