我们公司有一个CentOS 7的networking服务器,我们的客户通过FTP(vsftpd)pipe理他们的网站。 SELinux处于强制模式。
问题是通过VSFTPD创build/ uploadad的数据不会inheritance相应的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站点,让我们说从另一个服务器通过SSH在/var/www/html/的目录,文件夹wp-content/和wp-content/uploads/具有适当的httpd_sys_rw_content_t安全上下文。 但是,当这些文件夹是通过FTP创build的,他们得到的上下文是httpd_sys_content_t (no rw )。 这意味着我们的客户上传到服务器的网站不能写入这些目录,即使他们给apache用户/组写入权限,所以WordPresspipe理不起作用。 所以,当他们上传一个网站时,他们不得不要求我们的支持来解决这个问题,这对所有参与者来说都是浪费时间。
假设客户上传他们的网站到httpdocs ,如果通过SSH我做的mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr问题解决了,所以没有任何问题数据。
我也可以做restorecon -Rv httpdocs/来解决这个问题。
所以,问题是:如何通过VSFTPD创build/上传的目录inheritance正确的SELinux上下文,就像在通过SSH创build/上传目录时inheritance它们一样?
运行时发生的默认标签与基于正则expression式的后置标签策略在服务器上有所不同。
你在这里注意到:
/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在目录中创build条目时,控制文件或目录结束标签的规则不是由您引用的正则expression式决定的,而是其他规则如下(我相信这是正确的顺序,但可能错过了某些内容) 。
type_transition规则。 type_transition规则。 default_context 。 所以,当我复制一个WordPress站点,让我们说从另一个服务器通过SSH在/ 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 和的操作 httpd_sys_rw_content_t 这对于SSHD的工作原因是因为在你login之后,你会得到这个规则适用的unconfined_t的源上下文。
这对FTP服务不起作用,因为这个服务的源上下文很可能是ftpd_t ,它没有匹配的规则。
因此,您需要修改策略来改变SELinux的行为,以便遵守您在FTP的其他条目中看到的命名文件裁决。
在Fedora 23中至less有一个接口允许这样做,像这样的策略模块就可以做到这一点。
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 。