SPIRE 是 SPIFFE 标准的生产级实现,为云原生环境下的工作负载提供自动化、可扩展的身份分发和证明机制,是实现零信任安全架构的关键基础设施。
SPIRE(SPIFFE Runtime Environment)是 SPIFFE API 的生产就绪实现,它执行节点和工作负载认证,根据预定义条件安全地向工作负载发布 SVID(SPIFFE Verifiable Identity Document),并验证其他工作负载的 SVID。
SPIRE 的部署架构由 SPIRE 服务器和一个或多个 SPIRE 代理组成。服务器作为证书颁发机构(CA),通过代理向工作负载分发身份,并维护身份注册表和验证条件。代理需部署在每个运行工作负载的节点上,负责本地暴露 SPIFFE 工作负载 API 并完成本地证明。
下图展示了 SPIRE 的整体架构:
{width=860 height=1444}
SPIRE 服务器负责管理和发布其信任域内的所有身份,核心职责包括:
{width=1298 height=674}
SPIRE 服务器通过插件机制实现高度可扩展性,支持以下插件类型:
详细配置参考 SPIRE 服务器配置参考。
SPIRE 代理需在每个节点上运行,主要功能包括:
{width=1233 height=933}
详细配置参考 SPIRE 代理配置参考。
SPIRE 支持自定义插件开发,适配不同平台和安全需求:
插件可在运行时动态加载,无需重新编译 SPIRE。
SPIRE 通过注册条目(Registration Entry)识别和授权工作负载。注册条目定义了:
代理在证明过程中会将本地发现的选择器与注册条目比对,只有匹配的工作负载才能获得对应身份。
详细注册流程见 SPIRE 文档。
SPIRE 的证明(attestation)分为两阶段:
代理首次连接服务器时需完成节点证明。常见方式包括:
下图展示了 AWS 节点证明流程:
{width=1359 height=954}
节点证明流程:
SPIRE 支持多种节点证明器,详见官方文档。
节点解析器插件可扩展节点属性,增强选择器能力,支持 AWS、Azure 等云平台。
代理通过本地权限(如内核、kubelet)识别调用 API 的进程属性,包括:
{width=615 height=903}
工作负载证明流程:
SPIRE 内置支持 Unix/Linux、Kubernetes、Docker 等环境。
节点证明不需要节点选择器,除非你需要将工作负载映射到多个节点。
以下为 SPIRE 向工作负载颁发身份的完整流程(以 AWS EC2 为例,X.509 SVID):
服务器仅向代理下发授权注册条目,具体流程包括:
详见多节点映射。
SPIRE Kubernetes 工作负载注册器支持多种自动注册模式,适配不同场景:
注册器支持命令行参数和 HCL 配置文件,核心配置项如下:
| 配置项 | 类型 | 必需 | 描述 | 默认值 |
|---|---|---|---|---|
log_level |
string | 是 | 日志级别(panic、fatal、error、warn、info、debug、trace) |
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 | 否 | 运行模式:webhook、reconcile、crd |
webhook |
disabled_namespaces |
[]string | 否 | 禁用自动注册的命名空间列表 | kube-system, kube-public |
不同模式支持的注册方式如下:
| 注册方式 | 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 标签值生成 SPIFFE ID:
pod_label = "spire-workload"
apiVersion: v1
kind: Pod
metadata:
labels:
spire-workload: "payment-service"
spec:
# 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
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
在 reconcile 和 crd 模式下,可为 Pod 注册条目添加 DNS 名称。需注意部分服务(如 etcd)对 DNS 反向解析有特殊要求,必要时建议禁用该功能。
部分服务(如 etcd)使用反向 DNS 验证客户端证书中的 DNS SAN。由于 Kubernetes 客户端 IP 可能无法有效反向解析,建议对这类服务禁用 DNS 名称功能。
reconcile,复杂策略用 crd,测试可选 webhookdisabled_namespaces,最小权限原则leader_election,按需启用 DNS 名称,监控注册器指标常见问题及排查建议:
reconcile 模式下可监控 Pod 处理速度、注册成功率和控制器健康状态。
SPIRE 作为 SPIFFE 标准的生产级实现,为云原生环境下的工作负载提供了自动化、可扩展的身份分发和证明机制。通过灵活的插件体系和多种注册模式,SPIRE 能够适配多样化的基础设施和安全需求,是实现零信任架构和细粒度身份管理的关键组件。建议结合实际场景选择合适的注册模式和安全配置,持续优化身份管理体系。