问题简而言之:在创建新的/自定义文档根目录时,SELinux 不会保护标记为 httpd_sys_content_t 的文件和目录不被写入、删除或更改。
我在不同的服务器版本上重现了两次此行为。环境干净,全新安装 CentOS 7。通过 yum 完全修补。epl repo 已安装。apache、php、mysql (mariadb)、phpmyadmin 已安装。
SELinux 在 CentOS 7 上默认启用。getenforce 和 sestatus 均确认 SELinux 正在运行。
我在 apache 中创建了一个简单的虚拟主机,其文档根目录设置为:/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 后,我可以通过 wordpress 上传图像等,即使 httpd_sys_content_t 上下文不允许这样做(根据我的理解)。
我已确认 wordpress 目录中的所有文件均正确标记为类型:httpd_sys_content_t
然而 wordpress 仍然能够写入目录(只要老式的文件权限允许)。
我想出了一个解决方案:在进行完整的文件系统重新标记后,典型/预期的行为将恢复:
touch /.autorelabel
reboot
重启后,我必须使用 httpd_sys_rw_content_t 上下文,正如我所期望的那样。但我想更清楚地了解为什么需要采取这样的步骤,因为我读到过,完全重新标记很少(如果有的话)是必要的。有没有一些更简单、更不激烈的方法可以让 SELinux 按照预期运行?
更简洁地说:在这种情况下,我是否应该执行“touch /.autorelabel”?有没有更好的方法?它是否应该在没有执行任何其他操作的情况下正常工作(因此这是 CentOS 7 的一个“开箱即用”错误)?
答案1
@dawud 的评论不正确。DAC 权限已检查第一的。如果他们拒绝访问,则该进程将被拒绝访问。如果 DAC 允许访问,则检查 selinux MAC 策略。如果 DAC 允许访问但 MAC 拒绝访问,则访问被拒绝。DAC 永远无法覆盖 MAC。 图表
您的 Wordpress 插件应带有标签httpd_sys_script_exec_t
,因此应以 的身份运行httpd_sys_script_t
。我使用apol
策略分析工具来查看 CentOS VM 上的策略。事实证明,当启用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]
同时启用了类型转换规则,这些规则导致httpd_sys_script_t
在httpd_sys_content_t
带 -标签的目录中由进程创建的新对象被标记为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]
我检查了Red Hat Apache SELinux 文档并发现了这一点:
httpd_unified
启用后,此布尔值允许 httpd_t 完全访问所有 httpd 类型(即执行、读取或写入 sys_content_t)。禁用后,只读、可写或可执行的 Web 内容将分开。禁用此布尔值可确保额外的安全级别,但会增加管理开销,因为必须根据每个应具有的文件访问权限单独标记脚本和其他 Web 内容。
尝试关闭httpd_unified看看事情是否按照您期望的方式发展。