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

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

有人有处理文件的好方法吗/var/www?我们正在运行基于名称的虚拟主机,Apache 2 用户是www-数据

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

chown -R www-data:www-data

...一直以来,有什么好的方法可以解决这个问题?

补充问题:那么您对权限的要求有多严格呢?

这在协作开发环境中始终是一个问题。

答案1

尝试扩展@Zoredache 的回答,我自己也尝试了一下:

  • 创建一个新组(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=rwx 表示所有者(root),7=rwx 表示组(www-pub),5=rx 表示全世界(包括 apache www-data 用户)

    设置组 ID (设置组标识) 位 (2) 导致组 (www-pub) 被复制到该文件夹​​中创建的所有新文件/文件夹。其他选项包括 SETUID (4) 以复制用户 ID,以及 STICKY (1),我认为它只允许所有者删除文件。

    有一个-R递归选项,但它不会区分文件和文件夹,所以你必须使用查找,像这样:

    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

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

答案2

我不太确定你想如何配置权限,但这可能给你一个起点。可能有更好的方法。我假设你希望两个用户都能更改 /var/www/ 下的任何内容

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

这意味着您的任一用户创建的任何新文件都应为用户名:www-pub 0664,而创建的任何目录都应为用户名:www-pub 2775。Apache 将通过“其他用户”组件获得对所有内容的读取权限。目录上的 SETGID 位将强制所有正在创建的文件归拥有该文件夹的组所有。需要调整 umask 以确保设置写入位,以便组中的任何人都可以编辑文件。

至于我对权限的严格程度。这完全取决于网站/服务器。如果只有 1-2 个编辑,我只需要防止他们破坏太多东西,那么我会放轻松。如果业务需要更复杂的东西,那么我会设置更复杂的东西。

答案3

我认为您可能会发现 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

手册页:

教程

答案4

这个问题又问, 并作为讨论在 meta 上,当前的最佳实践提供了比 2009 年提出这个问题时更好的方法。这个答案试图给出一些当前的解决方案安全地处理协作 Web 开发环境


对于安全的 Web 服务器和协作开发来说,不仅仅只有文件权限:

  • 每个站点都有单独的用户即不为所有使用 的网站提供服务www-data。这很重要,因为如今 Apache 很少单独为静止的内容文件,但正在运行动态的网站。这个答案集中在 PHP 上,因为它是最常见的服务器站点语言,但同样的原则也适用于其他语言。

    如果某个站点存在安全问题,则该问题会蔓延至以同一用户身份运行的所有站点。攻击者可以看到用户看到的所有内容,包括数据库登录信息,并修改用户有写权限的每个站点。

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

    隔离网站并为每个网站分配一个用户后,您需要向网站开发人员授予访问权限,这就是问题所在。与其向他们提供这些网站用户的密码(或使用他们的个人用户帐户访问网站文件,如最初建议的那样),不如使用SSH 密钥用于登录。

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

    • 每个开发人员都可以访问任意数量的网站,而不必记住或存储与每个网站用户安排相关的所有密码。

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

    • 您可以使用非常强的密码或完全禁用基于密码的登录。

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

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

相关内容