无需 root 权限即可从主机访问 Linux 容器上的文件

无需 root 权限即可从主机访问 Linux 容器上的文件

我有一个来自 systemd-nspawn 的容器。容器的文件夹/var/lib/machines/our-runner归 拥有vu-our-runner-0:vg-our-runner-0。我试图从主机 apache2 实例提供其中的文件,但是我无法执行usermod -aG vg-our-runner-0 www-data,因为它说vg-our-runner-0不存在,尽管ls -ld另有说明。我如何才能让 apache 访问它,而无需以 root 身份运行它(因为 root 可以访问容器内的文件夹)?主机是 Debian,容器是 Arch。

答案1

它说 vg-our-runner-0 不存在,尽管 ls -ld 表示不存在

嗯,它们不是一回事。确实,该组并不“存在于” usermod 所在的 /etc/group 中 - 它是 systemd-machined 定义的虚拟组。它是当 ls 调用 getgrnam() 或 getgrid() 函数时,该组“存在” - 因为它们从更多的不仅仅是 /etc/group。

/etc/passwd 和 /etc/group 文件不仅是 Linux 上密码和组信息的来源。当某个程序(例如)ls -l尝试查找组名或 GID 时,多个nsswitch 模块可以提供这些信息。(它们都列在 /etc/nsswitch.conf 中,而“libnss_files”模块实际上是读取 /etc/group 的。)

特别是,ls -l还会询问由 systemd 安装的“libnss_mymachines”模块,并提供信息飞行中关于当前正在运行的容器。这也是为什么当容器停止时,组会突然停止被识别的原因。(这也是为什么每当 systemd-machined 空闲退出时,所有 vu-/vg- 名称都会停止被识别的原因……)

幸运的是,nsswitch 对于群组有一个特殊情况,它支持合并来自多个模块的成员结果;如果你手动将该组添加到 /etc/group,确保保留其 GID,然后您将能够向其中添加成员。

因此,您可以使用(例如,在本例中为 1164378112)查找 GID ls -ldn,并在 /etc/group 中添加一个新行,如下所示:

echo "vg-our-runner-0:x:1164378112:www-data" >> /etc/group

id www-data现在,或等工具groups www-data(通过 nsswitch 收集组成员身份)将报告新的 GID。对于内核来说,组的定义位置并不重要 - GID 就是 GID。

相关内容