尽pipe启用,SELinux不会强制执行apache写入限制

问题简介:当创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_cgihttpd_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 ,看看事情是否按照你期望的方式行事。