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


有谁有一个很好的解决方案来处理文件 /var/www?我们正在运行基于名称的虚拟主机,Apache 2用户正在运行 www数据

我们有两个普通用户和root用户。所以当搞乱文件时 /var/www而不是......

chown -R www-data:www-data

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

补充问题:你是如何获得权限的硬核?

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


211
2018-05-11 05:13




另见: 用于我的网站的最佳Linux权限是什么? - Zoredache


答案:


试图扩展@ 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(SETGID)bit(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.设置此(通过编辑 umask 在底部的线 /etc/profile 在我的情况下)意味着一个用户创建的文件将由www-group中的其他用户写入,而无需 chmod 他们。

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

注意:您需要注销/以更改组才能生效!


201
2017-09-15 05:11



@Tom很高兴看到你推荐使用 find为此命令。如果你有很多文件/目录并且你正在使用GNU find,那么我会给出一个小的性能提示 + 代替 \; 这样命令就可以了 对多个文件进行操作 因为 “一次在尽可能多的文件上运行命令更快,而不是每个文件运行一次。这样做可以节省每次启动命令所需的时间。” 此外,它更容易键入,因为它不需要反斜杠。 - aculich
更新了@ aculich的建议,使用+ not \; - Tom
@SunnyJ。试试这个(没有外引号):“find / var / www -type f -exec chmod 0664'{}'\ +”试试看。 '{}'和\ +之间有一个空格。 - Buttle Butkus
@汤姆 - 打破它的方式,谢谢。只是一个注释 - 我认为你的答案中包含的“复制用户ID的SETUID(4)”是错误的 - 当应用于Linux / Unix中的目录时,SETUID被忽略 - 参考 - Yarin
好的,所以 usera 和 userb 你的意思是 www-data 和 ftpuser ?我发现这一点非常令人困惑 www-data这是原来的问题。此外,设置所有者的意义/好处是什么 root?我们应该把它设置为 ftpuser? - gskema


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

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

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

至于我如何获得权限核心。它完全取决于站点/服务器。如果只有1-2个编辑器,我只是需要让他们不要破坏事情,那么我会很容易。如果业务需要更复杂的东西,那么我会设置更复杂的东西。


59
2018-05-11 05:49



可能的添加 - 设置缓存/上传目录,需要由网络服务器写入www-data:www-data和775。 - gacrux
是否可以将用户添加到apache组而不依赖于“其他”权限?如果你正在做的只是上传文件,那些文件需要被apache读取,第三组似乎只在你需要编辑这些文件时才有用。 - Simurr
你有没有机会扩展这个@Zoredache?我理解了rwx位,chmod,chown,adduser,usermod的基本用法,但你已经失去了我的八进制权限,umasks和所有这些额外的第一个数字。将非常感谢一些示例命令,说明您概述的方法。 - Tom
这样每个用户都可以访问其他所有用户文件!这意味着userA可以读取userB的config.php ...例如,stoling其mysql凭证 - drAlberT
使用acl你可以处理安全性和协作性:) - drAlberT


我想你可能会发现POSIX ACL(访问控制列表)很有帮助。与用户:group:其他模型相比,它们允许更细粒度的权限模型。我发现它们更容易直接保持在我脑海中,因为我可以更明确,并且还可以为文件系统的分支设置“默认”行为。

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

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
2018-05-11 16:26



那是 方式 ! +1 - drAlberT
获胜的ACL +1 ...有关详情,请参阅 serverfault.com/a/360120/41823 - Yarin
我想知道ACL与基本权限是否有任何性能下降。 - Buttle Butkus
不幸的是,标准安装/分发中经常缺少ACL。在我管理的每个服务器上编译内核都很痛苦,或者更糟糕的是,有时会更改文件系统。另外,备份文件时必须非常小心,特别是在切换服务器时。 ACL很棒,但它目前的支持是如此之低,以至于对于那些对服务器和环境中的所有内容没有完全控制权的人,我建议不要使用它。但是+1指出ACL确实有意义! - Ninj
好的答案+1;关于更改apache进程读/写权限的说明(www-data 例如)对于整个站点的只读(通过setfacl或chmod - 或两者) - >这显然会阻止所有写入(例如,在大多数CMS上从浏览器端上载/模块上载/更新)。我相信很多流行的也只测试用户perm级别的写访问权限而不是组级别。您仍然可以更新,但必须手动应用更新以及写入文件夹的任何自定义权限(logs / temp / uploads / etc)。如果您的网站使用它,只读是一种很好的安全性。大多数情况下都是如此。 - bshea


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


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

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

    如果您在单个站点上存在安全问题,则它可以传播到作为同一用户运行的每个站点。攻击者可以看到用户看到的所有内容,包括数据库登录信息,并修改用户具有写入权限的每个站点。

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

    一旦您隔离了每个站点的站点和一个用户,您需要授予Web开发人员访问权限,这个问题的全部内容。您可以使用,而不是为这些网站用户提供密码 - 或者使用他们最初建议的个人用户帐户访问网站文件 SSH密钥 登录

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

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

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

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

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

    参见例如NeverEndingSecurity的 在linux上使用单独的user / uid和group运行php-fpm。还有像HowtoForge这样的教程 在Ubuntu 16.04上使用PHP-FPM和Apache 不使用PHP-FPM通过用户分离来提高安全性,指导在服务器上使用单个FPM套接字。


7
2018-05-10 10:03