Answers:
尝试扩展@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
。
注意:您需要注销/登录才能使对组的更改生效!
find
为此使用命令。如果您有很多文件/目录并且使用的是GNU find,我会给您一个性能小提示,它使用+
而不是来\;
使该命令可以在多个文件上运行,因为“在尽可能多的文件上运行命令更快一次,而不是每个文件一次。这样做可以节省每次启动命令的时间。” 另外,由于不需要反斜杠,因此更易于键入。
usera
和userb
你的意思是www-data
和ftpuser
?我发现这与www-data
原始问题中的任何提及都非常混乱。另外,将所有者设置为的目的/好处是root
什么?我们应该设置为ftpuser
吗?
我不确定要如何配置权限,但这可能会为您提供一个起点。可能有更好的方法。我假设您希望两个用户都可以在/ var / www /下进行任何更改
这意味着您的任何一个用户创建的任何新文件都应为username:www-pub 0664,而创建的任何目录均应为username:www-pub2775。Apache将通过“其他用户”组件对所有内容进行读取访问。目录中的SETGID位将强制所有创建的文件归拥有该文件夹的组所有。需要调整umask以确保设置了写位,以便组中的任何人都可以编辑文件。
至于我的权限有多高。它完全取决于站点/服务器。如果只有1-2个编辑器,而我只需要防止它们破坏得太厉害,那么我会很轻松的。如果业务需要更复杂的东西,那么我会设置更复杂的东西。
我认为您可能会发现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
手册页:
www-data
例如)更改为整个站点的只读(通过setfacl或chmod-或同时通过这两者)的说明->这显然会阻止所有写操作(插件/模块从浏览器端上传/更新)例如大多数CMS)。我相信许多流行的工具也只能在用户权限级别而非组级别测试写访问权限。您仍然可以进行更新,但是必须手动应用更新以及对写入文件夹的任何自定义权限(日志/临时/上载/等)。如果您的网站使用只读,则安全性非常好。
再次提出了这个问题,正如关于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套接字。