Skip to content

工作负载身份迁移:从 SPIFFE 到 IAM ​

范围:VPC Lattice 服务/资源 API 和 AWS Gateway API Controller;请核对所选版本及已安装的 CRD。 最后更新:2026 年 9 月 13 日

本文涵盖内容 ​

  • SPIFFE/SPIRE 如何解决工作负载身份问题,尤其是证明机制如何解决引导难题
  • SPIFFE 双向 TLS 与 Lattice IAM Auth 之间的相似之处(短期凭证加平台证明),以及两个决定性的差异
  • 为什么这些差异会成为金融行业安全评审的核心问题

起始问题:工作负载如何证明自己的身份? ​

服务 A 调用服务 B 时,B 需要知道“这个请求确实来自 A 吗?”之所以难以解决,是因为首先要考虑如何向工作负载交付用于证明身份的机密。

要向工作负载交付机密(例如证书或 API 密钥),你必须先确认它确实是该工作负载;而要确认这一点,又需要机密。这就是引导难题,传统的权宜做法只是把问题转移到别处。

权宜做法问题转移到何处
将证书烘焙进镜像镜像泄漏就等于身份泄漏;续订需要重新构建镜像
作为 Secret 挂载任何能读取该 Secret 的人都可以伪造对应身份
在部署时注入CI/CD 系统掌握了所有身份的主密钥

SPIFFE/SPIRE 和 Lattice IAM Auth 都通过让平台为工作负载背书来解决此问题。这就是两者结构非常相似的原因。正因为相似,评审的重点才会放在两者具体有哪些差异上。

SPIFFE 的三个组成部分 ​

SPIFFE(Secure Production Identity Framework For Everyone)是工作负载身份的标准:它是一份规范,而不是一种实现。

① SPIFFE ID:身份名称 ​

使用 URI 标识一个工作负载。

text
spiffe://<trust-domain>/<workload-path>

e.g.: spiffe://finance.example.com/ns/prodcatalog/sa/prodcatalog-sa

trust-domain 是信任边界的名称。同一信任域中的工作负载共享共同的信任根(同一个 CA)。路径部分由组织自行设计;在 Kubernetes 环境中,通常体现命名空间和 ServiceAccount。

值得注意的是,名称中不包含任何网络信息:没有 IP、主机名或端口。这是有意的设计:工作负载无论调度到哪里、IP 如何变化,身份都保持不变。文档 04中提到的“从基于 IP 的控制转向基于身份的控制”由此开始。

② SVID:证明身份的凭证 ​

SPIFFE 可验证身份文档(SPIFFE Verifiable Identity Document)。它以两种形式之一,在可验证文档中携带 SPIFFE ID。

形式内容主要用途
X.509-SVID含有 SAN URI 格式 SPIFFE ID 的 X.509 证书及私钥mTLS 双向身份验证
JWT-SVID在 sub 声明中包含 SPIFFE ID 的 JWT在 HTTP 标头中传递身份、执行 L7 授权

其关键特性是有效期较短。SVID 通常签发后有效几十分钟到几小时,并会自动续订。短有效期很重要,因为它能绕开吊销难题。CRL 和 OCSP 在运维上较为棘手;如果凭证很快就会过期,即使没有任何吊销机制,凭证泄漏可被利用的时间也会受到限制。

③ Workload API:身份交付通道 ​

工作负载通过此接口获取 SVID。最关键的是,该接口通过 Unix 域套接字(UDS)暴露。

UDS 是这种设计的核心:工作负载连接套接字时不需要出示任何凭证。相反,内核会可靠地提供对端进程的信息(PID、UID、GID),SPIRE Agent 会据此直接调查对端的身份。

换句话说,这不是“出示机密以证明身份”,而是“由平台观察并判定身份”。引导难题正是在这里得到解决。

SPIRE 组件 ​

SPIRE 是 SPIFFE 的参考实现。

组件作用
SPIRE Server信任根。持有 CA 并签发 SVID。管理 Registration Entry,指定哪些选择器会获得哪些 SPIFFE ID
SPIRE Agent(DaemonSet)在每个节点上运行。向 Server 证明节点自身身份,再调查该节点上的工作负载,并代表它们获取、交付和续订 SVID
Attestation身份判定流程,分为 Node Attestation 和 Workload Attestation 两个阶段
Envoy SDS 集成Envoy 通过 Secret Discovery Service 协议从 Agent 接收证书;应用代码无需了解 mTLS

