RHEL SELinux 上下文在 matchpathcon 和 restorecon 之间有所不同

RHEL SELinux 上下文在 matchpathcon 和 restorecon 之间有所不同

我正在使用 RHEL 6.3,并且遇到了一个奇怪的行为matchpathcon恢复控制SELinux 命令。对于特定文件,我已使用以下命令定义了上下文:语义管理上下文。 然后,matchpathcon告诉我该文件应该具有我定义的上下文,但是恢复控制使文件具有其他上下文。我无法理解这种行为,我认为我做错了什么。

下面是重现此行为的示例(我是 root 用户):

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.3 (Santiago)

$ sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

我将创建一个特定的 init.d 脚本来启动 HTTPD 守护进程。

$ touch /etc/init.d/my-httpd
$ ls -Z /etc/init.d/my-httpd 
-rw-------. root root unconfined_u:object_r:etc_t:s0   /etc/init.d/my-httpd

因此,我为该文件创建了上下文并检查它已被保存。

$ semanage fcontext -a -t httpd_initrc_exec_t /etc/init.d/my-httpd
$ semanage fcontext -C -l
contexte fichier SELinux                           type               Contexte

/etc/init.d/my-httpd                               all files          system_u:object_r:httpd_initrc_exec_t:s0

matchpathcon -V /etc/init.d/my-httpd 
/etc/init.d/my-httpd has context unconfined_u:object_r:etc_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0

然后,我尝试将上下文恢复到matchpathcon告诉我。

restorecon -v /etc/init.d/my-httpd 
restorecon reset /etc/rc.d/init.d/my-httpd context unconfined_u:object_r:etc_t:s0->unconfined_u:object_r:initrc_exec_t:s0

$ ls -Z /etc/init.d/my-httpd 
-rw-------. root root unconfined_u:object_r:initrc_exec_t:s0 /etc/init.d/my-httpd

此时,我发现上下文尚未按我的想法定义。我尝试再次检查matchpathcon,也许httpd_initrc_exec_t是initrc_exec_t的别名。

matchpathcon -V /etc/init.d/my-httpd 
/etc/init.d/my-httpd has context unconfined_u:object_r:initrc_exec_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0

$ restorecon -v -F /etc/init.d/my-httpd 
restorecon reset /etc/rc.d/init.d/my-httpd context unconfined_u:object_r:initrc_exec_t:s0->system_u:object_r:initrc_exec_t:s0

$ matchpathcon -V /etc/init.d/my-httpd 
/etc/init.d/my-httpd has context system_u:object_r:initrc_exec_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0

然后,我尝试手动修复上下文氯乙烯但这不是我想要的方式。这只是为了检查前面的别名理论。

$ chcon -t httpd_initrc_exec_t /etc/init.d/my-httpd 
$ ls -Z /etc/init.d/my-httpd 
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/init.d/my-httpd
$ matchpathcon -V /etc/init.d/my-httpd 
/etc/init.d/my-httpd verified.

$ restorecon -v /etc/init.d/my-httpd 
restorecon reset /etc/rc.d/init.d/my-httpd context system_u:object_r:httpd_initrc_exec_t:s0->system_u:object_r:initrc_exec_t:s0

这些上下文似乎不是别名,但仍然有一个奇怪的行为恢复控制命令,并且我计划使用它的功能。

还有其他方法可以定义这个 SELinux 上下文吗?或者我做错了什么?

答案1

Red Hat 支持人员告诉我正确的操作方法。应设置上下文/etc/rc.d/init.d/我的httpd而不是为了/etc/init.d/我的httpd

$ semanage fcontext -d -t httpd_initrc_exec_t /etc/init.d/my-httpd
$ semanage fcontext -C -l
$ semanage fcontext -a -t httpd_initrc_exec_t /etc/rc.d/init.d/my-httpd
$ semanage fcontext -C -l
SELinux fcontext                                   type               Context

/etc/rc.d/init.d/my-httpd                          all files          system_u:object_r:httpd_initrc_exec_t:s0

一旦设置了正确的上下文规则,恢复控制致力于/etc/init.d/我的httpd文件。

ls -Z /etc/rc.d/init.d/my-httpd /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:initrc_exec_t:s0 /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/my-httpd
$ restorecon /etc/init.d/my-httpd
$ ls -Z /etc/rc.d/init.d/my-httpd /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/rc.d/init.d/my-httpd

相关内容