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