证明如何解决引导难题 ​

这是 SPIRE 的核心,也是与 IAM 进行比较时的参照点。

Node Attestation:Agent 向 Server 证明“我是这个节点”。使用的证据不是预先植入的机密,而是平台签发的证明。在 AWS 上,证据可以是 EC2 实例签名后的 IMDS 文档或实例身份文档。Server 可以向 AWS 验证该证据,因此不需要在节点上预先放置共享机密。

Workload Attestation:Agent 会调查节点上的工作负载:

  1. 工作负载在没有凭证的情况下连接 UDS
  2. Agent 从内核获取对端进程 PID(不可伪造);这是内核报告的事实
  3. Agent 根据 PID 读取 cgroup,以确定这是哪个容器
  4. Agent 查询 kubelet/kube-apiserver,确认该容器对应的 Pod、命名空间、ServiceAccount 和标签
  5. Agent 将这些属性组合为选择器并提交给 Server
  6. Server 在 Registration Entry 中查找匹配的 SPIFFE ID 并签发 SVID

第 2 步正是引导难题消解之处。工作负载不必声称自己是谁;它无须这样做。内核报告一个事实,再由平台(Kubernetes)的记录交叉验证。要伪造该事实,就必须攻陷内核或 Kubernetes API server;一旦达到这种攻陷程度,其他一切都已经沦陷。

一句话概括:身份不是由工作负载出示的,而是由平台观察并判定的。

与 IAM Auth 比较 ​

Lattice IAM Auth 的流程见文档 03。逐项比较如下:

