kubernetes實踐之七:安全機制API Server認證之Service Account Token

百聯達發表於2018-03-21
一:前言
Kubernetes有User Account和Service Account兩套獨立的賬號系統。
1.User Account是給人用的,Service Account 是給Pod 裡的程式使用的,面向的物件不同。
2.User Account是全域性性的,Service Account 是屬於某個具體的Namespace
3.User Account是與後端的使用者資料庫同步的。

二:Kubernetes API Server簡介

Kubernetes API Server通過一個名為kube-apiserver的程式提供服務,該程式執行在Master節點上。在預設情況下,kube-apiserver程式在本機的8080埠(--insecure-port)提供REST服務。我們可以同時啟動HTTPS安全埠(--secure=6443)來啟動安全機制,加強REST API訪問的安全性。

通常我們使用kubectl來與Kubernetes API Server互動,它們之間的介面是REST呼叫。也可以使用curl命令列工具進行快速驗證。




另外是通過程式設計的方式呼叫Kubernetes API Server 具體又細分為以下兩種場景:

1.     執行在POD裡的程式呼叫Server API. Pod中的程式如何指定API Server的訪問地址呢?答案很簡單,因為Kubernetes API Server本身也是一個Service,它的名字是“kubernetes,IP地址是ClusterIP地址池裡面的第一個地址。服務埠是HTTPS443.



2.       開發基於Kubernetes的管理平臺,比如呼叫Kubernetes API來完成Pod,Service,RC等資源物件的圖形化建立和管理介面。可採用社群中相關的Client Library.

正常情況下,為了確保Kubernetes叢集的安全,API Server都會對客戶端進行身份認證,認證失敗則無法呼叫API。此外,Pod中訪問Kubernetes API Server服務的時候,是以Service方式訪問服務名為kubernetes的這個服務,而kubernetes服務又只在HTTPS 443上提供服務,那麼如何進行身份認證呢? 答案是 Service Account Token.


三: Service  Account

如果kubernetes開啟了ServiceAccount(–admission_control=…,ServiceAccount,… )那麼會在每個namespace下面都會建立一個預設的default的ServiceAccount。



每個ServiceAccount下面都會擁有一個加密過的secret作為Token. 該token也叫service-account-token,該token才是真正在API Server驗證(authentication)環節起作用的。



當使用者在該namespace下建立pod的時候都會預設使用這個service account,下面是get pod 擷取的部分,可以看到kubernetes會把預設的service account掛載到容器內。


檢視一下secret的具體內容

上面的內容是經過base64加密過後的。可以看到ca.crt(這個是API Server的CA公鑰證書,用於Pod中的Process對API Server的服務端數字證書進行校驗時使用的),namespace和token被放到了容器內,這樣容器就可以通過https的請求訪問apiserver了。

四:

API Server的service account驗證過程

以kube-system namespace下的“default” service account為例,Pod的usrname全稱為:system:serviceaccount:kube-system:default。有了username,那麼credentials呢?就是上面提到的service-account-token中的token。API Server的驗證環節支援多種身份校驗方式:CA 證書認證、Token 認證、Base 認證。一旦API Server發現client發起的request使用的是service account token的方式,API Server就會自動採用signed bearer token方式進行身份校驗。而request就會使用攜帶的service account token參與驗證。該token是API Server在建立service account時用API server啟動引數:–service-account-key-file的值簽署(sign)生成的。如果–service-account-key-file未傳入任何值,那麼將預設使用–tls-private-key-file的值,即API Server的私鑰。



五:

Secret

Kubernetes提供了Secret來處理敏感資訊,目前Secret的型別有3種: 

1.Opaque(default): 任意字串 
2.kubernetes.io/service-account-token: 作用於ServiceAccount,就是上面說的。 
3.kubernetes.io/dockercfg: 作用於Docker registry,使用者下載docker映象認證使用。

每個Namespace下有一個名為default的預設的Service Account物件,這個Service Account裡面有一個名為Tokens的可以當作Volume一樣被Mount到Podcast裡的Secret,當Pod 啟動時,這個Secret會自動被Mount到Pod的指定目錄下,用來協助完成Pod中的程式訪問API Server時的身份鑑權過程。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2152085/,如需轉載,請註明出處,否則將追究法律責任。

相關文章