有没有人有一个很好的解决方案来处理文件/var/www
?我们正在运行基于名称的虚拟主机,Apache 2 用户是www-data。
我们有两个普通用户和 root。因此,当弄乱 中的文件时/var/www
,而不必...
chown -R www-data:www-data
...一直以来,有什么好的方法来处理这个?
补充问题:那么您在权限上的核心程度如何?
这一直是协作开发环境中的一个问题。
有没有人有一个很好的解决方案来处理文件/var/www
?我们正在运行基于名称的虚拟主机,Apache 2 用户是www-data。
我们有两个普通用户和 root。因此,当弄乱 中的文件时/var/www
,而不必...
chown -R www-data:www-data
...一直以来,有什么好的方法来处理这个?
补充问题:那么您在权限上的核心程度如何?
这一直是协作开发环境中的一个问题。
尝试扩展@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=set group id, 7=rwx for owner (root), 7=rwx for group (www-pub), 5=rx for world (包括apache www-data user)设置组 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
。注意:您需要注销/登录才能使您的群组更改生效!
我不完全确定您要如何配置权限,但这可能会给您一个起点。可能有更好的方法。我假设您希望两个用户都能够更改 /var/www/ 下的任何内容
这意味着您的任何一个用户创建的任何新文件都应该是用户名:www-pub 0664,并且创建的任何目录都是用户名:www-pub 2775。Apache 将通过“其他用户”组件获得对所有内容的读取权限。目录上的 SETGID 位将强制所有正在创建的文件归拥有该文件夹的组所有。需要调整 umask 以确保设置了写入位,以便组中的任何人都能够编辑文件。
至于我如何获得权限。它完全取决于站点/服务器。如果只有 1-2 个编辑器,我只需要防止他们把事情搞砸,那么我会轻松一点。如果业务需要更复杂的东西,那么我会设置更复杂的东西。
我认为您可能会发现 POSIX ACL(访问控制列表)会有所帮助。与 user:group:other 模型相比,它们允许更细粒度的权限模型。我发现它们更容易记住,因为我可以更明确,也可以为文件系统的分支设置“默认”行为。
例如,您可以明确指定每个用户的权限:
或者您可以基于某个共享组来执行此操作:
也许你想让你的 Apache 用户保持只读状态
手册页:
教程
这个问题再次被问到,正如在 meta 上所讨论的那样,当前的最佳实践提供了比 2009 年提出的更好的方法。这个答案试图提供一些当前安全处理协作 Web 开发环境的解决方案。
对于安全的 Web 服务器和协作开发,不仅仅是文件权限:
每个站点都有单独的用户,即不使用
www-data
. 这很重要,因为现在 Apache 很少只提供静态内容文件,而是运行动态网站。这个答案集中在 PHP 上,因为它是最常见的服务器站点语言,但同样的原则也适用于其他语言。如果您在单个站点上遇到安全问题,它可能会蔓延到以同一用户身份运行的每个站点。攻击者可以看到用户看到的所有内容,包括数据库登录信息,并修改用户拥有写入权限的每个站点。
使用SSH 文件传输协议(SFTP)。虽然出于安全考虑应该放弃使用 FTP(因为它以纯文本形式发送密码和内容),但它的安全替代品 SFTP 还具有一个功能,它是协作 Web 开发的完美解决方案。
一旦您隔离了站点和每个站点一个用户,您需要向您的 Web 开发人员授予访问权限,这个问题是关于什么的。您可以使用SSH 密钥登录,而不是像最初建议的那样为这些站点用户提供密码或使用他们的个人用户帐户访问站点文件。
每个开发人员都可以生成密钥对并将私钥保密。然后,将公钥添加到
~/.ssh/authorized_keys
开发人员正在处理的每个网站用户帐户的文件中。这对于管理密码和登录名有很多好处:每个开发人员都可以访问任意数量的网站,而无需记住或存储与每个站点的用户安排有关的所有密码。
每次有人离开公司时都无需更改和共享密码。
您可以使用非常强大的密码或完全禁用基于密码的登录。
使用 PHP-FPM。这是当前以用户身份运行 PHP 的方法。为每个用户创建一个新池,即每个站点一个池。这对于安全性和性能来说都是最好的,因为您还可以指定单个站点可以消耗多少资源。
参见例如 NeverEndingSecurity 的Run php-fpm with separate user/uid and group on linux。有一些教程,例如 HowtoForge 的Using PHP-FPM with Apache on Ubuntu 16.04,它不使用 PHP-FPM 通过用户分离来提高安全性,指导在服务器上使用单个 FPM 套接字。