正确的wp-内容所有权和权限

时间:2019-08-26 作者:mustafa

我运行Ubuntu服务器来运行许多Wordpress网站。每个网站都由单独的系统用户上载和管理。允许系统用户FTP,但不能SSH到我的服务器。当他们登录时,他们会被记录到自己的文件夹中。Apache由www数据用户运行。

Wordpress用户在上载图像或文档时出错:

image.jpg has failed to upload. Unable to create directory wp-content/uploads/2019/08. Is its parent directory writable by the server?

同样,用户在安装新插件时也会出错。

更改wp内容文件夹的所有者可能是一个临时解决方案,但对我来说,这听起来不太安全。在Wordpress仍然可以根据需要运行的情况下,谁应该是wp contents文件夹的所有者以获得最佳安全性?

1 个回复
SO网友:djboris

在您的情况下,默认情况下,Apache本身添加的所有文件都将归服务器用户所有www-data. 但是,由于您的用户使用FTP进行部署,这些文件归他们所有,因此Apache会引起您的注意。更改的所有权wp-content 文件夹收件人www-data 完全不是不安全的,因为这是一个仅由Apache使用的默认用户,但正如您所说的,这只是一个临时解决方案。

对于永久解决方案,我建议Tom\'s解决方案来自this post on ServerFault:

试图扩展@Zoredache的answer, 当我亲自试一试时:

创建一个新组(www-pub)并将用户添加到该组

groupadd www-pub 
usermod -a -G www-pub usera    # must use -a to append to existing groups
usermod -a -G www-pub userb
groups usera    ## display groups for user
  • 将/var/www下的所有内容的所有权更改为root:www pub

    chown -R root:www-pub /var/www    # -R for recursive
    
    将所有文件夹的权限更改为2775

     chmod 2775 /var/www 
    
    2=设置组id,7=rwx 对于所有者(根),7=rwx 对于集团(www-pub),5=rx for world(包括apache www数据用户)

    设置组ID(SETGID) 位(2)会将组(www pub)复制到该文件夹中创建的所有新文件/文件夹中。其他选项有SETUID(4)来复制用户id,还有STICKY(1),我认为它只允许所有者删除文件。

    有一个-R 递归选项,但这不会区分文件和文件夹,因此您必须use find, 像这样:

    find /var/www -type d -exec chmod 2775 {} +
    
    将所有文件更改为0664

    find /var/www -type f -exec chmod 0664 {} +
    
    将用户的umask更改为0002

    umask控制默认的文件创建权限,0002表示文件将有664个目录和775个目录。设置(通过编辑umask 的底部线条/etc/profile 在我的情况下)意味着一个用户创建的文件可以由www组中的其他用户写入,而无需chmod 他们

  • 通过创建文件和目录并验证所有者、组和权限来测试所有这些ls -l.

    注意:您需要注销/登录才能使对组的更改生效!

    <小时>EDIT:
    如果您真的想为不同的客户端运行托管服务器,那么可以考虑以不同的方式设置和运行您的PHP,默认情况下(如mod_php). 我建议将其作为PHP-FPM 服务,因为它可以调整为使用用户的权限,这将进一步阻止PHP服务器对web根目录中的所有文件拥有完全的所有权和权限。

    This 是一篇优秀的文章,介绍了运行PHP的不同方法。我不是这方面的专家,你可以从ServerFault.

    相关推荐

    Testing Plugins for Multisite

    我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。