it-swarm.cn

/ var / www中处理Apache 2用户www-data权限的最佳方法是什么?

有没有人有一个不错的解决方案来处理/var/www中的文件?我们正在运行基于名称的虚拟主机,并且Apache 2用户为www-data

我们有两个普通用户和root用户。因此,当处理/var/www中的文件时,不必...

chown -R www-data:www-data

...一直以来,有什么好的方法来处理这个问题?

补充问题:您接下来如何获得许可权?

在协作开发环境中,这一直是一个问题。

218
Gareth

尝试扩展@Zoredache的 answer ,因为我自己做了一下:

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

    groupadd www-pub

    usermod -a -G www-pub usera##必须使用-a附加到现有组中

    usermod -a -G www-pub userb

    groups usera##个用户显示组

  • 将/ var/www下所有内容的所有权更改为root:www-pub

    chown -R root:www-pub /var/www## -R递归

  • 将所有文件夹的权限更改为2775

    chmod 2775 /var/www## 2 =设置组ID,7 =所有者(root)的rwx,7 =组(www-pub)的rwx,5 =世界的rx(包括Apache www-data用户)

    设置组ID( [〜#〜] setgid [〜#〜] )位(2)使该组(www-pub)复制到该文件夹​​中创建的所有新文件/文件夹。其他选项包括SETUID(4)(用于复制用户ID)和STICKY(1),我认为只能让所有者删除文件。

    有一个-R递归选项,但是不会区分文件和文件夹,因此您必须 使用find ,如下所示:

    find /var/www -type d -exec chmod 2775 {} +

  • 将所有文件更改为0664

    find /var/www -type f -exec chmod 0664 {} +

  • 将用户的umask更改为0002

    Umask控制默认的文件创建权限,0002表示文件将具有664和目录775。设置此项(在我的情况下,通过编辑/etc/profile底部的umask行)表示由一个文件创建该用户将可由www-group中的其他用户写入,而无需chmod

通过创建文件和目录并使用ls -l验证所有者,组和权限来测试所有这些。

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

209
Tom

我不确定要如何配置权限,但这可能会为您提供一个起点。可能有更好的方法。我假设您希望两个用户都可以在/ var/www /下进行任何更改

  • 创建一个新的组(www-pub)并将用户添加到该组。
  • 将/ var/www下所有内容的所有权更改为root:www-pub。
  • 将所有文件夹的权限更改为2775
  • 将所有文件更改为0664。
  • 将用户的umask更改为0002

这意味着您的任何一个用户创建的任何新文件都应为username:www-pub 0664,而创建的任何目录均应为username:www-pub2775。Apache将通过“其他用户”组件对所有内容进行读取访问。目录上的SETGID位将强制所有创建的文件归拥有该文件夹的组所有。需要调整umask以确保已设置写位,以便组中的任何人都可以编辑文件。

至于我的权限有多高。它完全取决于站点/服务器。如果只有1-2个编辑器,而我只需要防止它们破坏得太厉害,那么我会很轻松的。如果业务需要更复杂的东西,那么我会设置更复杂的东西。

62
Zoredache

我认为您可能会发现POSIX ACL(访问控制列表)会有所帮助。与user:group:other模型相比,它们允许更精细的权限模型。我发现它们更容易保持直觉,因为我可以更加明确,也可以为文件系统的分支设置“默认”行为。

例如,您可以显式指定每个用户的权限:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

或者,您可以基于一些共享组来执行此操作:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

也许您想让您的Apache用户保持只读状态

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

手册页:

教程

39
Joe Holloway

这个问题是 再次询问 ,关于 已讨论 ,关于元数据,当前的最佳实践提供了比2009年被问到的更好的方法。此答案试图为安全处理协作Web开发环境提供一些当前的解决方案。


对于安全的Web服务器和协作开发,不仅仅具有文件许可权:

  • 为每个站点都有单独的用户,即不要使用www-data服务所有站点。这很重要,因为当今Apache很少只提供静态内容文件,而只提供dynamic网站。这个答案集中在PHP,因为它是 最常见 服务器站点语言),但是相同的原理也适用于其他语言。

    如果您在单个站点上遇到安全问题,则该问题可能会扩散到以同一用户身份运行的每个站点。攻击者可以查看用户看到的所有内容,包括数据库登录信息,并修改用户具有写权限的每个站点。

  • 使用SSH文件传输协议(SFTP)。在使用FTP时,出于安全性考虑,应放弃使用FTP(因为它以纯文本形式发送密码和内容) ,它是安全的替代品SFTP还具有一项功能,是协作Web开发的完美解决方案。

    隔离站点并为每个站点分配一个用户后,您需要授予Web开发人员访问权限,此问题的全部内容。您可以使用 SSH密钥 进行登录,而不是为他们提供这些站点用户的密码(或使用最初建议的使用其个人用户帐户访问站点文件)。

    每个开发人员都可以生成密钥对,并将私钥保密。然后,将开发人员正在使用的每个网站用户帐户的公钥添加到~/.ssh/authorized_keys文件中。这具有管理密码和登录名的许多优点:

    • 每个开发人员都可以访问任意数量的网站,而无需负担记住或存储每个用户按地点排列所涉及的所有密码。

    • 无需每次有人离开公司就更改和共享密码。

    • 您可以使用非常严格的密码,也可以完全禁用基于密码的登录。

  • 使用PHP-FPM。这是当前以用户身份运行PHP。为每个用户创建一个新的pool,即每个站点一个池。这对于安全性和性能都是最好的。 ,因为您还可以指定单个站点可以消耗多少资源。

    参见例如NeverEndingSecurity的 在Linux上使用单独的用户/ uid和组运行php-fpm 。有一些教程,例如HowtoForge的 在Ubuntu 16.04上将PHP-FPM与Apache配合使用 ,它们不使用PHP-FPM通过用户分离来提高安全性,而是指导在服务器上使用单个FPM套接字。

11
Esa Jokinen