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


8

我们公司拥有一个带有CentOS 7的Web服务器,我们的客户通过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

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

假设客户将其网站上传到中httpdocs,如果通过SSH mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr可以解决问题,那么数据没有问题。

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

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


为了安全起见,根本不支持FTP是一个坏主意。考虑摆脱它,并指导客户如何配置其文件传输客户端以改为使用SFTP ...这也将摆脱此问题。
迈克尔·汉普顿

谢谢迈克尔。我同意您的意见,但是在我们的情况下,我们不为客户使用“ ftp.domain.com”,也没有公开服务器的公共IP地址(服务器位于NginX代理后面),因此FTP安全性不是问题为了我们。只有那些向我们发送FTP地址的用户才能找到通过FTP连接的服务器IP地址。
Juan Pablo Barrios

Answers:


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

是职位标签政策。

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

当使用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"; 

这基本上是在说。

  • 如果你是unconfined_t
  • 如果您以目标类型执行操作httpd_sys_content_t
  • 如果新条目的类是目录,则
  • 如果新条目的名称为“ uploads”,
  • 新的类型是 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)

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


1
嗨,马修(Matthew),这很成功!感谢您的帮助,因为我为此感到疯狂。我不知道你写,因为我从来没有定制SELinux的,所以我用Google搜索了一下,以下是我所做的策略模块做了什么:我创建的文件local_ftpd.te与你的策略模块,然后我做了make -f /usr/share/selinux/devel/Makefile local_ftpd.pp,然后semodule -i local_ftpd.pp。这个可以吗?现在,通过FTP创建的文件将继承所需的上下文。再次感谢!
Juan Pablo Barrios
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.