项目SPIFFE/SPIRE(现状)Lattice IAM Auth(目标状态)
身份名称SPIFFE ID(spiffe://<trust-domain>/ns/<ns>/sa/<sa>)IAM Role ARN / 假定角色会话 ARN
凭证形式X.509-SVID 或 JWT-SVIDSTS 临时凭证(Access Key ID + Secret Access Key + 会话令牌)
证明方式证明持有证书私钥(TLS 握手)SigV4 请求签名(证明持有秘密访问密钥)
证明范围连接(建立时一次)请求(每个请求都验证)
由谁进行证明SPIRE Agent(节点)+ SPIRE ServerEKS Pod Identity Agent + EKS Auth API
证明证据内核 PID → cgroup → Pod/ServiceAccount 查询ServiceAccount ↔ Role 关联(EKS Auth API)或 OIDC 令牌(IRSA)
验证方式对端 Envoy 根据信任包验证 SVID 证书链Lattice 重新计算/比较签名,然后评估三项策略
信任根由客户运行的 SPIRE Server CAAWS IAM / STS
凭证有效期几十分钟到几小时,自动续订STS 临时凭证,自动刷新
授权表达方式基于 SPIFFE ID 的 Envoy 授权过滤器三项 IAM 策略(基于身份 + 服务网络 + 服务)
可观测性Envoy 指标/日志(按 SPIFFE ID)Lattice 访问日志(按主体,不包含 spans)
运维负担高:SPIRE Server 高可用、CA 密钥管理、CA 轮换、Registration Entry 管理、Agent 部署/升级、信任包分发低:Pod Identity Agent 附加组件和 ServiceAccount↔Role 关联。无 CA 或密钥管理
多集群需要设计信任域和联合关系通过 Pod Identity 重用角色,每个集群的单独配置较少
AWS 之外的工作负载配置合适的 SPIRE attestor 后可以支持需要合适的 IAM 凭证提供程序及受支持的 Lattice 连接方式;IAM 本身并不禁止此场景

相似点:为什么可以迁移 ​

对比表看起来像在比较完全不同的系统,但从结构上看它们采用相同模式。这正是迁移过程能够保持逻辑一致的原因。

① 两者都使用短期凭证 ​

SVID 和 STS 临时凭证的有效期都较短,并会自动续订。两者采用这种设计的原因相同:在没有吊销机制的情况下,限制凭证泄漏后可被利用的时间。

两种方式都可以避免分发长期有效的应用机密,但评审仍须覆盖凭证有效期、续订、泄漏响应和授权。有效期较短不能免除吊销或紧急拒绝访问的要求。

② 两者都基于平台证明 ​

工作负载不会事先持有机密;由平台为它背书。

阶段SPIREEKS Pod Identity
节点身份Node Attestation(EC2 身份文档等)节点 Role 的 AssumeRoleForPodIdentity 权限
工作负载判定内核 PID → cgroup → Pod/SAPod 的 ServiceAccount ↔ Role 关联
凭证交付Workload API(UDS)Pod Identity Agent(链路本地地址)
凭证续订Agent 续订 SVIDSDK 刷新凭证

两种方式都使用平台证据,但选择器、令牌验证、凭证暴露方式和信任边界各不相同。请验证实际的 attestor 或凭证提供程序,不要直接宣称两种模型等同。

未预置长期有效的机密,不代表运行时不使用机密。交付 X.509-SVID 时会包含私钥材料;临时 IAM 凭证也包含秘密访问密钥/会话令牌。应保护 Agent 套接字/端点、内存、日志和凭证缓存;证明机制的强度取决于其配置的信任假设。

两个决定性差异 ​

既然两者有很多相似之处,评审时真正会讨论的是它们在哪些方面不同。以下两项属于结构性差异,不能仅靠运维便利性来消除。

差异(a):双向相互身份验证,变为单向 TLS 身份验证加请求身份验证 ​

现状是双向验证。

在 mTLS 握手中,客户端和服务器都会验证彼此的 SVID。客户端根据 SPIFFE ID 确认“我连接的对端确实是 payments 服务吗”,服务器则确认“连接到我的对端确实是 orders 服务吗”。双方都在工作负载身份系统内证明自己。

目标状态是不对称的。

方向现状目标状态
客户端 → 服务器(客户端证明身份)SVID 双向身份验证SigV4 请求签名(每个请求一次,粒度更细)
服务器 → 客户端(服务器证明身份)SVID 双向身份验证TLS 服务器证书(普通 TLS 层级)

SigV4 会验证每个请求中签名覆盖的字段,而 mTLS 会验证 TLS 对端;两种设计都可以另行执行请求级授权。任何一种都不能在所有情况下被称为更强。Lattice 要求 UNSIGNED-PAYLOAD,因此应通过 TLS 保护载荷,并明确考虑重放和凭证盗窃风险。

问题在于服务器身份的证明。客户端只能确认“该 TLS 证书有效,且域名匹配”。在工作负载身份系统中,没有任何步骤可以确认“这确实是由那个团队运营的服务”。

评审时实际会提出的问题是:

对 DNS、证书、服务关联或目标注册的未授权更改,是否可能重定向此工作负载的流量?应与端点身份验证一起审查这些控制平面权限。仅有相同的显示名称,并不会将现有自动生成的服务 DNS 身份转移到另一服务。

坦诚的回答是:“不能在工作负载身份系统内部解决;必须通过 IAM 控制服务网络和 Lattice 资源来预防。”换句话说,防线从工作负载之间的相互身份验证转移到对资源创建权限的控制。

这并不是一个糟糕的答案。通过 IAM 严格限制谁能创建 Lattice Service、控制服务网络关联,并使用 CloudTrail 监控资源创建,可以管理实际风险。但如果评审文档写的是“相互身份验证”,就必须重写该项,并在另一个控制层说明依据。迁移后期才发现这个问题,会严重拖延计划。

差异(b):信任根的所有权 ​

这对金融行业的评审影响更大。

项目现状目标状态
信任根客户运营的 SPIRE Server CAAWS IAM / STS
CA 私钥所有权客户或配置的上游 CA客户不管理 Lattice CA;但 IAM 临时秘密凭证仍然存在
由谁签发身份客户自有 CA 根据客户定义的 Registration Entry 签发AWS STS
由谁决定签发规则完全由客户控制客户通过 IAM 控制;AWS 执行
审计记录SPIRE Server 日志(由客户持有)CloudTrail(AWS 服务)
由谁决定 CA 轮换客户(不适用)
能否在 AWS 之外工作取决于 attestor 和连接情况配置适当的凭证提供程序并使用受支持的私有连接后可以;Pod Identity 不会自动提供此能力
运维负担由客户承担由 AWS 承担

这种权衡十分明确:你将信任根的所有权交给 AWS,以换取 AWS 承担运维负担。

由于监管和评审惯例,这一项在金融行业尤其重要。许多组织的安全标准明确规定“身份验证系统的信任根必须由我们自己控制”,或包含可被如此解读的条款。自行运行 CA 曾是最直接的合规方式;采用 SPIRE 很可能正是通过了这项评审的结果。

迁移到 Lattice IAM Auth 意味着必须重新构建合规论证。可采用的依据包括:

论据内容
共同责任模型IAM/STS 是 AWS 已根据多个认证监管框架运营的控制措施
保留策略权限谁能调用什么,仍由客户通过 IAM 策略完整定义
确保审计记录CloudTrail 提供凭证签发和 API 调用历史;Lattice 访问日志提供数据路径历史
减少 CA 运维AWS 负责其服务 PKI,但客户仍须保护临时凭证、角色、令牌和端点密钥
保留有效期和证明能力仍满足前述两项相似点

但这只能论证“控制方式不同”,不能论证“二者等同”。评审方是否接受前者取决于组织标准,这不是技术能够解决的问题。

作为金融行业评审事项的立场 ​

总结相关评审问题:

项目评审状态依据
避免将长期有效机密烘焙进镜像验证配置两者都能使用自动续订的短期凭证
运行时机密暴露需要评审仍须保护短期私钥/令牌
按请求授权比较已配置的策略mTLS 身份也能用于请求级授权;SigV4 并非唯一方式
客户端身份验证机制发生变化TLS 对端证明与请求签名的覆盖范围和威胁假设不同
服务器身份验证⚠️ 减弱:需要补偿性控制从工作负载身份系统下沉到 TLS 服务器证书层;防线转移到通过 IAM 控制资源创建
信任根所有权⚠️ 转移:需要重写论证客户 CA → AWS IAM/STS
端到端加密选择信任边界HTTPS 在 Lattice 终止;Passthrough 保留端点 TLS,但无法提供已验证的 HTTP SigV4 身份
可观测性(追踪)⚠️ 减弱Envoy spans 会消失;需要应用程序埋点(参见文档 01)
AWS 之外的工作负载单独设计评估凭证和受支持的网络访问,不要假设一定不可能

与负责的安全团队一起审查信任边界和运维边界的变化。端点 mTLS、Lattice 已身份验证的 HTTP 和基于匿名网络上下文的策略提供不同控制;应根据实际要求选择,不要声称某种配置能满足所有组织的评审标准。

保留 SPIRE 的选项 ​

迁移并不一定意味着停用 SPIRE。

  • 对于 AWS 之外的工作负载,SPIRE 可能仍有价值;也可以评估其他凭证/身份方案。
  • 如果选择 TLS Passthrough 配置,端点必须自行执行 mTLS,SPIRE 可以继续为其提供证书。
  • 这会形成 App Mesh 已移除但 SPIRE 仍保留的架构;应对 App Mesh 结束支持和保留 SPIRE 是两个不同的决定。

如果迁移目标之一是免去 SPIRE 的运维负担,请先确认上述情况是否会与该目标冲突。

总结 ​

  • SPIFFE 的三个组成部分是 SPIFFE ID(URI 格式的名称)、SVID(短期 X.509/JWT 凭证)和 Workload API(通过 UDS 提供)。
  • SPIRE 通过证明解决引导难题,因为身份不是由工作负载出示,而是由平台观察并判定。内核报告的 PID 无法伪造。
  • 两者都可以使用短期凭证和平台证据;运行时机密和策略差异仍需评审。
  • 两个决定性差异是:(a)双向相互身份验证变为单向 TLS 身份验证加请求身份验证,导致服务器身份验证减弱;(b)信任根从客户 CA 转移到 AWS IAM/STS。
  • 技术无法解决这两项问题,都需要组织层面的判断。开始之前应先与安全评审人员讨论,因为结论会改变架构。

下一篇:约束与决策点将汇总完成设计前必须确定的事项。

参考资料 ​

向文档提问

按 Enter 发送,按 Shift+Enter 换行。