本文为 SPIRE 官方文档 SPIRE101.md 的中文译本,以英文原文为准。 🔗 穿越源码分析:整体架构
SPIRE
概述
本演练将带你完成搭建一个可运行的 SPIRE Server 与 SPIRE Agent 示例所需的各个步骤。与工作负载 API(Workload API)的交互将通过一个命令行工具来模拟。

前置条件
Git 设置
克隆 SPIRE 的 GitHub 仓库。
$ git clone https://github.com/spiffe/spireDocker 设置
如果你尚未安装 Docker,请按照这份安装说明进行安装。
术语
| 术语 | 说明 |
|---|---|
| spire-server | SPIRE Server 可执行文件 |
| spire-agent | SPIRE Agent 可执行文件 |
| socketPath | 工作负载连接工作负载 API 所用的 Unix 域套接字(Unix Domain Socket)文件路径 |
| Join Token | SPIRE Server 生成的、用于对 SPIRE Agent 进行认证的一次性随机数(nonce) |
| selector | 节点或工作负载的一种原生属性 |
演练
构建开发用 Docker 镜像。
shell$ make dev-image在开发 Docker 容器中启动一个 shell。
shell$ make dev-shell创建一个 uid 为 1001 的用户。该 uid 将被注册为该工作负载 SPIFFE ID 的一个选择器(selector)。在基于内核的认证(attestation)过程中,会对工作负载进程进行核查,以获取其注册的 uid。
shell(in dev shell) # useradd -u 1001 workload运行 build 目标来构建 SPIRE。build 目标会构建所有 SPIRE 二进制文件。这需要配置
git,让它知道这个临时 docker 容器是安全的。shell(in dev shell) # git config --global --add safe.directory /spire (in dev shell) # make build试着为
entry子命令运行help。spire-server 与 spire-agent 可执行文件都带有--help选项,可给出各自 CLI 选项的详细信息。shell(in dev shell) # ./bin/spire-server entry --help查看 SPIRE Server 配置文件。
shell$(in dev shell) # cat conf/server/server.conf默认的 SPIRE Server 配置如下所示。每个 SPIRE Server 配置项的详细说明见 Server 文档。
hclserver { bind_address = "127.0.0.1" bind_port = "8081" trust_domain = "example.org" data_dir = "./.data" log_level = "DEBUG" } plugins { DataStore "sql" { plugin_data { database_type = "sqlite3" connection_string = "./.data/datastore.sqlite3" } } NodeAttestor "join_token" { plugin_data { } } KeyManager "memory" { plugin_data = {} } UpstreamAuthority "disk" { plugin_data { key_file_path = "./conf/server/dummy_upstream_ca.key" cert_file_path = "./conf/server/dummy_upstream_ca.crt" } } }通过运行以下命令,将 SPIRE Server 作为后台进程启动。
shell(in dev shell) # ./bin/spire-server run &通过 spire-server token generate 子命令生成一个一次性的 Join Token。使用 -spiffeID 选项将该 Join Token 关联到 spiffe://example.org/host 这个 SPIFFE ID。把生成的 join token 保存到你的剪贴板中。
shell(in dev shell) # ./bin/spire-server token generate -spiffeID spiffe://example.org/host该 Join Token 将作为一种节点认证(node attestation)方式使用,关联的 SPIFFE ID 将被分配给该节点。
Join Token 的默认 ttl 为 600 秒。我们可以通过 -ttl 选项覆盖该默认值。
查看 SPIRE Agent 的配置文件。
shell(in dev shell) # cat conf/agent/agent.conf默认的 SPIRE Agent 配置如下所示。每个 SPIRE Agent 配置项的详细说明见 Agent 文档。
hclagent { data_dir = "./.data" log_level = "DEBUG" server_address = "127.0.0.1" server_port = "8081" socket_path ="/tmp/spire-agent/public/api.sock" trust_bundle_path = "./conf/agent/dummy_root_ca.crt" trust_domain = "example.org" } plugins { NodeAttestor "join_token" { plugin_data { } } KeyManager "disk" { plugin_data { directory = "./.data" } } WorkloadAttestor "unix" { plugin_data { } } }将 SPIRE Agent 作为后台进程启动。将下面命令中的
<generated-join-token>替换为第 8 步保存的值。shell(in dev shell) # ./bin/spire-agent run -joinToken <generated-join-token> &下一步是为一个 SPIFFE ID 注册一组选择器。本例中我们将使用 unix 内核选择器,并把它映射到目标 SPIFFE ID。
shell(in dev shell) # ./bin/spire-server entry create \ -parentID spiffe://example.org/host \ -spiffeID spiffe://example.org/workload \ -selector unix:uid:1001至此,目标工作负载已在 SPIRE Server 中完成注册。现在我们可以用一个命令行程序调用工作负载 API,向 SPIRE Agent 请求该工作负载的 SVID。
通过在 agent 中运行
api子命令,模拟工作负载 API 交互并获取该工作负载的 SVID 证书包(bundle)。以第 3 步创建的、uid 为 1001 的用户 workload 身份运行该命令。shell(in dev shell) # su -c "./bin/spire-agent api fetch x509 " workload检查输出。你也可以选择用
-write将 SVID 与密钥写入磁盘,以便详细查看。shell(in dev shell) # su -c "./bin/spire-agent api fetch x509 -write /tmp" workload (in dev shell) # openssl x509 -in /tmp/svid.0.pem -text -noout