有人有处理文件的好方法吗/var/www
?我们正在运行基于名称的虚拟主机,Apache 2 用户是www-数据。
我们有两个普通用户和 root。因此,在处理 中的文件时/var/www
,不必...
chown -R www-data:www-data
...一直以来,有什么好的方法可以解决这个问题?
补充问题:那么您对权限的要求有多严格呢?
这在协作开发环境中始终是一个问题。
答案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 表示所有者(root),7=rwx 表示组(www-pub),5=rx 表示全世界(包括 apache www-data 用户)设置组 ID (设置组标识) 位 (2) 导致组 (www-pub) 被复制到该文件夹中创建的所有新文件/文件夹。其他选项包括 SETUID (4) 以复制用户 ID,以及 STICKY (1),我认为它只允许所有者删除文件。
有一个
-R
递归选项,但它不会区分文件和文件夹,所以你必须使用查找,像这样: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
。
注意:您需要注销/登录才能使您的群组更改生效!
答案2
我不太确定你想如何配置权限,但这可能给你一个起点。可能有更好的方法。我假设你希望两个用户都能更改 /var/www/ 下的任何内容
- 创建一个新组(www-pub)并将用户添加到该组。
- 将 /var/www 下的所有内容的所有权更改为 root:www-pub。
- 将所有文件夹的权限改为2775
- 将所有文件改为0664。
- 将用户的 umask 更改为 0002
这意味着您的任一用户创建的任何新文件都应为用户名:www-pub 0664,而创建的任何目录都应为用户名:www-pub 2775。Apache 将通过“其他用户”组件获得对所有内容的读取权限。目录上的 SETGID 位将强制所有正在创建的文件归拥有该文件夹的组所有。需要调整 umask 以确保设置写入位,以便组中的任何人都可以编辑文件。
至于我对权限的严格程度。这完全取决于网站/服务器。如果只有 1-2 个编辑,我只需要防止他们破坏太多东西,那么我会放轻松。如果业务需要更复杂的东西,那么我会设置更复杂的东西。
答案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
手册页:
答案4
这个问题又问, 并作为讨论在 meta 上,当前的最佳实践提供了比 2009 年提出这个问题时更好的方法。这个答案试图给出一些当前的解决方案安全地处理协作 Web 开发环境。
对于安全的 Web 服务器和协作开发来说,不仅仅只有文件权限:
每个站点都有单独的用户即不为所有使用 的网站提供服务
www-data
。这很重要,因为如今 Apache 很少单独为静止的内容文件,但正在运行动态的网站。这个答案集中在 PHP 上,因为它是最常见的服务器站点语言,但同样的原则也适用于其他语言。如果某个站点存在安全问题,则该问题会蔓延至以同一用户身份运行的所有站点。攻击者可以看到用户看到的所有内容,包括数据库登录信息,并修改用户有写权限的每个站点。
使用SSH 文件传输协议(SFTP)。虽然出于安全考虑应该放弃使用 FTP(因为它以纯文本形式发送密码和内容),但它的安全替代品 SFTP 也具有一个功能,它是协作 Web 开发的完美解决方案。
隔离网站并为每个网站分配一个用户后,您需要向网站开发人员授予访问权限,这就是问题所在。与其向他们提供这些网站用户的密码(或使用他们的个人用户帐户访问网站文件,如最初建议的那样),不如使用SSH 密钥用于登录。
每个开发人员都可以生成密钥对并保密私钥。然后,将公钥添加到
~/.ssh/authorized_keys
开发人员正在处理的每个网站用户帐户的文件中。这对于管理密码和登录名有很多好处:每个开发人员都可以访问任意数量的网站,而不必记住或存储与每个网站用户安排相关的所有密码。
每次有人离开公司时无需更改和共享密码。
您可以使用非常强的密码或完全禁用基于密码的登录。
使用 PHP-FPM。这是当前以用户身份运行 PHP 的方法。创建一个新的水池针对每个用户,即每个站点一个池。这对于安全性和性能来说都是最好的,因为您还可以指定单个站点可以消耗多少资源。
例如参见 NeverEndingSecurity 的在 Linux 上使用单独的用户/uid 和组运行 php-fpm有类似 HowtoForge 的教程在 Ubuntu 16.04 上将 PHP-FPM 与 Apache 结合使用不使用 PHP-FPM 通过用户分离来提高安全性,指导在整个服务器上使用单个 FPM 套接字。