CentOS 中的 restorecon 不遵循 fcontext 顺序

CentOS 中的 restorecon 不遵循 fcontext 顺序

在尝试文件上下文时,我遇到了一个奇怪的行为,我觉得我遗漏了一些东西。以下是我所做的:

创建一堆目录和文件

# mkdir -p /virtual/www/cgi-bin
# touch /virtual/www/cgi-bin/script
# touch /virtual/www/webpage

从头开始制定一些规则

# semanage fcontext -D
# semanage fcontext -a -t httpd_sys_script_exec_t '/virtual/www/cgi-bin(/.*)?'
# semanage -a -t httpd_sys_content_t '/virtual/www(/.*)?'

测试一下!

# restorecon -vr /virtual
restorecon reset /virtual/www context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin/script context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/webpage context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

尽管 cgi-bin 的规则更具体,但每个文件/目录都具有 httpd_sys_content_t 类型。但是,我想要 cgi-bin 目录,下面具有 httpd_sys_script_exec_t 类型。我做错了什么?

在 CentOS 6 和 RedHat 7 中测试,结果相同。

答案1

因为 selinux 使用的模式无法排序(例如.*b与之比较b.*),所以 selinux 不按具体性对规则进行排序,而是按最后添加和最后应用的顺序排序。

不幸的是,semanage fcontext -l 通过简单的字符串比较对规则进行排序,这有助于找到您的规则,但如果您需要调试多个匹配的规则则无济于事。

您可以看到实际应用的顺序

cat /etc/selinux/targeted/contexts/files/file_contexts.local

因此,您需要先添加更通用的规则,然后再添加更具体的规则。或者,更好的方法是,尽力以每个文件只能匹配一条规则的方式构建规则。

相关内容