Menu

SPIRE 是 SPIFFE 标准的生产级实现,为云原生环境下的工作负载提供自动化、可扩展的身份分发和证明机制,是实现零信任安全架构的关键基础设施。

SPIRE(SPIFFE Runtime Environment)是 SPIFFE API 的生产就绪实现,它执行节点和工作负载认证,根据预定义条件安全地向工作负载发布 SVID(SPIFFE Verifiable Identity Document),并验证其他工作负载的 SVID。

核心架构

SPIRE 的部署架构由 SPIRE 服务器和一个或多个 SPIRE 代理组成。服务器作为证书颁发机构(CA),通过代理向工作负载分发身份,并维护身份注册表和验证条件。代理需部署在每个运行工作负载的节点上,负责本地暴露 SPIFFE 工作负载 API 并完成本地证明。

下图展示了 SPIRE 的整体架构:

SPIRE 架构图 {width=860 height=1444}

SPIRE 服务器

SPIRE 服务器负责管理和发布其信任域内的所有身份,核心职责包括:

SPIRE 服务器 {width=1298 height=674}

服务器插件体系

SPIRE 服务器通过插件机制实现高度可扩展性,支持以下插件类型:

详细配置参考 SPIRE 服务器配置参考

SPIRE 代理

SPIRE 代理需在每个节点上运行,主要功能包括:

SPIRE 代理 {width=1233 height=933}

代理核心组件

详细配置参考 SPIRE 代理配置参考

扩展性

SPIRE 支持自定义插件开发,适配不同平台和安全需求:

插件可在运行时动态加载,无需重新编译 SPIRE。

工作负载注册

SPIRE 通过注册条目(Registration Entry)识别和授权工作负载。注册条目定义了:

代理在证明过程中会将本地发现的选择器与注册条目比对,只有匹配的工作负载才能获得对应身份。

详细注册流程见 SPIRE 文档

身份证明机制

SPIRE 的证明(attestation)分为两阶段:

  1. 节点证明:验证代理节点身份
  2. 工作负载证明:验证节点上具体工作负载身份

节点证明

代理首次连接服务器时需完成节点证明。常见方式包括:

下图展示了 AWS 节点证明流程:

SPIRE 节点证明步骤 {width=1359 height=954}

节点证明流程:

  1. 代理节点证明器获取节点身份证明
  2. 代理将证明材料传递给服务器
  3. 服务器节点证明器独立验证,生成代理 SPIFFE ID
  4. 服务器返回代理节点 SVID

SPIRE 支持多种节点证明器,详见官方文档。

节点解析

节点解析器插件可扩展节点属性,增强选择器能力,支持 AWS、Azure 等云平台。

工作负载证明

代理通过本地权限(如内核、kubelet)识别调用 API 的进程属性,包括:

工作负载证明 {width=615 height=903}

工作负载证明流程:

  1. 工作负载调用 API 请求 SVID
  2. 代理获取进程 ID,调用工作负载证明器
  3. 证明器发现进程属性,返回选择器
  4. 代理比对选择器与注册条目,返回 SVID

SPIRE 内置支持 Unix/Linux、Kubernetes、Docker 等环境。

节点证明不需要节点选择器,除非你需要将工作负载映射到多个节点

SVID 身份颁发过程

以下为 SPIRE 向工作负载颁发身份的完整流程(以 AWS EC2 为例,X.509 SVID):

  1. SPIRE 服务器启动,生成自签名证书(或通过 UpstreamAuthority 插件集成外部 CA)。
  2. 服务器初始化信任包并开放注册 API。
  3. 节点上的 SPIRE 代理启动,执行节点证明(如 AWS 实例身份文档)。
  4. 代理通过 TLS 连接向服务器提交证明材料。
  5. 服务器调用云平台 API 验证证明。
  6. 服务器完成节点解析,更新注册条目。
  7. 服务器向代理发放节点 SVID。
  8. 代理用节点 SVID 认证服务器,获取授权注册条目。
  9. 代理为工作负载生成 CSR,服务器签发工作负载 SVID。
  10. 代理缓存 SVID 并监听 Workload API。
  11. 工作负载调用 API 请求 SVID,代理完成工作负载证明并返回 SVID。

授权注册条目

服务器仅向代理下发授权注册条目,具体流程包括:

  1. 查询以代理 SPIFFE ID 为父 ID 的注册条目
  2. 查询节点选择器相关条目
  3. 查询选择器匹配的注册条目
  4. 递归查询所有子节点注册条目

详见多节点映射

SPIRE Kubernetes 工作负载注册器

SPIRE Kubernetes 工作负载注册器支持多种自动注册模式,适配不同场景:

配置选项

注册器支持命令行参数和 HCL 配置文件,核心配置项如下:

基础配置

