问题简介:当创build新/自定义文档根目录时,SELinux不会保护标记为httpd_sys_content_t的文件和目录不被写入,删除或更改。
我已经在不同的服务器版本上重复了两次这种行为。 环境干净,新鲜安装的CentOS 7.完全通过百胜补丁。 epl回购安装。 Apache,PHP,MySQL(mariadb),phpmyadmin安装。
SELinux在CentOS 7上默认启用。getenforce和sestatus都确认SELinux正在运行。
我在apache中创build了一个简单的虚拟主机,其文档根目录设置为:/ web / sites / test1
起初,一切都按预期工作。 SELinux将不允许Apache显示该网站,直到我做了以下事情:
semanage fcontext --add --type httpd_sys_content_t "/web(/.*)?" semanage fcontext --add --type httpd_sys_content_t "/web/sites(/.*)?" restorecon -Rv /web
正如所料,这样做后,虚拟主机工作。
然而,奇怪的行为是,在该虚拟主机中安装WordPress,即使httpd_sys_content_t上下文不应允许(根据我的理解),我可以通过WordPress上传图像等。
我已经确认,wordpress目录中的所有文件都被正确标记为:httpd_sys_content_t
然而wordpress仍然可以写入目录(只要老式文件权限允许)。
我提出了一个解决scheme:在执行完整的文件系统重新标记后,恢复典型/预期的行为:
touch /.autorelabel reboot
重新启动后,我必须使用httpd_sys_rw_content_t上下文。 但是我想更清楚地理解为什么这样一个步骤是必要的,因为我已经读过一个完整的重新标记应该很less(如果有的话)是必要的。 有没有更容易,更不激烈的手段让SELinux的行为如预期?
为了更加简洁:我是否应该在这种情况下做一个“touch /.autorelabel”? 有没有更好的办法? 如果它没有做任何事情就可以工作(这也是CentOS 7开箱即用的错误)?
@ dawud的评论是不正确的。 首先检查DAC权限。 如果他们拒绝访问,则该进程将收到拒绝的权限。 如果DAC允许访问,则检查selinux MAC策略。 如果DAC允许访问但MAC拒绝访问,则访问被拒绝。 DAC不能覆盖MAC。 图
你的Wordpress插件应该标记为httpd_sys_script_exec_t ,因此可以作为httpd_sys_script_t运行。 我使用了政策分析工具apol来查看CentOS虚拟机上的策略。 事实certificate,当启用httpd_enable_cgi和httpd_unified布尔值时,允许启用规则,使得具有httpd_sys_script_t标签的进程完全访问标有httpd_sys_content_t对象。
以下是打开的违规规则(由[Enabled]注释表示)。 请注意, httpdcontent是策略中分配给所有httpd_sys*content_t标签的SELinux属性,因此这些规则适用于所有这些标签。
allow httpd_sys_script_t httpdcontent : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; [Enabled] allow httpd_sys_script_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename entrypoint open } ; [Enabled] allow httpd_sys_script_t httpdcontent : lnk_file { ioctl read write create getattr setattr lock append unlink link rename } ; [Enabled]
另外打开的是types转换规则,它会导致由httpd_sys_script_t标签目录中的httpd_sys_script_t进程创build的新对象标记为httpd_sys_rw_content_t 。
type_transition httpd_sys_script_t httpd_sys_content_t : dir httpd_sys_rw_content_t; [Enabled] type_transition httpd_sys_script_t httpd_sys_content_t : file httpd_sys_rw_content_t; [Enabled] type_transition httpd_sys_script_t httpd_sys_content_t : lnk_file httpd_sys_rw_content_t; [Enabled]
我检查了红帽Apache SELinux文档 ,发现这个:
httpd_unified
启用时,此布尔值允许httpd_t完全访问所有httpdtypes(即执行,读取或写入sys_content_t)。 当禁用时,在只读,可写或可执行的Web内容之间存在分离。 禁用此布尔值可确保额外的安全级别,但会增加必须根据每个应拥有的文件访问权限单独标记脚本和其他Web内容的pipe理开销。
尝试closureshttpd_unified ,看看事情是否按照你期望的方式行事。