尽管已启用 SELinux,但并未强制执行 apache 写入限制

尽管已启用 SELinux,但并未强制执行 apache 写入限制

问题简而言之:在创建新的/自定义文档根目录时,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_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]

同时启用了类型转换规则,这些规则导致httpd_sys_script_thttpd_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看看事情是否按照您期望的方式发展。

相关内容