我正在尝试允许user1
和www-data
(apache)访问 /home/user1/public_html/ 文件夹中的文件的权限。
我被指示运行以下命令:
sudo chown -R www-data:user1 /home/user1/public_html/
sudo chmod g+s /home/user1/public_html/
现在,www-data 确实有权编辑/删除/添加文件到 /home/user1/public_html/,但 user1 无法编辑任何内容。
我该如何解决这个问题?
谢谢,
答案1
实现此目的的最佳方法是posix ACL。标准 unix 文件权限确实不能解决问题。您可以使用一些临时解决方案来完成此操作,但它实际上只不过是一个临时解决方案,基本上它不是一个直接的解决方案。
使用 ACL 将简洁地解决此问题。为此,您可以使用以下命令:
setfacl -R -m www-user:rwx /home/user1/public_html
setfacl -R -d -m www-user:rwx /home/user1/public_html
setfacl -R -m user1:rwx /home/user1/public_html
setfacl -R -d -m user1:rwx /home/user1/public_html
这-d标志会导致新文件继承您在目录中设置的 ACL。
有一些注意事项需要牢记。
- 您的文件系统必须支持它(目前大多数文件系统都支持它,可以通过在大多数文件系统上重新安装具有 ACL 支持的文件系统来启用它)。NFS 之类的东西将无法工作。
- 标准 Unix 组 ACL 变成一个掩码。例如,如果文件显示克+克该文件可以通过上述命令执行。如果其广西该文件不可执行,无论是否设置权限读写在 ACL 中。这可以确保你避免必须标记所有目录的情况读写在 acl 和所有文件中rw-。
这合理地修复了问题并允许各种场景组合:
- 它强制执行最小权限,因为您不需要开始修改用户的组成员身份。
- user1 可以创建一个文件,该文件稍后可以由 www1-user 进行修改(因此 user1 可以通过 SFTP 上传内容,该内容稍后可以由 apache 中的 CMS 删除或修改),反之亦然。
- Apache 保留在系统帐户中,从而避免必须使用 SetUID 解决方法来更改 Apache 主题(用户)。
- 修改仅适用于特定的目录结构,不会无意中允许 www-user 或 user1 访问您不希望他们访问的文件系统树的其他部分。
- 改变或撤销权限是一件微不足道的事情。
这是我解决此类问题的首选方法。这是一个简单、无干扰且微不足道的改变。
答案2
Apache 不需要到处写入,为此您可以指定 tmp、upload 等文件夹。因此,您可以将 public_dir 的权限设置为 apache 用户可以读取和执行:
sudo chown user1:www-data /home/user1/public_html
sudo chmod 0750 /home/user1/public_html
dir下的所有其他文件public_html
都可以在 user1 权限下,并且只能由“其他人”(此处为 apache)读取。从安全角度来看,这也是更好的选择。正如我所写,只有必要的文件/文件夹才应由 apache 用户写入。
答案3
您很可能在问题中的命令中将 user1 和 www-data 弄错了。
你不想要默认授予 apache 写权限 - 并使 apache 用户成为所有者将要执行的操作。
尝试这个:
sudo chown -R user1:www-data /home/user1/public_html/
sudo find /home/user1/public_html/ -type d -exec chmod 0755 {} \; -or -type f -exec chmod 0644 {} \;
这将使您成为所有者,并使用与 apache 相同的组,然后将文件夹的权限重置为 755,文件的权限重置为 644。755 和 644 个权限是适用于 apache 的权限 - 仅授予 apache 对绝对需要写入的文件夹的写入权限。
答案4
如果你这样做了:
sudo chown -R www-data:user1 /home/user1/public_html/
您将所有权授予用户 www-data 和组 user1。
和:
sudo chmod g+s /home/user1/public_html/
您在此文件夹上执行时设置了组 ID,我以前从未见过这样做,也不知道为什么要这样做……它通常用于二进制文件。您这样做把事情搞砸了。除非您找到这样做的正当理由,否则请反转它:
sudo chmod g-s /home/user1/public_html/
并为user1(属于组user1)和www-data设置读/写权限。
sudo chmod -R 770 /home/user1/public_html
现在,每个文件都可供 www-data 和 user1 组 (我假设只有 user1 是其中的一部分,请仔细检查) 中的所有用户写入和读取。
这很不妥,因为您可能希望某些文件仅由用户写入。作为开发人员,在服务器上“上传”文件而不是直接编辑文件并不罕见,这通过将其外包给安全程序(如 sftp/scp)解决了正确的管理问题。您甚至可以尝试使用 SCM。