Apache 和本地用户的用户权限

Apache 和本地用户的用户权限

我正在尝试允许user1www-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。

有一些注意事项需要牢记。

  1. 您的文件系统必须支持它(目前大多数文件系统都支持它,可以通过在大多数文件系统上重新安装具有 ACL 支持的文件系统来启用它)。NFS 之类的东西将无法工作。
  2. 标准 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。

相关内容