给podman挂载0600权限的文件

给podman挂载0600权限的文件

我在将文件安装到 时遇到问题podman。我的文件权限是0600,但容器无法使用。如果我使用该--privileged选项或卷传播选项,z它就可以工作。但我的问题是我应该使用这些选项中的哪一个?或者也许还有另一种方法可以做到这一点......

让我向您描述这个案例以避免 XY 问题。我想certbot使用 DNS Cloudflare 生成证书。我用的是Centos 8,所以必须通过docker/podman来完成。 Cerbot 需要 Cloudflare 的密钥,因此在~/.secrets/clodflare路径中我创建cloudflare.ini文件并希望将其安装到容器中。

答案1

让我尝试分享一些我自己这些天学到的经验。我不是专家。我无法建议您应该做什么,但可以尝试解释当您使用--privileged和运行 podman 时会发生什么:z。也许你已经知道这些了。

我假设您正在podman无根运行,即 ,podman -v而不是sudo podman -v。我还假设~/.secrets/clodflare归您所有,UID 为1000

您的情况(至少)有两个权限问题,即传统的 Unix 权限(0600-rw-------)和 SELinux(container_file_tuser_home_t:fusefs_t等)。

  • UNIX权限

    • 在容器中,文件/文件夹属于root.所以:
    • 如果容器中的进程是由 运行的root,那么在主机上,它是由您运行的。所以它具有rw-该文件夹/文件的权限。我想这就是你的情况。与--privilegednor无关:z

    • 如果容器中的进程由另一个用户(例如 UID )运行1234,则在主机上,它由具有 UID 的用户运行101233(默认情况下,基于 中的设置/etc/subid)。因此,它仅具有---该文件的权限。如果您想将所有权更改为1234容器中的(或101233主机上的),您可以运行,例如podman unshare chown -R 1234:1234 <path>sudo chown -R 101234:101234 <path>。但是,我认为这不适用于您。

    • 如果在主机上,该文件不属于你,那么在容器中,根据 中的设置,它将属于别人/etc/subid

    • 您可以通过谷歌搜索找到有关此主题的更多信息podman namespace

  • SELinux

    • 在启用 SELinux 的主机上,仍然存在 SELinux 分离问题。
    • 通过使用--privileged,您可以禁用 SELinux 分离(以及更多功能)。但它不会重新标记文件/文件夹。每次运行 podman 时,都应该像 一样运行podman -v <host-path>:<container-path> --previleged <image>
    • 通过添加:z,您可以允许 podman 重新标记文件/文件夹。你只需要这样做一次。您可以通过ls -Z或列出文件/文件夹来检查之前和之后的差异ls -Zd。一旦文件或文件夹被正确地重新标记,下次您可以只运行podman -v <host-path>:<container-path> <image>, without :z,nor --privileged
    • 关于这个问题的更多细节,我不能说太多,因为它对我来说太复杂了,无法理解。的手册页podman run、关于--privileged-v的解释-security-opt很有帮助。

相关内容