我正在使用 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