Skip to content

本文为 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 命令示例:

bash
$ 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.conf

SPIRE 插件配置也可能依赖磁盘来保存各种状态和配置。 示例配置并未覆盖每一种可能的插件目录依赖。 关于可用于插件数据的原生支持目录,请参阅发布镜像中可用的目录。

(进阶)方式 2)在 SPIRE 配置文件中使用自定义路径和 / 或指定的非 root 用户 ​

如果你想让 SPIRE 使用示例配置文件之外的路径,可以根据自己的需求考虑以下一种或多种做法:

  1. 在期望的路径上为容器提供一个卷挂载 / 绑定挂载(volume/bind mount)
  2. 基于 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