SPIFFE
SPIFFE(Secure Production Identity Framework for Everyone)是一套开源标准,旨在为动态和异构环境中的工作负载提供安全的身份识别机制。通过 SPIFFE,系统中的各个组件无论在何处运行,都能够安全可靠地相互认证。
SPIFFE 规范的核心是通过简单的 API 定义短期加密身份文件 SVID(SPIFFE Verifiable Identity Document)。工作负载可以使用该身份文件进行认证,例如建立 TLS 连接或签署和验证 JWT 令牌。
目前,SPIFFE 已在云原生生态系统中得到广泛应用,特别是在服务网格解决方案如 Istio 和 Envoy 中发挥重要作用。
核心概念
工作负载(Workload)
工作负载是指为特定目的而部署的单一软件系统,可能包含多个执行相同任务的运行实例。工作负载的定义范围很广,包括:
- 运行在虚拟机集群上的 Web 应用程序(如 Python Web 应用)
- 数据库实例(如 MySQL)
- 后台处理程序(如队列处理器)
- 协同工作的系统集合(如 Web 应用程序和数据库服务)
在 SPIFFE 体系中,工作负载的粒度通常比物理或虚拟节点更细,往往细化到节点上的单个进程。这种细粒度的划分对于容器化环境尤为重要,因为同一节点上可能运行多个彼此隔离的工作负载。
值得注意的是,SPIFFE 假设工作负载之间具有足够的隔离性,以防止恶意工作负载窃取其他工作负载的凭证。
SPIFFE ID
SPIFFE ID 是唯一标识工作负载的字符串标识符,也可以分配给工作负载运行的中间系统。它采用 URI 格式:
spiffe://信任域/工作负载标识符
例如:spiffe://acme.com/billing/payments
其中:
- 信任域:定义了系统的信任边界
- 工作负载标识符:在信任域内唯一标识特定工作负载
信任域(Trust Domain)
信任域代表系统的信任根,可以对应个人、组织、环境或部门。每个信任域运行独立的 SPIFFE 基础设施,域内的所有工作负载都会获得基于该域根密钥的身份文件。
推荐将以下场景的工作负载放在不同的信任域中:
- 不同物理位置(如不同数据中心或云区域)
- 不同安全级别的环境(如生产环境与测试环境)
SPIFFE 可验证身份文件(SVID)
SVID 是工作负载向其他系统证明身份的文件。只有当 SVID 由相应信任域内的权威机构签发时,才被认为是有效的。
SVID 包含 SPIFFE ID 并将其编码在可加密验证的文件中,目前支持两种格式:
X.509 证书格式
- 推荐使用的格式
- 抗重放攻击能力强
- 适用于大多数认证场景
JWT 令牌格式
- 在特定场景下使用,如存在 L7 代理或负载均衡器时
- 相对容易受到重放攻击
工作负载 API
工作负载 API 为不同格式的身份文件提供相应的服务:
X.509 格式身份文件
提供以下内容:
- SPIFFE ID 形式的身份标识
- 绑定到该 ID 的私钥,用于数据签名
- 短期 X.509 证书(X.509-SVID),用于 TLS 连接和身份认证
- 信任包,用于验证其他工作负载的 X.509-SVID
JWT 格式身份文件
提供以下内容:
- SPIFFE ID 形式的身份标识
- JWT 令牌
- 信任包,用于验证其他工作负载的身份
API 特性
工作负载 API 具有以下重要特性:
- 零配置认证:类似于 AWS EC2 和 Google GCE 的元数据 API,调用时无需预先配置认证令牌
- 平台无关:可在各种环境中使用,不依赖特定平台
- 细粒度识别:支持进程级和内核级的服务识别
- 自动轮换:所有私钥和证书都是短期的,系统会自动轮换以降低泄露风险
信任包(Trust Bundle)
信任包是一组证书颁发机构(CA)根证书的集合,工作负载使用它来验证其他工作负载的身份。信任包包含用于验证 X.509 和 JWT SVID 的公钥材料:
- X.509 SVID 验证:使用证书集合
- JWT SVID 验证:使用原始公钥
信任包的内容会定期轮换,工作负载通过调用工作负载 API 来获取最新的信任包。
应用场景
SPIFFE 在现代云原生架构中发挥着重要作用:
- 服务网格:在 Istio、Linkerd 等服务网格中提供服务间的安全通信
- 微服务架构:为微服务提供零信任安全模型
- 容器化环境:在 Kubernetes 等容器编排平台中实现细粒度身份管理
- 混合云环境:跨云平台和本地环境的统一身份认证