Libvirt-lxc 用户命名空间支持¶
https://blueprints.launchpad.net/nova/+spec/libvirt-lxc-user-namespaces
用户命名空间提供了一种机制,使得在容器中运行的进程看起来像是在以 root 用户身份运行,但实际上是在宿主机上以不同的用户身份运行。此功能的目标是允许部署者启用和配置容器与宿主机之间映射哪些用户和组。
问题描述¶
允许用户进程在容器宿主机上以 root 用户身份运行存在安全风险。为了缓解此风险,将这些进程作为非 root 用户在容器中运行是一个好主意。但问题在于,有些进程可能希望以 root 用户身份运行(或者至少看起来像是在容器内以 root 用户身份运行)。例如,将 init 系统作为容器的 init 进程运行。
此外,要在用户命名空间环境中启动镜像,其文件系统的内容必须由宿主机上的目标 root 用户拥有。
提议的变更¶
用户命名空间允许容器内的进程看起来像是在以 root 用户身份运行,但实际上是在运行另一个用户。Libvirt 通过 idmaps 暴露此功能。此更改将引入一组在实例的 domain xml 中用于指示哪些用户和组 ID 应该在容器和宿主机之间映射的元素。
为了解决目标 root 用户拥有文件系统的问题,Nova 将在启动时更改镜像的所有权。
此功能的配置默认情况下将被禁用。启用和配置它将由部署者决定。
libvirt 组中的新配置选项
uid_maps: 逗号分隔的映射列表,最大值为 5
gid_maps: 逗号分隔的映射列表,最大值为 5
映射格式为“guest-id:host-id:count,guest-id:host-id:count,…”
备选方案¶
替代镜像 chown 点,具有性能影响
由镜像创建者 chown: 无性能影响
被拒绝,因为最终用户不应该担心这个问题
由 Glance 在导入时 chown: 镜像变活跃需要更长时间
不理想,因为它引入了对 glance 中正确配置导入的依赖。
由 Nova 在缓存时 chown: 所有宿主机上的初始启动将需要更长时间
最初被拒绝,因为镜像缓存周围有太多的更改。一旦镜像缓存活动放缓,这可能是理想的选择。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
此更改将显著提高 Nova 中容器的安全性。在此更改之前,由 Nova 构建的容器中运行的进程将以宿主机的 root 用户身份运行。在此更改之后,部署者可以限制进程将以哪个用户身份运行。
应该注意的是,此更改并非旨在提供客体之间的隔离,而是提供宿主机与客体之间的隔离。超出此更改范围,但合理地假设,如果创建了一种机制来确保所有容器都使用不同的 UID/GID,则可以使用用户命名空间来提供进一步的客体-客体分离。此更改提供了一个可以在未来扩展用于该用例的基础。
通知影响¶
无
其他最终用户影响¶
需要有意识地创建镜像才能在用户命名空间环境中运行。镜像文件系统的内容需要由目标 uid/gid 拥有。在此功能的迭代中,Nova 将在启动时更改镜像的所有权。
性能影响¶
由于 Nova 在启动时更改镜像的文件系统所有权,因此启动性能会受到影响,具体取决于镜像文件系统中的文件数量。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
andrew-melton
- 其他贡献者
rconradharris thomas-maddox
工作项¶
修改 libvirt config.py 以包含新的 idmap xml
创建 util 函数来 chown rootfs
实际设置新的实例
依赖项¶
Linux 3.8+ 内核
早期 3.8 内核可能存在错误。如果用户需要最低内核,用户应使用尽可能最新的 3.8 内核。
Libvirt 1.1.1
测试¶
确保 nova 配置选项正确映射到 libvirt domain 对象可以通过单元测试来处理。在此环境中包含 libvirt-lxc 之前,无法进行功能测试。根据 chowning 的实现方式,功能测试可能会有点棘手。
文档影响¶
新的配置选项。