用户命名空间的 Idmaps¶
Incus 运行安全的容器。这主要是通过使用用户命名空间来实现的,用户命名空间使容器能够以非特权方式运行,从而极大地限制了攻击面。
用户命名空间通过将主机上的 UID 和 GID 集映射到容器中的 UID 和 GID 集来工作。
例如,我们可以定义主机上的 UID 和 GID 从 100000 到 165535 可以由 Incus 使用,并且应该映射到容器中的 UID/GID 0 到 65535。
因此,在容器中以 UID 0 运行的进程实际上将以 UID 100000 运行。
分配应该始终至少为 65536 个 UID 和 GID,以涵盖包括根 (0) 和 nobody (65534) 在内的 POSIX 范围。
内核支持¶
用户命名空间需要内核 >= 3.12,Incus 甚至可以在旧内核上启动,但会拒绝启动容器。
允许的范围¶
在大多数主机上,Incus 将检查 /etc/subuid
和 /etc/subgid
以获取 incus
用户的分配,并在首次启动时将默认配置文件设置为使用该范围中的前 65536 个 UID 和 GID。
如果范围小于 65536(包括完全没有范围),那么 Incus 将无法创建或启动任何容器,直到此问题得到纠正。
如果 /etc/subuid
、/etc/subgid
、newuidmap
(路径查找)和 newgidmap
(路径查找)中的一些但并非全部可以找到,Incus 将在启动任何容器之前失败,直到此问题得到纠正,因为这表明 shadow 设置已损坏。
如果这些文件都找不到,Incus 将假设从基本 UID/GID 1000000 开始的 1000000000 UID/GID 范围。
这是最常见的情况,通常是当不在也托管完全无特权容器的系统(其中容器运行时本身以用户身份运行)上运行时推荐的设置。
主机之间的不同范围¶
源映射是在将容器在主机之间移动时发送的,以便它们可以在接收主机上重新映射。
每个容器不同的 idmaps¶
Incus 支持为每个容器使用不同的 idmaps,以进一步隔离容器彼此之间的隔离。这由两个每个容器配置键控制,security.idmap.isolated
和 security.idmap.size
。
具有 security.idmap.isolated
的容器将拥有一个唯一的 ID 范围,该范围是在其他具有 security.idmap.isolated
设置的容器中计算出来的(如果不可用,设置此键将简单地失败)。
具有 security.idmap.size
设置的容器将将其 ID 范围设置为此大小。没有设置此属性的隔离容器默认使用大小为 65536 的 ID 范围;这允许 POSIX 兼容性和容器内的 nobody
用户。
要选择特定的映射,security.idmap.base
键将允许您覆盖自动检测机制并告诉 Incus 您想用作容器基准的哪个主机 UID/GID。
这些属性需要容器重启才能生效。
自定义 idmaps¶
Incus 还支持自定义 idmap 的某些部分,例如,允许用户将主机的文件系统的一部分绑定挂载到容器中,而无需任何 UID-shifting 文件系统。每个容器的配置键为此是 raw.idmap
,并且看起来像
both 1000 1000
uid 50-60 500-510
gid 100000-110000 10000-20000
第一行配置主机上的 UID 和 GID 1000 映射到容器内的 UID 1000(例如,这可用于将用户的家目录绑定到容器)。
第二行和第三行分别仅将 UID 或 GID 范围映射到容器。每行上的第二个条目是源 ID,即主机上的 ID,第三个条目是容器内的范围。这些范围必须大小相同。
此属性需要重新启动容器才能生效。