使用SPIRE(自动)提供TLS证书给Envoy以进行更强大的身份验证

做者:Andrew Hardinghtml

你好!这是来自Scytale的Andrew Harding。若是你目前正在使用Envoy提供安全的服务到服务通讯,我想向你展现如何利用开源SPIRE项目,经过基于多个因子工做负载认证,自动交付和轮换密钥和证书来显着提升你的身份验证安全性。linux

Envoy和SPIRE已经存在了一段时间,但咱们最近才在SPIRE中增长了对Envoy SDS API的支持,这使得设置起来更加容易。咱们来探讨一下。git

背景

Envoy是一个流行的开源服务代理,除其余外,普遍用于在服务之间提供抽象、安全、通过身份验证和加密的通讯。Envoy享有丰富的配置系统,容许灵活的第三方交互。github

该配置系统的一个组件是秘密发现服务协议或SDS(Secret Discovery Service)。Envoy使用SDS从SDS供应商处检索并维护更新的“秘密”。在身份验证的意思来讲,这些秘密是Envoy用于在服务之间提供安全TLS通讯的TLS证书、私钥和可信CA证书。api

短暂的秘密是安全的一个重要方面,由于它们减小了对撤销列表基础设施的需求,这削弱了安全性并致使攻击面增长。旋转短寿命秘密常常涉及手动审计和部署,而且一般对操做员来讲很是麻烦。SDS供应商向Envoy提供更新秘密的能力,是简化秘密管理和为Envoy提供最新服务标识的有用步骤。安全

SPIRESPIFFE运行时环境)是一个工具链,用于在各类平台上创建软件系统之间的信任。SPIRE支持容器化和弹性扩展环境,例如Kubernetes、托管基础架构如Azure、AWS和GCP,以及内部裸机部署。这些环境中的服务能够利用SPIRE以X.509证书(X509-SVID)的形式,获取具备关联私钥的服务标识,以及服务可用于验证其余身份的一组可信CA证书。服务器

当服务与SPIRE接合时,它会经历一个称为证实(attestation)的过程,其中SPIRE宣称架构

(assert)有关服务及其环境的特征。这些宣称与运营商定义的政策相匹配,以决定应该为服务提供哪一个服务标识。(有关证实的更多详细信息,请参阅此视频。)SPIRE根据运营商定义的政策自动轮换服务的X.509证书和密钥。框架

换句话说,Envoy能够经过SDS动态消费服务标识,SPIRE能够动态提供服务标识。听起来很棒!dom

这个怎样运做

当Envoy链接到SDS服务器时,SPIRE代理会证实Envoy并肯定它应该经过SDS向Envoy提供哪些服务身份和CA证书。

随着服务标识和CA证书的轮换,更新将流式传输回Envoy,Envoy可当即将它们应用于新链接,而不会中断或停机,也无需私钥触及磁盘。换句话说,SPIRE丰富的定义和证实服务的方法可用于定位Envoy流程,为其定义身份,并为其提供Xv09证书和Envoy可用于TLS通讯的信任信息。

图片描述
在两个服务之间的两个Envoy代理,使用SPIRE代理做为SDS的实现,以获取相互认证的TLS通讯的秘密

配置SPIRE

在SPIRE中设置SDS支持就像在SPIRE代理配置中设置enable_sds = true配置值同样简单。

配置Envoy

SPIRE代理群集

必须将Envoy配置为与SPIRE代理通讯,经过配置集群指向SPIRE代理提供的Unix域套接字(domain socket)。

例如:

clusters:
  - name: spire_agent
    connect_timeout: 0.25s
    http2_protocol_options: {}
    hosts:
    - pipe:
      path: /tmp/agent.sock

connect_timeout会影响Envoy在启动Envoy时SPIRE代理未运行或者若是重启SPIRE代理时可以响应的速度。

TLS证书

要从SPIRE获取TLS证书和私钥,你能够在TLS上下文中设置SDS配置。

例如:

tls_context:
  common_tls_context:
    tls_certificate_sds_secret_configs:
      - name: "spiffe://example.org/backend"
      sds_config:
        api_config_source:
          api_type: GRPC
          grpc_services:
            envoy_grpc:
              cluster_name: spire_agent

TLS证书的名称是Envoy充当代理服务的SPIFFE ID。

验证上下文(Validation Context)

Envoy使用可信CA证书来验证对等证书。验证上下文提供这些可信CA证书。SPIRE能够为每一个信任域提供验证上下文。

要获取信任域的验证上下文,能够在TLS上下文的SDS配置中配置验证上下文,将验证上下文的名称设置为信任域的SPIFFE ID。

例如:

tls_context:
  common_tls_context:
    validation_context_sds_secret_config:
      name: "spiffe://example.org"
      sds_config:
        api_config_source:
          api_type: GRPC
          grpc_services:
            envoy_grpc:
              cluster_name: spire_agent

SPIFFE和SPIRE专一于促进安全认证做为受权的构建块,而不是受权自己,所以对验证上下文中的受权相关字段(例如verify_subject_alt_name)的支持超出范围。相反,咱们建议你利用Envoy普遍的过滤器框架来执行受权。此外,你能够将Envoy配置为将客户端证书详细信息转发到目标服务,从而容许它执行本身的受权步骤,例如使用嵌入在客户端X.509 SVID的URI SAN中的SPIFFE ID。

试试看!

这就是你使用SPIRE改善服务到服务通讯中的身份验证安全性的方法!尝试一下,让咱们知道你的试用是怎么回事!你能够经过SPIFFE slack与咱们联系。计划进行将来的改进,你的经验对于塑造SPIRE对Envoy的支持很是有价值。

我要感谢Scytale公司本身的Marcos Yacob和Marcos Yedro,他们的努力有助于SPIRE SDS实施的原型设计和开发。


图片描述

KubeCon + CloudNativeCon和Open Source Summit大会日期:

  • 会议日程通告日期:2019 年 4 月 10 日
  • 会议活动举办日期:2019 年 6 月 24 至 26 日

KubeCon + CloudNativeCon和Open Source Summit赞助方案
KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请
KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国
KubeCon + CloudNativeCon和Open Source Summit购票窗口,当即购票!

相关文章
相关标签/搜索