如何允许 www-data 创建文件夹而不授予对父文件夹的读取访问权限

如何允许 www-data 创建文件夹而不授予对父文件夹的读取访问权限

我不太确定要问的问题是否正确,所以我会尝试解释我想要做什么。

我有一个内部 Web 应用程序(PHP 语言),我希望能够创建一个文件夹。问题是 Apache 用户 www-data 对我希望在其中创建文件夹的父文件夹没有任何访问权限。

我认为授予 www-data 访问父文件夹的权限是不合适的,所以我想知道是否可以在 www-data 可以运行的地方创建一个脚本,该脚本具有比 www-data 更多的权限。该脚本将简单地执行如下操作(伪代码):

FOLDER_NAME = sanitise(<arg-val-1>)
mkdir /some-path/$FOLDER_NAME

哪里适合创建这个脚本,以及 www-data 如何以 root 身份运行它? (或者,有更好的方法来解决这个问题吗?)

我正在运行 Debian Linux。

答案1

你无法以有用的方式做你所说的事情,但毫无疑问有一些东西足够接近并且可以做你真正想要的事情。

即使你安排创建了目录,用户www-data仍然无法访问/some-path/subdirectory,因为子目录只能通过父目录访问。 (有一些方法可以解决这个问题,但我不建议这样做。您可以拥有一个可以访问两者的进程,然后/some-path更改/some-path/subdirectory/some-path/subdirectory,然后删除权限;生成的进程仍然能够访问其当前目录(但不能通过其绝对路径)您可以将目录绑定安装到另一个位置,但如果您打算这样做,您也可以在其他位置创建该目录。)

将这些目录安排在www-data至少可以访问(x权限位)的目录下。如果问题是该目录必须属于另一个用户和另一个组,请在该目录上设置访问控制列表 ( setfacl -m user:www-data:x /some-path) — 请参阅如何通过 SUDOERS 限制运行特定目录中的命令?了解更多信息。

如果www-data用户无法写入/some-path,您仍然需要提升的权限来创建目录。您至少需要做两件事,也许三件事:

  1. 以具有足够权限的用户身份创建子目录;
  2. 如有必要,更改子目录的所有权;
  3. 如有必要,更改子目录的权限。

如果子目录必须属于该www-data用户,则可以将其创建为可以写入的组/some-path。如有必要,请设置允许some-group写入的ACL /some-pathsetfacl -m group:some-group:rwx /some-path。然后赋予执行命令的www-data权利mkdir须藤。运行visudo并添加以下规则:

 www-data ALL = ( : some-group) /bin/mkdir /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]

这允许www-data运行sudo -g some-group mkdir /some-path/foo-bar在 中创建子目录/some-path

如果子目录必须属于可以写入的另一个用户some-path,请mkdir以该用户身份运行该命令。您也许可以安排目录在创建时具有正确的权限和所有权。对于sudoers文件:

www-data ALL = (some-user : some-group) /bin/mkdir -m 775 /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]

运行以创建属于下的sudo -u some-user -g some-group mkdir -m 775 /some-path/foo-bar组可写目录。some-user:some-group/some-path

答案2

不确定以下方式是否适合您的情况:

假设以下

  • www-data 可写目录:/var/www/数据
  • 原始预期的父目录:/家/父母

做这个:

ln -s /var/www/data /home/parent/data

因此,不要将 www-data 直接写入 /home/parent 下,数据可以访问下家长通过软链接。


也可以通过本地挂载来完成,如下所示

mount -o bind /var/www/data /home/parent/data

或者安装到家长直接地

mount -o bind /var/www/data /home/parent

使用本地挂载方法,目标目录的行为与普通文件系统相同。

相关内容