作者:Andrew Harding

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

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

背景

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

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

短暂的秘密是安全的一个重要方面,因为它们减少了对撤销列表基础设施的需求,这削弱了安全性并导致攻击面增加。旋转短寿命秘密经常涉及手动审计和部署,并且通常对操作员来说非常麻烦。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可以动态提供服务标识。听起来很棒!

这个怎样运作

当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购票窗口,立即购票!


Donald
110 声望394 粉丝

布道者,Linux基金会(LFAPAC)