k8s之API Server認證

Liusy01發表於2021-01-10

叢集安全性

在生產環境中,必須保障叢集使用者的角色以及許可權問題,不能給所有使用者都賦予管理員許可權。

1、叢集的安全性必須考慮如下幾個目標

(1)保證容器與其所在宿主機的隔離

(2)限制容器給基礎設定或其他容器帶來的干擾

(3)最小許可權原則:合理限制所有元件的許可權,確保元件只執行它被授權的行為,通過限制單個元件的能力來限制它的許可權範圍

(4)明確元件間邊界的劃分

(5)劃分普通使用者和管理員的角色

(6)在必要時允許將管理員許可權賦給普通使用者

(7)允許擁有Secret(Keys、Certs、Passwords)資料的應用在叢集中執行

API Server認證管理

k8s叢集提供了三種級別的客戶端身份認證方式:

1、HTTPS證照認證

基於CA根證照籤名的的雙向數字認證方式,CA機構是第三方證照權威機構,認證步驟如下圖:

 

1、伺服器端向CA機構申請證照,CA機構下發根證照、服務端證照、私鑰給申請者

2、客戶端向CA機構申請證照,CA機構下發根證照、客戶端證照、私鑰給申請者

3、客戶端向服務端發起請求,服務端下發服務端證照給客戶端,客戶端通過私鑰進行解密,並利用服務端證照中的公鑰認證證照資訊比較證照中的資訊,如果一致,則客戶端認可服務端身份

4、客戶端向服務端傳送證照,服務端使用私鑰進行解密,獲得客戶端證照公鑰,並用公鑰認證證照資訊,確認客戶端是否合法

5、兩端協商好加密方案後,客戶端產生一個隨機金鑰,通過協商好的方案加密該金鑰,併傳送該金鑰給服務端,服務端收到金鑰後,雙方使用這個隨機金鑰進行資訊傳輸。

2、HTTP Token認證

通過一個Token來識別合法使用者,就像HTTP請求的Cookie一樣,只不過Cookie是瀏覽器端,Token是服務端。

 

用一個很長的特殊編碼方式並且難以被模仿的字串--Token,Token對應使用者資訊,儲存在API Server中能訪問的一個資料夾中,客戶端只需在請求時的HTTP Header中放入Token,API Server就可以識別使用者資訊。

3、HTTP Base認證

通過使用者名稱加密碼的方式認證,把(使用者名稱+冒號+密碼)用Base64編碼後放到HTTP Request中的Header Authorization域中發給服務端,服務端收到後進行解密,獲取使用者名稱和密碼,然後進行使用者授權驗證

API Server授權管理

當API Server被呼叫時,需要先進行使用者認證,然後通過授權策略執行使用者授權。

API Server支援以下幾種授權策略(通過API Server啟動引數--authorization-mode設定)

 

(1)AlwaysDeny:拒絕所有請求

(2)AlwaysAllow:允許接收所有請求

(3)ABAC(Attributed-Based Access Control):基於屬性的訪問控制,表示使用使用者配置的授權規則對使用者請求進行匹配和控制

(4)Webhook:通過呼叫外部REST服務對使用者進行授權

(5)RBAC:Role-Based Access Control,基於角色的訪問控制

(6)Node:一種專用模式,用於對kubelet發起的請求進行訪問控制

API Server在接收到請求後,會根據請求中的資料生成一個訪問策略物件,如果請求中不帶某些屬性,則會為這些屬性根據型別設定預設值,然後將這個訪問策略物件和授權策略檔案中的所有訪問策略物件逐條匹配,如果至少一個匹配上,則請求被鑑權通過,否則終止呼叫流程。

===============================

我是Liusy,一個喜歡健身的程式設計師。

歡迎關注微信公眾號【上古偽神】,一起交流Java技術及健身,獲取更多幹貨,領取Java進階乾貨,領取最新大廠面試資料,一起成為Java大神。

來都來了,關注一波再溜唄。

相關文章