做者: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提供最新服務標識的有用步驟。安全
SPIRE(SPIFFE運行時環境)是一個工具鏈,用於在各類平臺上創建軟件系統之間的信任。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中設置SDS支持就像在SPIRE代理配置中設置enable_sds = true配置值同樣簡單。
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大會日期:
KubeCon + CloudNativeCon和Open Source Summit贊助方案
KubeCon + CloudNativeCon和Open Source Summit多元化獎學金現正接受申請
KubeCon + CloudNativeCon和Open Source Summit即將首次合體落地中國
KubeCon + CloudNativeCon和Open Source Summit購票窗口,當即購票!