spire
weight: 48
title: SPIRE
date: “2022-06-10T00:00:00+08:00”
type: book
summary: 这篇文章将向你介绍SPIRE 的架构、基本概念及原理。
这篇文章将向你介绍
SPIRE 架构和组件
服务器
服务器的行为是通过一系列的插件决定的。
- 节点证明器插件:与代理节点证明器一起,验证代理运行的节点的身份。
- 节点解析器插件:它通过验证关于节点的额外属性来扩展服务器可以用来识别节点的选择器集合。
- 数据存储插件:服务器用它来存储、查询和更新各种信息,如注册条目、哪些节点已认证、这些节点的选择器是什么。有一个内置的数据存储插件,可以使用
MySQL 、SQLite3 或PostgresSQL 数据库来存储必要的数据。默认情况下,使用SQLite 3 。 - 密钥管理器插件:控制服务器如何存储用于签署
X.509-SVID 和JWT-SVID 的私钥。 - 上游权威机构插件:默认情况下,
SPIRE 服务器充当其自身的证书授权机构。但是,你可以使用上游权威机构插件来使用来自不同PKI 系统的不同CA 。
你可以通过配置插件和其他各种配置变量来定制服务器的行为。详见
代理
- 从服务器上请求
SVID ,并将其缓存起来,直到工作负载请求其SVID 为止。 - 向节点上的工作负载公开
SPIFFE 工作负载API ,并证明调用它的工作负载的身份 - 为已识别的工作负载提供其
SVID
该代理的主要组成部分包括:
- 节点证明器插件:与服务器节点证明器一起,验证代理运行的节点的身份。
- 工作负载证明器插件:通过从节点操作系统中查询有关工作负载进程的信息,并将其与你在使用选择器注册工作负载属性时提供给服务器的信息进行比较,来验证节点上工作负载进程的身份。
- 密钥管理器插件:代理用来生成和使用颁发给工作负载的
X.509-SVID 的私钥。
你可以通过配置插件和其他配置变量来定制代理的行为。详见《
自定义服务器和代理插件
你可以为特定的平台和架构创建自定义的服务器和代理插件,而
工作负载注册
为了让
注册条目将身份(以
证明
用于执行证明的可信第三方
节点证明
节点证明的成功后,代理收到唯一的
节点身份证明的示例包括:
- 通过云平台交付给节点的身份证明文件(例如
AWS Instance 身份证明文件) - 验证存储在连接到节点的硬件安全模块或可信平台模块上的私钥
- 安装代理时通过加入令牌提供的手动验证
- 多节点软件系统安装在节点上时提供的标识凭据(例如
Kubernetes 服务账户令牌) - 其他机器身份证明(例如部署的服务器证书)
节点证明器向服务器返回一组(可选)节点选择器,用于标识特定机器(例如
注意
下图说明了节点证明中的步骤。在此图中,底层平台是
步骤总结:节点证明
- 代理
AWS 节点证明器插件向AWS 查询节点身份证明,并将该信息提供给代理。 - 代理将此身份证明传递给服务器。服务器将此数据传递给其
AWS 节点证明器。 - 服务器
AWS 节点证明器独立验证身份证明,或者通过调用AWS API ,使用它在步骤2 中获得的信息。节点证明器还为代理创建一个SPIFFE ID ,并将其传递回服务器进程,以及它发现的任何节点选择器。 - 服务器发回代理节点的
SVID 。
节点证明器
代理和服务器通过它们各自的节点证明器询问底层平台。
AWS 上的EC2 实例(使用EC2 实例身份文档)Microsoft Azure 上的VM (使用Azure 托管服务标识)Google Cloud Platform 上的Google Compute Engine 实例(使用GCE 实例身份令牌)- 作为
Kubernetes 集群成员的节点(使用Kubernetes 服务账户令牌)
对于没有平台可以直接识别节点的情况,
使用服务器生成的加入令牌—— 加入令牌(join token)是
使用现有的
节点解析
一旦验证了单个节点的身份
节点解析器
服务器支持以下平台的节点解析器插件:
- 亚马逊网络服务(AWS)
- 微软
Azure
工作负载证明
工作负载证明提出了一个问题
然后,当你使用选择器注册工作负载的属性时,将这些属性与提供给服务器的信息进行比较。
这些类型的信息可能包括:
- 底层操作系统如何调度进程。在基于
Unix 的系统上,这可能是用户ID (uid) 、组ID (gid) 、文件系统路径等。 ) - 进程是如何由
Kubernetes 等编排系统调度的。在这种情况下,工作负载可能由运行它的Kubernetes 服务账户或命名空间来描述。
虽然代理和服务器都在节点证明中发挥作用,但只有代理参与工作负载证明。
下图说明了工作负载证明的步骤:
步骤摘要:工作负载证明
- 工作负载调用工作负载
API 以请求SVID 。在Unix 系统上,这被暴露为Unix 域套接字。 - 代理询问节点的内核以识别调用者的进程
ID 。然后,它调用任何已配置的工作负载证明器插件,为它们提供工作负载的进程ID 。 - 工作负载证明者使用进程
ID 来发现有关工作负载的其他信息,并根据需要查询相邻平台特定的组件,例如Kubernetes kubelet 。通常,这些组件也与代理驻留在同一节点上。 - 证明者将发现的信息以选择器的形式返回给代理。
- 代理通过将发现的选择器与注册条目进行比较来确定工作负载的身份,并将正确的缓存
SVID 返回给工作负载。