使用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購票窗口,當即購票!

相關文章
相關標籤/搜索