作者: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提供最新服务标识的有用步骤。
SPIRE(SPIFFE运行时环境)是一个工具链,用于在各种平台上建立软件系统之间的信任。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购票窗口,立即购票!