本文为 SPIRE 官方文档 docker_images.md 的中文译本,以英文原文为准。 🔗 穿越源码分析:三节点部署
以非 root 用户运行 Docker 镜像
背景
SPIRE 的发布镜像从 scratch 构建,设计上只包含运行 SPIRE 二进制文件所必需的软件。 使用这种从 scratch 精简而来的镜像有一个后果:它们既不包含 shell,也不包含完整的 Linux 文件系统。
一条通用的安全最佳实践是:以指定的非 root 用户运行容器,以避免赋予容器不必要的权限。 默认情况下,Docker 会以 root 用户启动容器。 scratch 基础镜像只赋予 root 用户在文件系统根目录下创建目录的权限。
SPIRE Server 与 Agent 都会在磁盘上管理一个数据目录(data directory)。 它们在启动时会尝试创建这个数据目录(如果它尚不存在)。 在使用发布镜像时,如果容器以非 root 用户运行,且所配置数据目录的顶层组件不存在,这一操作可能会失败。 例如,如果数据目录位于一个顶层路径 /myspire 之下,而该路径在已发布的发布镜像中并不存在、也没有通过任何卷挂载(volume mount)提供,那么 SPIRE 会尝试创建这个目录并失败,因为只有 root 才有权限在 / 下创建文件和目录。 这个错误会导致 SPIRE 容器启动失败。
以非 root 用户运行 SPIRE 镜像的推荐方式
(简单)方式 1)使用示例配置文件中提供的默认路径
conf/server/server_container.conf 与 conf/agent/agent_container.conf 分别引用了 SPIRE Server 与 Agent 在运行时读取、写入和创建的各个常用目录的默认路径。 这些配置文件中引用的所有目录,都已在发布镜像中提供,并为 uid 为 1000、gid 为 1000 的用户设置了正确权限。 要基于这些配置文件运行 SPIRE 容器,请以 uid 1000 和 gid 1000 运行容器。 注意,你还需要确保挂载进容器的 SPIRE Server 配置文件对 uid 1000 具有正确的权限。 以非 root 用户配置运行 SPIRE Server 的 docker run 命令示例:
$ docker run \
--user 1000:1000 \
-p 8081:8081 \
-v /path/to/server/config:/etc/spire/server \
ghcr.io/spiffe/spire-server:1.6.1 \
-config /etc/spire/server/server.confSPIRE 插件配置也可能依赖磁盘来保存各种状态和配置。 示例配置并未覆盖每一种可能的插件目录依赖。 关于可用于插件数据的原生支持目录,请参阅发布镜像中可用的目录。
(进阶)方式 2)在 SPIRE 配置文件中使用自定义路径和 / 或指定的非 root 用户
如果你想让 SPIRE 使用示例配置文件之外的路径,可以根据自己的需求考虑以下一种或多种做法:
- 在期望的路径上为容器提供一个卷挂载 / 绑定挂载(volume/bind mount)
- 基于 SPIRE 发布镜像,构建你自己的、带有所需定制的自定义容器镜像。
如果你想以非 uid 1000 的非 root 用户运行 SPIRE,则需要构建你自己的自定义容器镜像,为你的专用用户正确设置权限。
Kubernetes 环境
在 Kubernetes 中,SPIRE Agent 通常以 DaemonSet 形式部署,以便每台主机运行一个工作负载 API 服务实例,并且需要把工作负载 API 套接字注入到每个 pod 中。 SPIFFE CSI Driver 可以用来避免在工作负载容器中使用 hostPath 卷,但在 SPIRE Agent 容器中仍然需要使用 hostPath 卷。 正因如此,SPIRE Agent 容器镜像默认构建为以 root 运行。
发布镜像中可用的目录
为了解决前面提到的基于 scratch 的镜像的局限,SPIRE 发布镜像预置了一些常用目录,并为 uid 为 1000 的用户和 gid 为 1000 的组设置了正确权限。
通用目录
/etc/spire/etc/ssl/certs/run/spire/var/lib/spire
SPIRE Server 目录
这些目录均归 1000:1000 所有。
/etc/spire/server/run/spire/server/private/var/lib/spire/server
SPIRE Agent 目录
这些目录均归 1000:1000 所有。
/etc/spire/agent/run/spire/agent/public/var/lib/spire/agent