智匯華雲 深入理解Istio中的證書管理

2021-10-21 00:13:23 字數 3425 閱讀 2553

istio是由google、ibm、lyft聯合開發的開源專案,它是一款微服務管理框架,也被稱為第二代微服務service mesh代表。istio的架構思想類似軟體定義網路,近年來隨著技術的不斷發展,istio因其輕量級、服務網格管理理念、相容各大容器編排平台等優勢在近兩年脫穎而出。本期智匯華雲將為大家詳細描述 istio 中證書簽發和管理的整個流程以及涉及到的元件。

一、概述

本文會詳細描述 istio 中證書簽發和管理的整個流程以及涉及到的元件,假設讀者已經有一些技術儲備,對於 istio 中的基本概念和使用比較熟悉。

上圖是 istio 內部在簽發證書時的流程和相關的元件。

主要的流程如下:

1. 當envoy程序在與其它envoy程序互動時,發現需要進行tls認證,它會從靜態配置檔案或者動態配置伺服器獲取證書的名稱等相關資訊,這時envoy程序就會通過sds api向pilot agent中的sds server發起請求獲取證書。

2. sds server收到請求後,會首先讀取本地的serviceaccount token,路徑為

/var/run/secrets/kubernetes.io/serviceaccount/token,然後從token中解析出namespace和serviceaccount等資訊,再用這些資訊生成私鑰和證書簽名請求檔案。接下來使用證書簽名請求檔案作為引數,向istiod發起申請證書簽名的請求。

3. istiod中的ca server收到請求後會對其中的憑證進行驗證,通過後會對根據請求對證書進行簽名、生成證書,並將簽名後的數字證書傳送給sds server。

4. sds server將私鑰和從ca server處獲得的證書一起通過sds api傳送給envoy。

5. 以上過程會周期性地重複執行以便實現證書的輪換。

二、ca server

istio內部的ca server用來提供證書簽名服務。內部會管理4個證書,都會掛載到/etc/cacerts/目錄下。

這些證書有兩種方式來建立:

1. 自動生成,這種被稱為自簽名證書,這是預設的方式。

2. 使用者手動建立,即手動插入已存在的ca證書。可以在部署istiod前使用已存在的證書在istio-system中建立名為cacerts的secret,然後istio部署的時候會自動使用這個secret中的證書,具體可以參考istio官方手冊 plugging in existing ca certificates。

有2個函式可以用來處理pilot agent傳送過來的csr請求。createcertificate()和handlecsr(),其中第二個被標記為過時的。

位於istio-system中,用來持久化儲存自簽名的ca私鑰和ca證書,其它欄位都為空,只由istiod使用,與pilot agent沒有關係。

每個namespace中都會有乙個,用於儲存根證書,會掛載到pilot agent的/var/run/secrets/istio目錄。

位於istio-system中,用來儲存根證書。之前使用在nodeagent中,目前nodeagent已經整合到pilot agent中,根證書改為從istio-ca-root-cert configmap中獲取,目前**有注釋說明保留這個只是為了向前相容,**中並沒有實際使用,以後會從**中完全移除。

會掛載到istiod的/etc/cacerts目錄,使用者可以手動通過現有證書建立這個secret,然後再部署istio,這樣istio就可以使用使用者指定的證書。

三、sds server

pilot agent中的sds server與istiod內部的ca server進行通訊時,雙方都需要有乙個根證書,根據配置的不同,這個根證書有幾種不同的獲取方式,對應的型別名稱為分別為istiod、kubernetes和custom。

下面來看一下注入的sidecar的模板檔案。

可以看出在部署的時候是通過pilotcertprovider這個引數來控制的,預設值是istiod,在模板檔案中會將這個引數的值設定到環境變數pilot_cert_provider中。當這個值是istiod的情況下,會將istio-ca-root-cert這個configmap掛載到/var/run/secrets/istio目錄中。

四、資料面證書

資料面證書是指envoy與envoy通訊時需要的證書,這些證書是envoy通過向pilot agent中的sds server發起sds請求獲取的,而sds server內部獲取這些證書的方式其實有兩種:

1. sds server內部生成私鑰和證書簽名請求檔案,然後再向istiod內部的ca server發起簽名請求,最後將簽名後的證書和私鑰一起傳送給envoy。這就是前文中一直提到的情況,也是預設值。

2. sds server讀取掛載的靜態證書檔案。下面來看一下注入的sidecar的模板檔案:

如果是這種手動插入證書的方式,則sds server會將使用者配置的證書直接返回給envoy,而不是像前一種情況那樣本地生成私鑰和證書簽名請求然後向ca server申請簽名。

五、控制面認證

istiod中的ca server和pilot agent中的sds server通訊時,需要互相認證對方的身份。

sds server對ca server認證的方式是標準的tls認證,即ca server啟動時會配置相應的證書,在互動前進行認證時,會將證書傳送給sds server,後者對其進行驗證。

ca server對sds server的認證有不止一種方式。

第一種方式使用客戶端證書認證進行認證,實際上這時並不會進行真正的認證,只是在當前已經通過證書認證的前提下,從證書中提取出一些物件來供後續使用。

另外需要注意的是這些認證方式如果啟用多個的話,只要其中有乙個認證通過,就會被認為是總體認證通過。

六、參考

深入理解python中的None

在python中判斷乙個物件是否為空時,我曾經這樣寫 list iflist is not none print list is s list else print list is null 列印結果為 is 從上面的例子可以看出list為空應該列印的是 list is null 但是實際的結果不是...

深入理解lua中的 和

在研究cocos2d lua引擎原始碼的時候,看到framework cc components component.lua中有這段 function component exportmethods methods self.exportedmethods methods local target ...

深入理解 Android 中的 Matrix

在 android 開發中,矩陣是乙個功能強大並且應用廣泛的神器,例如 用它來製作動畫效果 改變大小 給加各類濾鏡等。對於矩陣,android 官方 sdk 為我們提供了乙個強大的類 matrix 還有 colormatrix 是一直困擾著我的問題,雖然大致能夠呼叫相應的 api 但卻一直 get ...