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


214

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

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

chown -R www-data:www-data

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

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

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


Answers:


206

尝试扩展@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 =所有者(root)的rwx,7 =组(www-pub)的rwx,5 =世界(包括Apache www-data用户)的rx

    设置组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。对此进行设置(在我的情况umask下,通过编辑底部的行/etc/profile)意味着一个用户创建的文件可以被其他用户写入www-组,而无需chmod他们。

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

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


6
@Tom很高兴看到您建议find为此使用命令。如果您有很多文件/目录并且使用的是GNU find,我会给您一个性能小提示,它使用+而不是来\;使该命令可以在多个文件上运行,因为“在尽可能多的文件上运行命令更快一次,而不是每个文件一次。这样做可以节省每次启动命令的时间。” 另外,由于不需要反斜杠,因此更易于键入。
aculich 2012年

2
@aculich建议使用+而不是\更新;
汤姆

1
@SunnyJ。尝试执行此操作(不使用外部引号):“查找/ var / www -type f -exec chmod 0664'{}'\ +”。'{}'和\ +之间有一个空格。
Buttle Butkus 2012年

1
@ Tom-分解它,谢谢。请注意-我认为答案中包含的“ SETUID(4)复制用户ID”是错误的-SETUID在Linux / Unix中应用于目录时将被忽略- 参考
Yarin 2012年

1
好了,通过userauserb你的意思是www-dataftpuser?我发现这与www-data原始问题中的任何提及都非常混乱。另外,将所有者设置为的目的/好处是root什么?我们应该设置为ftpuser吗?
gskema '16

60

我不确定要如何配置权限,但这可能会为您提供一个起点。可能有更好的方法。我假设您希望两个用户都可以在/ 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个编辑器,而我只需要防止它们破坏得太厉害,那么我会很轻松的。如果业务需要更复杂的东西,那么我会设置更复杂的东西。


1
可能除了-设置缓存/上传了需要通过服务器到www数据写入到迪尔斯:www数据和775
gacrux

将用户添加到apache组中,而不是依赖于“其他”权限是否也可行?如果您正在做的只是上传文件,而这些文件需要由apache读取,则仅在需要编辑这些文件时,第三组才有用。
2009年

1
您是否有机会将其扩展一点@Zoredache?我不喜欢rwx位,chmod,chown,adduser,usermod的基本用法,但是您对我的八进制权限,umask和所有其他额外的第一位数字感到迷惑。一些示例命令说明您概述的方法,将不胜感激。
汤姆

1
这样,每个用户都可以访问其他所有用户文件!这意味着userA可以读取userB的config.php ...以窃取其mysql凭据,例如
drAlberT 2011年

1
使用acl,您可以同时处理安全性和协作性:)
drAlberT 2011年

39

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

手册页:

讲解


2
就是这样!+1
drAlberT

获胜+1的ACL ...有关更多信息,请参见serverfault.com/a/360120/41823
Yarin 2012年

1
我想知道ACL和基本权限是否存在性能下降。
Buttle Butkus

2
不幸的是,标准安装/发行版中经常缺少ACL。在我管理的每台服务器上编译内核是一件很痛苦的事情,或者更糟的是有时会更改文件系统。另外,备份文件时必须特别小心,尤其是在切换服务器时。ACL很棒,但是它目前的支持太低,因此我建议所有对服务器及其周围环境没有完全控制权的人反对它。但是+1指出ACL真正有意义的地方!
Ninj

好答案+1; 关于将apache进程的读/写权限(www-data例如)更改为整个站点的只读(通过setfacl或chmod-或同时通过这两者)的说明->这显然会阻止所有写操作(插件/模块从浏览器端上传/更新)例如大多数CMS)。我相信许多流行的工具也只能在用户权限级别而非组级别测试写访问权限。您仍然可以进行更新,但是必须手动应用更新以及对写入文件夹的任何自定义权限(日志/临时/上载/等)。如果您的网站使用只读,则安全性非常好。
bshea '16

10

再次提出了这个问题,正如关于meta 所讨论的那样,当前的最佳实践提供了比2009年被问到的更好的方法。该答案试图为安全处理协作Web开发环境提供一些当前的解决方案。


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

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

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

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

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

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.