配置项 类型 必需 描述 默认值
log_level string 日志级别(panicfatalerrorwarninfodebugtrace info
log_path string 日志文件路径 标准输出
trust_domain string SPIRE 服务器的信任域 -
server_address string SPIRE 服务器地址,支持 TCP 和 Unix 套接字格式 -
server_socket_path string SPIRE 服务器 Unix 套接字路径(与 server_address 二选一) -
agent_socket_path string SPIRE 代理 Unix 套接字路径 -
cluster string 集群标识符,需与 SPIRE 服务器节点证明配置匹配 -

工作负载识别配置

配置项 类型 必需 描述 默认值
pod_label string 用于标签模式的 Pod 标签键 -
pod_annotation string 用于注解模式的 Pod 注解键 -
mode string 运行模式:webhookreconcilecrd webhook
disabled_namespaces []string 禁用自动注册的命名空间列表 kube-system, kube-public

工作负载注册模式

不同模式支持的注册方式如下:

SPIRE 工作负载注册模式对比

注册方式 Webhook 模式 Reconcile 模式 CRD 模式
服务账户
Pod 标签
Pod 注解
身份模板

服务账户模式

基于 Kubernetes 服务账户自动生成 SPIFFE ID,格式为:

spiffe://<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>

注册条目示例:

Entry ID      : 200d8b19-8334-443d-9494-f65d0ad64eb5
SPIFFE ID     : spiffe://example.org/ns/production/sa/blog
Parent ID     : spiffe://example.org/spire/agent/k8s_psat/production/node-123
Selectors     : k8s:ns:production
        k8s:pod-name:blog-app-98b6b79fd-jnv5m

Pod 标签模式

基于指定 Pod 标签值生成 SPIFFE ID:

pod_label = "spire-workload"
apiVersion: v1
kind: Pod
metadata:
  labels:
    spire-workload: "payment-service"
spec:
  # Pod 配置

Pod 注解模式

基于指定 Pod 注解值生成自定义 SPIFFE ID 路径:

pod_annotation = "spiffe.io/spiffe-id"
apiVersion: v1
kind: Pod
metadata:
  annotations:
    spiffe.io/spiffe-id: "services/payment/v1"
spec:
  # Pod 配置

联合身份注册

通过 spiffe.io/federatesWith 注解实现跨信任域联合身份:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    spiffe.io/federatesWith: "partner-domain.com,vendor-domain.org"
spec:
  # Pod 配置

部署方式

SPIRE Kubernetes 工作负载注册器支持独立部署和 Sidecar 部署两种方式。

独立部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spire-k8s-registrar
  namespace: spire-system
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spire-k8s-registrar
  template:
    metadata:
      labels:
        app: spire-k8s-registrar
    spec:
      serviceAccountName: spire-k8s-registrar
      containers:
      - name: k8s-workload-registrar
        image: ghcr.io/spiffe/k8s-workload-registrar:1.8.0
        args:
        - -config
        - /opt/spire/conf/k8s-workload-registrar.conf
        volumeMounts:
        - name: config
          mountPath: /opt/spire/conf
        - name: spire-agent-socket
          mountPath: /tmp/spire-agent/public
      volumes:
      - name: config
        configMap:
          name: k8s-workload-registrar
      - name: spire-agent-socket
        hostPath:
          path: /run/spire/sockets
          type: DirectoryOrCreate

Sidecar 部署

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: spire-server
spec:
  template:
    spec:
      containers:
      - name: spire-server
        # SPIRE 服务器配置
      - name: k8s-workload-registrar
        image: ghcr.io/spiffe/k8s-workload-registrar:1.8.0
        args:
        - -config
        - /opt/spire/conf/k8s-workload-registrar.conf
        volumeMounts:
        - name: spire-server-socket
          mountPath: /tmp/spire-server/private
        - name: registrar-config
          mountPath: /opt/spire/conf
      volumes:
      - name: spire-server-socket
        emptyDir: {}
      - name: registrar-config
        configMap:
          name: k8s-workload-registrar

运行模式详解

Webhook 模式

Reconcile 模式(推荐)

CRD 模式

DNS 名称支持

reconcilecrd 模式下,可为 Pod 注册条目添加 DNS 名称。需注意部分服务(如 etcd)对 DNS 反向解析有特殊要求,必要时建议禁用该功能。

部分服务(如 etcd)使用反向 DNS 验证客户端证书中的 DNS SAN。由于 Kubernetes 客户端 IP 可能无法有效反向解析,建议对这类服务禁用 DNS 名称功能。

最佳实践

故障排查

常见问题及排查建议:

reconcile 模式下可监控 Pod 处理速度、注册成功率和控制器健康状态。

平台兼容性

总结

SPIRE 作为 SPIFFE 标准的生产级实现,为云原生环境下的工作负载提供了自动化、可扩展的身份分发和证明机制。通过灵活的插件体系和多种注册模式,SPIRE 能够适配多样化的基础设施和安全需求,是实现零信任架构和细粒度身份管理的关键组件。建议结合实际场景选择合适的注册模式和安全配置,持续优化身份管理体系。

参考文献


Menu