跳转至

Podman

导言

Victima 需要使用Podman。先简单学习一下

简介

Podman是一个开源的、Linux原生的工具,旨在开发、管理和运行开放容器倡议(OCI)标准下的容器和豆荚。Podman是由Red Hat开发的用户友好型容器协调器,是RedHat 8和CentOS 8的默认容器引擎。

Podman与Docker差异

Podman是一个无守护进程的容器引擎, and can be run as a non-root user2. ,用于在Linux系统上开发、管理和运行OCI(Open Container Initiative)容器和容器镜像。Podman提供了一个与Docker兼容的命令行工具,可以简单地为docker命令取别名为podman即可使用,所以说如果你会Docker的话可以轻松上手Podman。1

前提

类似 docker 也需要设置/etc/subgid & subuid

/etc/subuid的具体解释

/etc/subuid 文件在 Linux 系统中非常重要,特别是在使用容器技术(如 Docker 和 Podman)时。该文件用于管理“子用户 ID(subordinate user IDs)”,这些子用户 ID 允许非特权用户在没有提升至超级用户权限的情况下安全地使用容器技术。

  1. 功能和目的

在 Linux 和其他类 Unix 操作系统中,每个用户都有一个用户 ID(UID)。为了安全运行容器,需要一种机制允许普通用户在容器内以隔离的环境运行程序,同时不影响主系统的安全性。/etc/subuid 文件为此提供了一种方式,通过分配给每个用户一定范围的 UID,这些 UID 只在容器内部有效,并且与主系统的其他用户和资源隔离。

  1. 如何工作

  2. UID 映射:当普通用户启动容器时,容器内部的用户 ID 将映射到 /etc/subuid 中指定的一个子 UID 范围。这样,容器内部即使是“root”用户,其实也只是一个受限的、普通的子用户,其权限被限制在主机上为其分配的 UID 范围内。

  3. 安全隔离:这种方法提高了安全性,因为即使容器内部的程序被攻破,攻击者也只能访问和影响到那个受限的 UID 范围内的资源,而不是整个系统。

  4. 文件格式

/etc/subuid 文件的每行都包含三个部分,格式如下:

用户名:起始UID:UID数量

例如,一行可能如下:

johndoe:100000:65536

这意味着用户 johndoe 被分配了从 100000 开始的 65536 个连续的 UID 用于其容器实例。

  1. 使用场景

在使用 Docker 和 Podman 这类容器技术时,通常需要配置 /etc/subuid/etc/subgid(对应的子组 ID 文件),确保非 root 用户可以安全地运行容器。这也是为什么当你遇到与容器相关的权限问题时,常常需要检查这两个文件是否正确配置。

总之,/etc/subuid 是 Linux 容器技术中实现用户级别隔离和安全的关键组件之一。

宿主机与容器内id的映射

For our examples, I will use the user myuser with a UID of 1000, and a UID map setup in /etc/subuid that looks like this:

myuser:100000:65536

The result looks like this:

$ podman unshare cat /proc/self/uid_map  
      0              1000                 1  
      1              100000             65536

podman unshare cat /proc/self/uid_map 命令显示的输出涉及到用户 ID(UID)的映射,这是在运行 Podman 容器时非常重要的安全功能。这里的 UID 映射确保了在容器内部运行的进程与宿主机上的进程隔离,增加了安全性。现在解释这个输出的意义:

  1. 输出解析

输出显示了两行,每行包含三个数字,这些数字分别代表:

  1. 容器内部的 UID:这是容器内部看到的用户 ID。
  2. 宿主机上的 UID:这是对应于容器内 UID 的宿主机上的用户 ID。
  3. 范围长度:这表示从容器内部 UID 开始的 UID 范围映射到宿主机 UID 的数量。

具体到这个例子:

  • 第一行 0 1000 1 的意思是:
  • 容器内的 UID 0(通常是 root 用户)映射到 宿主机的 UID 1000(即 myuser 的 UID)。
  • 范围长度为 1,意味着只有一个 UID 被映射,就是 0 到 1000。

  • 第二行 1 100000 65536 的意思是:

  • 容器内的 UID 1 开始的 65536 个 UID(从 1 到 65536)映射到宿主机的 UID 100000 开始的 65536 个 UID(从 100000 到 165536)。
  • 这使得容器内的任何 UID(从 1 到 65536)都对应到宿主机上一个安全的、非原始用户范围内的 UID。

  • 安全性和实用性

这种映射机制的主要优点是提供了一种安全的方式,让普通用户能够在没有 root 权限的情况下运行容器。容器内的 root 用户(UID 0)并没有宿主机上的 root 权限,而只是映射到一个普通用户的权限。这极大地限制了如果容器被攻破,攻击者能在宿主机上造成的潜在破坏。

此外,通过将容器内的其他 UID 映射到宿主机的一个非特权 UID 区间,增加了操作的灵活性,允许容器内运行多用户应用而不会影响到宿主机的安全性或用户数据。

这种 UID 映射技术是 Linux 容器技术中实现有效隔离和安全的关键组成部分。

常见的问题

rootless-Podman 不支持 ZFS 的存储结构

  • 现象: Podman非root用户使用会触发 Error setting up pivot dir: mkdir permission denied3
  • 原因: ZFS远程挂载的空间由于没有足够的信息,不会允许uid被重新映射的非root用户,进行一系列修改操作。4
  • 解决: You could configure the graphroot flag in the ~/.config/containers/storage.conf file to have storage point at a directory that is not on the NFS share. 4

参考文献

评论