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

我们有两个常规用户和root。因此,当弄乱/var/www中的文件时,不必一直......

chown -R www-data:www-data


...始终,什么是处理此问题的好方法?

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

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

评论

另请参阅:什么是可用于我的网站的最佳linux权限?

#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,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。在我的情况下,编辑umask底部的/etc/profile行)表示由一个用户创建的文件将可由www-group中的其他用户写入,而无需chmod


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

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

评论


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

– aculich
2012年2月18日在7:46

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

–汤姆
2012年6月4日23:43

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

–瓶Butkus
2012年6月28日下午6:00



为什么我们需要允许他人查看和执行。

–凯文·帕克(Kevin Parker)
2012年11月8日13:45

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

–雅林
2012年12月3日22:00

#2 楼

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


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

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

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

评论


可能的添加-将需要由Web服务器写入的缓存/上传目录设置为www-data:www-data和775。

–加克鲁斯
09年5月11日在12:45

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

–Simurr
09年5月11日在18:49

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

–汤姆
09年9月15日在3:24

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

–drAlberT
2011年5月9日12:02

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

–drAlberT
2011年5月10日下午14:19

#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




setfacl
getfacl

教程

评论


就是这样做 ! +1

–drAlberT
2011年5月9日在16:53



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

–雅林
2012年12月17日,0:14

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

–瓶Butkus
2013年1月9日9:15

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

– Ninj
2015年2月13日在8:48



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

– bshea
16年8月28日在15:28



#4 楼

再次问了这个问题,正如关于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套接字。