Skip to content

本文为 SPIRE 官方文档 SPIRE101.md 的中文译本,以英文原文为准。 🔗 穿越源码分析:整体架构

SPIRE

概述

本演练将带你完成搭建一个可运行的 SPIRE Server 与 SPIRE Agent 示例所需的各个步骤。与工作负载 API(Workload API)的交互将通过一个命令行工具来模拟。

SPIRE101

前置条件

Git 设置

克隆 SPIRE 的 GitHub 仓库。

shell
$ git clone https://github.com/spiffe/spire

Docker 设置

如果你尚未安装 Docker,请按照这份安装说明进行安装。

术语

术语说明
spire-serverSPIRE Server 可执行文件
spire-agentSPIRE Agent 可执行文件
socketPath工作负载连接工作负载 API 所用的 Unix 域套接字(Unix Domain Socket)文件路径
Join TokenSPIRE Server 生成的、用于对 SPIRE Agent 进行认证的一次性随机数(nonce)
selector节点或工作负载的一种原生属性

演练

  1. 构建开发用 Docker 镜像。

    shell
    $ make dev-image
  2. 在开发 Docker 容器中启动一个 shell。

    shell
    $ make dev-shell
  3. 创建一个 uid 为 1001 的用户。该 uid 将被注册为该工作负载 SPIFFE ID 的一个选择器(selector)。在基于内核的认证(attestation)过程中,会对工作负载进程进行核查,以获取其注册的 uid。

    shell
    (in dev shell) # useradd -u 1001 workload
  4. 运行 build 目标来构建 SPIRE。build 目标会构建所有 SPIRE 二进制文件。这需要配置 git,让它知道这个临时 docker 容器是安全的。

    shell
    (in dev shell) # git config --global --add safe.directory /spire
    (in dev shell) # make build
  5. 试着为 entry 子命令运行 helpspire-serverspire-agent 可执行文件都带有 --help 选项,可给出各自 CLI 选项的详细信息。

    shell
    (in dev shell) # ./bin/spire-server entry --help
  6. 查看 SPIRE Server 配置文件。

    shell
    $(in dev shell) # cat conf/server/server.conf

    默认的 SPIRE Server 配置如下所示。每个 SPIRE Server 配置项的详细说明见 Server 文档

    hcl
    server {
        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"
            }
        }
    }
  7. 通过运行以下命令,将 SPIRE Server 作为后台进程启动。

    shell
    (in dev shell) # ./bin/spire-server run &
  8. 通过 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 选项覆盖该默认值。

  9. 查看 SPIRE Agent 的配置文件。

    shell
    (in dev shell) # cat conf/agent/agent.conf

    默认的 SPIRE Agent 配置如下所示。每个 SPIRE Agent 配置项的详细说明见 Agent 文档

    hcl
    agent {
        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 {
            }
        }
    }
  10. 将 SPIRE Agent 作为后台进程启动。将下面命令中的 <generated-join-token> 替换为第 8 步保存的值。

    shell
    (in dev shell) # ./bin/spire-agent run -joinToken <generated-join-token> &
  11. 下一步是为一个 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。

  12. 通过在 agent 中运行 api 子命令,模拟工作负载 API 交互并获取该工作负载的 SVID 证书包(bundle)。以第 3 步创建的、uid 为 1001 的用户 workload 身份运行该命令。

    shell
    (in dev shell) # su -c "./bin/spire-agent api fetch x509 " workload
  13. 检查输出。你也可以选择用 -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