为许多路径添加/更新 fcontext 规则的最佳方法是什么?

为许多路径添加/更新 fcontext 规则的最佳方法是什么?

我需要一个例程来配置许多路径的 fcontext。目前,我维护一个调用 semanage 的 bash 脚本来执行此操作。但这个任务似乎相当冗长。这里的主要问题是:

  1. 我找不到简单的命令强制更新对象的规则。我需要使用semanage fcontext -l | grep <object>来查明该对象是否存在,然后我必须从中进行选择-a-m取决于结果。该命令非常慢,每次调用大约 0.5-1 秒。是否有现有工具可以强制更新规则?

  2. Semanage fcontext调用非常慢,有没有办法使用conf文件来定义规则?有一个文件/etc/selinux/targeted/contexts/files/file_contexts.local,但不应该手动编辑。

更新

尽管自定义策略模块可以是处理许多路径中的规则的规范方法。然而,semodule -i实际上比循环语义管理器命令慢得多。

这是 mytest.fc 的示例

/var/run/mytest/afolder(/.*)?  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/run/mytest/bfolder(/.*)?  gen_context(system_u:object_r:httpd_sys_rw_content_t, s0)
/var/run/mytest/cfolder(/.*)?  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/spool/mytest/alink  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/spool/mytest/blink  gen_context(system_u:object_r:httpd_sys_rw_content_t, s0)
/var/spool/mytest/clink  gen_context(system_u:object_r:httpd_sys_content_t, s0)

我的示例脚本版本:


#!/bin/bash
set -x
httpd_sys_content_paths=(
"/var/spool/mytest/alink"
"/var/spool/mytest/clink"
"/var/run/mytest/afolder(/.*)?"
"/var/run/mytest/cfolder(/.*)?"
)

for _path in "${httpd_sys_content_paths[@]}"
do
    set +e
    semanage fcontext -d "${_path}"
    set -e
    semanage fcontext -a -s system_u -t httpd_sys_content_t "${_path}"
done

httpd_sys_rw_content_paths=(
    "/var/spool/mytest/blink"
    "/var/run/mytest/bfolder(/.*)?"
)

for _path in "${httpd_sys_rw_content_paths[@]}"
do
    set +e
    semanage fcontext -d "${_path}"
    set -e
    semanage fcontext -a -s system_u -t httpd_sys_rw_content_t "${_path}"
done

semodule -i需要 35 秒。循环需要 25 秒。

答案1

你说得对,semanage fcontext就是慢。但是,它从未被设计为以批处理模式连续运行。

因此,我建议您创建自己的自定义 SELinux 策略。对于 RHEL 衍生产品,这涉及安装policycoreutils-devel软件包(依次标记selinux-policy-devel)。

从这里有两种可能性。第一个选择既快又脏。第二种选择更费力,但会给你更多的力量。

选项 1 - 使用 make 的简单策略包

假设您有一个目录,/unixsetest其中包含一个名为 的文件testfile,这两个文件的默认 SELinux 文件上下文均为default_t

$ ls -laZ /unixsetest
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 testfile

现在,假设您想要testfile获取文件上下文,但由于您在问题中所述的原因而admin_home_t不想使用。semanage fcontext

创建一个名为(类型强制)的文件,unixsetest.te其中包含以下内容:

policy_module(unixsetest, 1.0)

创建一个名为(文件上下文定义)的文件unixsetest.fc,其中包含以下内容:

/unixsetest(/.*)?   --  gen_context(system_u:object_r:admin_home_t,s0)

现在,通过发出以下命令将其编译到您定制的 SELinux 策略中:

$ make -f /usr/share/selinux/devel/Makefile
Compiling targeted unixsetest module
/usr/bin/checkmodule:  loading policy configuration from tmp/unixsetest.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 19) to tmp/unixsetest.mod
Creating targeted unixsetest.pp policy package
rm tmp/unixsetest.mod.fc tmp/unixsetest.mod

并安装它:

$ semodule -i unixsetest.pp

确认已加载:

$ semodule -l | grep unixsetest
unixsetest      1.0

确认文件上下文已加载到文件上下文定义数据库中:

$ semanage fcontext -l | grep admin_home_t
/root(/.*)?                                        all files          system_u:object_r:admin_home_t:s0
/unixsetest(/.*)?                                  regular file       system_u:object_r:admin_home_t:s0

(请注意,第一行是操作系统基础 SElinux 策略的一部分,第二行是我们通过自定义策略文件添加的部分)

现在,使用以下命令应用文件上下文restorecon

$ restorecon -Rv /unixsetest/
restorecon reset /unixsetest/testfile context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:admin_home_t:s0

有效:

 ls -laZ /unixsetest
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 testfile

选项 2 - 使用 sepolicy-generate 工具集的复杂策略 (RPM) 包

您现在可以访问该sepolicy-generate工具了。运行man sepolicy-generate来检查它能做什么。它专门用于基于 RPM 的安装,并将策略安装与软件包安装紧密集成。

sepolicy generate您可以通过使用指定您想要执行的操作的适当参数运行来从模板创建策略:

       Confined Applications

       sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]
       sepolicy generate --cgi [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --dbus [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --inetd [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --init [-n NAME] command [-w WRITE_PATH ]

       Confined Users

       sepolicy generate --admin_user [-r TRANSITION_ROLE] -n NAME
       sepolicy generate --confined_admin -n NAME [-a ADMIN_DOMAIN] [-u USER] [-n NAME] [-w WRITE_PATH]
       sepolicy generate --desktop_user -n NAME [-w WRITE_PATH]
       sepolicy generate --term_user -n NAME [-w WRITE_PATH]
       sepolicy generate --x_user -n NAME [-w WRITE_PATH]

       Miscellaneous Policy

       sepolicy generate --customize -d DOMAIN -n NAME [-a ADMIN_DOMAIN]
       sepolicy generate --newtype -t type -n NAME
       sepolicy generate --sandbox -n NAME

策略包将包含以下 5 个文件:

       Type Enforcing File NAME.te
       This file can be used to define all the types rules for a particular domain.

       Note: Policy generated by sepolicy generate will automatically add a permissive DOMAIN  to
       your  te  file.   When  you  are  satisfied that your policy works, you need to remove the
       permissive line from the te file to run your domain in enforcing mode.

       Interface File NAME.if
       This file defines the interfaces for the types generated in the te file, which can be used
       by other policy domains.

       File Context NAME.fc
       This file defines the default file context for the system, it takes the file types created
       in the te file and associates file paths to the types.  Tools like restorecon and RPM will
       use these paths to put down labels.

       RPM Spec File NAME_selinux.spec
       This  file  is  an  RPM  SPEC  file  that  can be used to install the SELinux policy on to
       machines and setup the labeling. The spec file also installs the interface file and a  man
       page  describing  the  policy.   You  can use sepolicy manpage -d NAME to generate the man
       page.

       Shell File NAME.sh
       This is a helper shell script to compile, install  and  fix  the  labeling  on  your  test
       system.   It  will also generate a man page based on the installed policy, and compile and
       build an RPM suitable to be installed on other machines

当然,您会对 .fc 文件特别感兴趣。

有一些很好的教程可以为您提供帮助。我特别推荐 RH 文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_selinux/writing-a-custom-selinux-policy_using-selinuxhttps://linuxconcept.com/tutorial/extending- generated-selinux-policies/

相关内容