5.4. 创建本地 SELinux 策略模块
在活跃的 SELinux 策略中添加特定的 SELinux 策略模块可以修复 SELinux 策略的某些问题。您可以使用此流程修复 红帽发行注记 中介绍的特定已知问题,或实施特定的 红帽解决方案。
只用红帽提供的规则。红帽不支持使用自定义规则创建 SELinux 策略模块,因为这不会超出 产品支持覆盖范围。如果您并不是相关系统的专家,请联系红帽销售代表并请求咨询服务。
先决条件
-
setools-console
和audit
软件包进行验证。
步骤
使用文本编辑器打开新的
.cil
文件,例如:# vim <local_module>.cil
要让您的本地模块更好地组织,请在本地 SELinux 策略模块的名称中使用
local_
前缀。从已知问题或红帽解决方案中插入自定义规则。
重要不要自己编写规则。仅使用特定已知问题或红帽解决方案中提供的规则。
例如,要实现 SELinux 拒绝 cups-lpd 对 RHEL 解决方案中的 cups.sock 的读访问权限,请插入以下规则:
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
在 RHBA-2021:4420 中为 RHEL 永久修复了示例解决方案。因此,特定于本解决方案的部分对更新的 RHEL 8 和 9 个系统没有影响,且只作为语法示例包括。
您可以使用两个 SELinux 规则语法之一: Common Intermediate Language (CIL)和 m4。例如,CIL 中的
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
等同于 m4 中的以下内容:module local_cupslpd-read-cupssock 1.0; require { type cupsd_var_run_t; type cupsd_lpd_t; class sock_file read; } #============= cupsd_lpd_t ============== allow cupsd_lpd_t cupsd_var_run_t:sock_file read;
- 保存并关闭该文件。
安装策略模块:
# semodule -i <local_module>.cil
如果要删除使用
semodule -i
创建的本地策略模块,请参考不带.cil
后缀的模块名称。要删除本地策略模块,请使用semodule -r <local_module>
。重启与规则相关的任何服务:
# systemctl restart <service-name>
验证
列出 SELinux 策略中安装的本地模块:
# semodule -lfull | grep "local_" 400 local_module cil
由于本地模块具有优先级
400
,所以您也可以通过使用该值来从列表中过滤它们,例如使用semodule -lfull | grep -v ^100
命令。在 SELinux 策略中搜索相关的允许规则:
# sesearch -A --source=<SOURCENAME> --target=<TARGETNAME> --class=<CLASSNAME> --perm=<P1>,<P2>
其中
<SOURCENAME>
是源 SELinux 类型,<TARGETNAME>
是目标 SELinux 类型,<CLASSNAME>
是安全类或对象类名称,<P1>
和<P2>
规则的特定权限。例如,SELinux denies cups-lpd read access to cups.sock in RHEL 解决方案:
# sesearch -A --source=cupsd_lpd_t --target=cupsd_var_run_t --class=sock_file --perm=read allow cupsd_lpd_t cupsd_var_run_t:sock_file { append getattr open read write };
最后一行现在应包含
read
操作。验证相关服务受 SELinux 限制:
确定与相关服务相关的进程:
$ systemctl status <service-name>
检查上一命令输出中列出的进程的 SELinux 上下文:
$ ps -efZ | grep <process-name>
验证该服务是否不会导致任何 SELinux 拒绝:
# ausearch -m AVC -i -ts recent <no matches>
i
选项将数字值解译为人类可读的文本。
其他资源
- 如何明智地创建自定义 SELinux 策略模块 知识库文章