CentOS 7 - 通过 VSFTPD 创建的目录不继承 SELinux 上下文

Jua*_*ios 8 linux selinux centos vsftpd

我们公司有一个装有 CentOS 7 的网络服务器,我们的客户通过 FTP (vsftpd) 管理他们的网站。SELinux 处于强制模式。

问题是通过 VSFTPD 创建/上传的数据没有继承适当的 SELinux 上下文。让我解释。

例如,对于 WordPress 站点,服务器开箱即用,已经有几个可以使用 看到的规则semanage fcontext -l |grep '/var/www',它们是:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0
Run Code Online (Sandbox Code Playgroud)

因此,当我/var/www/html/通过 SSH从另一台服务器复制一个 WordPress 站点时,文件夹wp-content/wp-content/uploads/具有适当的httpd_sys_rw_content_t安全上下文。但是,当通过 FTP 创建这些文件夹时,它们获得的上下文是httpd_sys_content_t(no rw )。这意味着即使我们的客户向 apache 用户/组授予写权限,我们的客户上传到服务器的站点也无法写入这些目录,因此 WordPress 管理员不起作用。因此,当他们上传网站时,他们必须请求我们的支持来解决这个问题,这对所有相关人员来说都是浪费时间。

假设客户将他们的网站上传到httpdocs,如果我通过 SSHmv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr来解决问题,那么数据没有任何问题。

我也可以restorecon -Rv httpdocs/解决问题。

所以,问题是:如何让通过 VSFTPD 创建/上传的目录继承正确的 SELinux 上下文,就像通过 SSH 创建/上传目录时继承的一样?

Mat*_*Ife 6

在运行时发生的默认标签与适用于服务器的基于正则表达式的标签后策略之间存在差异。

你在这里注意到的是:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0
Run Code Online (Sandbox Code Playgroud)

是贴标签政策。

您在问题中讨论的内容实际上与运行时策略有关。

当使用 SELinux 在目录中创建条目时,管理文件或目录最终标签的规则不是由您引用的正则表达式决定的,而是由以下其他规则决定的(我相信这是正确的顺序,但可能遗漏了一些东西) .

  1. 有一个明确的命名type_transition规则。
  2. 有一个明确的非命名type_transition规则。
  3. 继承与父目录相同的上下文。
  4. 应用default_context.

因此,当我通过 SSH 将 WordPress 站点从另一台服务器复制到 /var/www/html/ 中的目录时,文件夹 wp-content/ 和 wp-content/uploads/ 具有正确的 httpd_sys_rw_content_t 安全上下文。

所以,是的,它确实这样做了,但不是因为你认为它这样做的原因。当然不是因为贴标签政策。

这是因为type_transition存在提供此行为的特定命名规则。

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 
Run Code Online (Sandbox Code Playgroud)

这基本上是说。

  • 如果你是unconfined_t
  • 如果您在目标类型中执行操作httpd_sys_content_t 并且
  • 如果新条目的类是目录并且
  • 如果新条目的名称是“上传”,
  • 新类型是 httpd_sys_rw_content_t

这适用于 SSHD 的原因是因为在您登录后,您将获得unconfined_t适用此规则的源上下文。

这不适用于 FTP 服务,因为该服务的源上下文很可能ftpd_t没有匹配规则。

因此,您需要修改策略以改变 SELinux 的行为,以也遵守您在其他 FTP 条目中看到的命名文件规则。

至少在 Fedora 23 中,存在一个允许这样做的接口,像这样的策略模块可以做到这一点。

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)
Run Code Online (Sandbox Code Playgroud)

您可以通过确保selinux-policy-devel安装并运行该包来加载它make -f /usr/share/selinux/devel/Makefile load