TLS使用指南(一):如何在Rancher 2.x中進行TLS termination?
引 言
這是一個系列文章,我們將在本系列中探索Rancher使用TLS證書的不同方式。TLS,安全傳輸層協議,是用於保護網路通訊的加密協議。它是目前已經棄用的安全套接層(SSL)的繼任者。
你可以從本系列中瞭解TLS如何整合到各種Rancher元件中以及如何準備環境以正確利用Rancher中的TLS。
為什麼安全傳輸層協議(TLS)很重要?
Rancher在任何地方都可以使用TLS。因此,在安裝Rancher之前,確定TLS終止選項十分重要。
1、 確認你想要執行的TLS終止型別,有以下幾種型別:
自簽名,由Rancher終止(這是預設的)
Let’s Encrypt,由Rancher終止
自帶證書,由Rancher終止
外部TLS終止
2、 如果你選擇了自帶證書或外部TLS終止,那麼請確保你有用於註冊證書的CA證書的副本(僅需cert,不需要金鑰)。Rancher在執行操作時需要這一檔案。
3、 確保你知道Rancher要使用的主機名。這在安裝之後不可更改。
建議你通過閱讀文件來了解更多的細節:
https://docs.rancher.cn/
什麼元件需要安全傳輸層協議
對於任何企業軟體來說,你都需要在安裝和使用之前確定特定的要求,包括儲存要求、網路、在雲端還是本地等等。在進行安裝之前,你必須得明確回答這些問題。
對於Rancher來說,考慮因素之一是TLS。必須瞭解並計劃使用Rancher進行TLS的方法,如此才能獲得能夠充分支援並且擁有良好功能的解決方案。
除了HTTPS安全之外,還有其他兩個地方也十分需要TLS:
1、 kubectl
2、 節點和叢集agent通訊
注意,並不止以上兩個地方會使用到TLS,只是上述兩個地方更為常見。
理解kubectl TLS
首先,我們來看一下示例kubeconfig檔案:
apiVersion: v1
kind: Config
clusters:
\- name: "sample"
cluster:
server: "https://rancher.example.org/k8s/clusters/c-1234"
certificate-authority-data: "LS0t..."
特別注意certificate-authority-data
kube-apiserver
時提供的TLS證書。
為什麼這個如此重要呢?因為kubectl使用certificate-authority-data
來確保是你(而不是冒名頂替者)正在連線到正確的叢集。如果伺服器提供的證書尚未由certificate-authority-data
中的證書籤名,那麼kubectl會警告你並且退出。基本上,你不會遭受MITM(中間人)攻擊。
certificate-authority-data
中的值來自kube-ca
的CA證書(非Rancher叢集或使用授權叢集端點的Rancher叢集),或者是Rancher CA證書(任意Rancher叢集)。
請務必在此欄位中輸入正確的值,否則kubectl不會驗證與你的Kubernetes叢集的連線。這就是為什麼在設定Rancher時需要正確配置TLS。
理解節點和叢集Agent通訊
在任意Rancher連線的叢集(包括匯入的或其他方式)中,需要部署兩個工作負載:
1、cattle-cluster-agent
Deployment
2、cattle-node-agent
Deployment
每個工作負載執行一個特定的功能。總之,這兩個agent連線到Rancher的API並在tcp/443上建立安全的websocket連線。然後,該websocket連線會用於Rancher與託管的節點或叢集之間的雙向通訊。
叢集agent連線到託管叢集的Kubernetes API,這使Rancher可以通過websocket隧道執行API操作。當執行叢集操作時(如升級、ectd快照等),節點agent將與RKE叢集中的節點進行互動。
這兩個agent都使用稱為“CA checksum
”的配置值,該配置值將作為環境變數以CATTLE\_CA\_CHECKSUM
的形式傳遞給Pod。該值需要與kubectl相同——確保連線到正確的端點並方式MITM的發生。但是,校驗和的工作原理略有不同。
cattle agent的CA checksum可以厭憎agent是否連線到Rancher API的正確例項。由於Rancher使用TLS保護其HTTPS API端點,因此agent容器可以使用此校驗和來驗證API端點提供的TLS證書是否正確。
其次,CATTLE\_CA\_CHECKSUM
未配置為CA證書的base64編碼副本。相反,Rancher會生成CA證書的sha256
校驗和,該證書用於簽署Rancher TLS證書,並將該值放入CATTLE\_CA\_CHECKSUM
欄位中。結果如下:
CATTLE\_CA\_CHECKSUM=b0af09b35ef086fcfc21e990fbd750720abe5c811dbea3ae40fe050a67f0bdb0e
當一個Rancher叢集或節點agent呼叫Rancher API,它會將CA證書與其在Deployment和DaemonSet中配置的那一個進行比較。如果它們匹配,通訊則會建立起來。
安全傳輸層協議(TLS)終止(termination)
當安裝Rancher時有以下4種主要方式來終止TLS:
使用Rancher的自簽名證書
使用Let’s Encrypt
自帶證書
外部TLS終止
每種方法都有特定的要求,需要在具體操作中進行權衡。
使用Rancher的自簽名證書
在終止TLS的四個選項中,這個可能是最簡單的。在HA和單節點安裝方案中,這也是Rancher的預設選項。也就是說,通過不將任何TLS特定的引數傳遞給helm install
或docker run
,來進行安裝。
安裝後,Rancher會生成一個CA證書(CN=cattle-ca
),並且使用該證書為其自身證書籤名。根據你執行的安裝型別,自簽名證書的工作方式會有所不同。
單節點安裝
容器啟動後,設定前,Rancher在443埠上響應任意HTTPS請求,無論其目標Host值如何。這是如何成為可能的呢?
在這一狀態下,Rancher會為你到達的任何主機名自動生成一個證書。如果是一個IP(如10.11.12.13
),那麼Rancher會為該IP生成一個自簽名(使用cattle-ca
)證書。如果是以一個主機名(如my-rancher.example.org
)到達此新的Rancher安裝目錄,同樣也會以相同的方式生成一個自簽名證書。
在Rancher使用單個證書之前,你需要完成設定步驟(設定管理員密碼並確認Rancher主機名)。該證書對於在Rancher初始設定期間配置的主機名有效。
HA安裝
在HA安裝場景下,自簽名證書需要你安裝一個名為cert-manager
的應用程式。與單節點Rancher管理CA證書本身不同,HA rancher使用cert-manager
來處理證書的生命週期。你可以根據以下指引將cert-manager安裝到你準備好的Kubernetes叢集中:
https://rancher.com/docs/rancher/v2.x/en/installation/k8s-install/helm-rancher/
一旦你完成cert-manager的安裝,下一步是安裝rancher。使用自簽名證書是Rancher的預設設定,所以執行helm install時實際上只有一個強制性引數:
--set hostname=<YOUR.DNS.NAME>
該引數是強制性的,因為Rancher HA安裝不具有與單節點安裝相同的即時證書生成功能。因此,一旦你設定了主機名,該主機名將用於Rancher安裝的整個生命週期。所以你必須確保你的設定是正確的。
然後cert-manager將會生成一個證書,該證書作為一個secret儲存在cattle-system
名稱空間中,名為tls-rancher-ingress
。
本文就到此結束啦,本系列的第二篇文章將會為大家介紹其他型別的TLS終止選項