spiffe基础

TLS Mutual Authentication

  • Each microservice will have its own certificate to prove its identity

    • How do we provision certificates to each microservice?

    • How do we deal with certificate revocations?

    • How do we deal with trust bootstrap?

    • How do we deal with key rotation?

  • SPIFFE/SPIRE

    • Secure Production Identity Framework for Everyone.

    • SPIFFE tries to solve the trust bootstrap problem in a platform agnostic manner.
    • SPIFFE provides an identity to each workload in a microservices deployment, which is known as the SPIFFE ID.

      • E.g.: spiffe://acme.com/billing/payments-17

SPIFFE基础概念

  • SPIFFE是一套开源的安全生产身份框架,用于在动态和异构环境中安全地识别软件系统

    • 微服务、容器编排平台和云计算等分布式模式和实践导致生产环境越来越动态及异构化

    • 传统的安全实践(例如仅允许特定IP地址之间的流量策略)难以应对这种复杂性,因此,适用于识别所有工作负载的一等身份管理框架就成了迫切之需
  • SPIFFE标准定义了一套能够跨异构环境和组织边界完成bootstrap以及向服务发布身份ID的安全框架

    • 这些规范的核心是定义短期加密身份文档的规范,称为SVID;随后,工作负载可以在向其他工作负载进行身份验证时使用这些身份文档,例如通过建立 TLS 连接或通过签署和验证 JWT 令牌
      • SPIFFE规范标准化了向工作负载(workload)分配身份、验证和确认工作负载身份以及工作负载API以检索身份的过程;

      • SPIFFE身份包含在SVID(SPIFFE Verifiable Identity Document)中, SVID规范提供了实现SVID时必须支持的属性的要求;

    • 简单来说,SPIFFE是一个可信bootstrapping和identification框架,它已作为标准提交并被CNCF(云原生计算基金会)接受
  • SPIFFE规范的常见实现

    • SPIRE

    • Istio:Istio control plane负责向所有的工作负载发放SPIFFE ID

    • HashiCorp Consul

    • Kuma

SPIFFE Components

  • The SPIFFE standard comprises three major components

    • SPIFFE ID:标准化身份名称空间,并定义服务如何确认彼此身份;

      • 用于惟一标识一个workload的字符串,也可用于标识workload运行的中间层,例如虚拟机、kubernetes等;

      • 使用URI格式:spiffe://trust domain/workload identifier

      • trust domain:可信域

        • 一个对应于一个系统的trust root,同一可信域中的所有workload都可由所属域的根密钥进行验证;

        • 可信域名义上是自注册的,与公共DNS不同,可信域没有委派机制

        • 可信域中必须存在签名机构,并且该签名机构必须拥有自己的SVID;

      • SVID:用于定义如何表示及验证颁发的身份标识的规范;

        • SVID是workload用于证明自身身份的文档,由可信域的CA签署后才有效;

        • SVID将SPIFFE ID编码为可加密验证的文档,目前支持X.509-SVID和JWT-SVID两种编码格式;后一种格式易受到重放攻击,建议尽可能地使用前一种格式;
      • Workload API:

        • 工作负载泛指单个应用程序,它可能包含多个正在运行的实例,所有这些实例都执行相同的任务;

        • Workload API用于颁发X.509-SVID或JWT-SVID

SPIFFE Workload API

  • 用于提供使工作负载能够使用的SPIFFE身份,以及基于SPIFFE的身份验证系统的信息和服务;
  • 支持任意数量的本地客户端,从而使其能够引导可以访问它的任何进程的身份
    • 通常,希望在每个进程被授予某些身份的情况下即可以每个进程为基础分配身份;
    • 为此,SPIFFE Workload API实现必须能够确定调用者的身份;
  • X.509身份文档格式

    • 标识符,即SPIFFE ID;

    • 与ID关联的私钥,由当前workload签署数据,以及一个短存活期的用于建立tls通信的X.509格式的数字证书;
    • 可信证书集(trust bundle),由workload用于验证其它workload的X.509-SVID;
    • 主要用于服务间认证tls通信;
  • JWT身份文档格式
    • 标识符,即SPIFFE ID;
    • JWT Token;
    • 可信证书集,由workload用于验证其它workload的身份;
    • 最终用户身份认证;
  • SPIFFE Workload API需要被实现为gRPC流式服务器,以便快速传播更新,例如证书吊销等;

SPIRE

  • SPIRE是SPIFFE API的可用于生产的具体实现之一,它负责执行node和workload的身份证明,以便根据一组预定义的条件安全地向workload签发SVID,并验证其他workload的SVID;
  • SPIRE可以用于多种情况,并可以执行多种与身份相关的功能

    • 服务之间的安全身份验证

    • 安全地引入Vault和Pinterest Knox等secret stores;

    • 为服务网格中的sidecar代理服务提供身份认证的基础设施;

    • 用于分布式系统组件的PKI的供给和轮替;

SPIRE Architecture and Components

  • A SPIRE Server and one or more SPIRE Agents

    • SPIRE Server:签名授权机构,它通过各SPIRE Agent接收请求;
    • 负责管理和发布已配置的SPIFFE可信域中的所有身份;

    • 它存储注册条目(用于指定确定特定SPIFFE ID的发布条件的选择器)和签名密钥
    • 使用node attestation自动认证Agent的身份,并在经过认证的agent请求时为其本地的workload创建SVID;
  • SPIRE Agent:运行于各工作节点,用于向节点上的workload提供workload API; 
    • 从服务器请求SVID并缓存它们,直到workload请求其SVID
    • 将SPIFFE Workload API暴露给本地节点上的workload,并负责证明调用它的workload的身份
    • 提供已识别的workload及其SVID

SPIRE Server

  • SPIRE Server高度插件化,用户需要通过一系列插件来配置其行为;

    • Node attestor插件负责结合各节点上运行的agent node attestor插件一同来验证节点身份;

    • Node resolver为SPIRE Server提供一系列selector(选择器)从而让Server能够基于其它属性来验证节点身份;
    • Datastore插件被SPIRE Server用于存储、查询和更新各种信息,例如registration entries,包括哪些节点身份业已得到证明,以及这些节点各自相关的选择器等 ;
      • 内置的数据存储插件支持使用SQLite 3或PostgresSQL作为存储后端
      • 默认情况下,它使用SQLite 3
    • Key manager插件负责控制服务器如何存储用于签署X.509-SVID和JWT-SVID的私钥;

    • 默认情况下,SPIRE Server充当其自己的证书颁发机构,必要时也可以使用Upstream certificate authority (CA) 插件来使用来自不同PKI系统的不同CA;

SPIRE Agent

  • SPIRE Agent需要运行于每个运行有workload的节点上,并负责以下任务

    • 从SPIRE Server请求SVID并缓存它们,直到workload请求其SVID

    • 将SPIFFE Workload API暴露给节点上的workload,并证明调用它的workload的身份

    • 提供已识别的workload及其SVID

  • SPIRE Agent同样基于组合配置一系列插件完成其工作

    • Node attestor插件同Server端的node attestor插件一起完成对agent程序所在节点的身份验证;

    • Workload attestor插件通过从节点操作系统查询相关进程的信息,并将其与使用selector注册workload属性时提供给server的信息进行比较,从而验证节点上workload进程的身份;
    • Key manager插件,负责让agent用来为发布给workload的X.509-SVID生成私钥;

How SPIRE issue SVIDs

Node Attestation Internals

Workload Attestation Internals

参考文档

https://spiffe.io/docs/latest/spiffe-about/overview/

posted @ 2022-09-22 18:32  小吉猫  阅读(411)  评论(0编辑  收藏  举报