在尝试文件上下文时,我遇到了一个奇怪的行为,我觉得我遗漏了一些东西。以下是我所做的:
创建一堆目录和文件
# 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
因此,您需要先添加更通用的规则,然后再添加更具体的规则。或者,更好的方法是,尽力以每个文件只能匹配一条规则的方式构建规则。