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

我正在使用RHEL 6.3,并用matchpathconrestorecon SELinux命令试验了一个奇怪的行为。 对于一个特定的文件,我用semanage fcontext定义了一个上下文。 然后, matchpathcon告诉我该文件应该有我定义的上下文,但是restorecon使这个文件有另一个上下文。 我无法理解这种行为,我认为我做错了一些事情。

这里是一个重现这个行为的例子(我是一个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 

我会创build一个特定的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 

所以,我创build这个文件的上下文,我检查它已被保存。

 $ 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手动修改上下文,但这不是我想要做的。 这只是检查以前的别名理论。

 $ 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 

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

有没有其他的方式来定义这个SELinux的上下文,或者我做错了什么?

红帽的支持告诉我正确的操作方式。 上下文应该设置为/etc/rc.d/init.d/my-httpd,而不是/etc/init.d/my-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 

一旦正确的上下文规则设置, 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: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