k8s認證與授權

2022-01-26 06:16:11 字數 4485 閱讀 8232

認證用於身份鑑別,而授權則實現許可權分派。k8s以外掛程式化的方式實現了這兩種功能,且分別存在多種可用的外掛程式。另外,它還支援准入控制機制,用於補充授權機制以實現更精細的訪問控制功能。

一、訪問控制概述

apiserver作為k8s集群系統的閘道器,是訪問及管理資源物件的唯一入口,餘下所有需要訪問集群資源的元件,包括kube-controller-manager、kube-scheduler、kubelet和kube-proxy等集群基礎元件、coredns等集群的附加元件以及此前使用的kubectl命令等都要經由此閘道器進行集群訪問和管理。這些客戶端均要經由apiserver訪問或改變集群狀態並完成資料儲存,並由它對每一次的訪問請求進行合法性檢驗,包括使用者身份鑑別、操作許可權驗證以及操作是否符合全域性規範的約束等。所有檢查均正常且物件配置資訊合法性檢驗無誤後才能訪問或存入資料於後端儲存系統etcd中。

客戶端認證操作由apiserver配置的一到多個認證外掛程式完成。收到請求後,apiserver依次呼叫為其配置的認證外掛程式來認證客戶端身份,直到其中乙個外掛程式可以識別出請求者的身份為止。授權操作由一到多授權外掛程式進行,它負責確定那些通過認證的使用者是否有許可權執行其發出的資源操作請求,如建立、刪除或修改指定的物件等。隨後,通過授權檢測的使用者所請求的修改相關的操作還要經由一到多個准入控制外掛程式的遍歷檢測。

1、使用者賬戶與使用者組

k8s並不會儲存由認證外掛程式從客戶端請求中提取出的使用者及所屬組的資訊,他們僅僅用於檢測使用者是否有許可權執行其所請求的操作。客戶端訪問api服務的途徑通常有三種:kubectl、客戶端庫或者直接使用rest介面進行請求,而可以執行此類請求的主體也被k8s分為兩類:現實中的人和pod物件,它們的身份分別對應於常規使用者和服務賬號。

useraccount(使用者賬號):一般是指由獨立於k8s之外的其他服務管理的使用者賬號,例如由管理員分發的金鑰、keystore一類的使用者儲存、甚至是包含使用者名稱和密碼列表的檔案等。k8s中不存在表示此類使用者賬號的物件,因此不能被直接新增進k8s系統中。

serviceaccount(服務賬號):是指由k8sapi管理的賬號,用於為pod之中的服務程序在訪問k8sapi時提供身份標識。serviceaccount通常要繫結與特定的命名空間,它們由apiserver建立,或者通過api呼叫手動建立,附帶著一組儲存為secret的用於訪問apiserver的憑據。

useraccount通常用於複雜的業務邏輯管控,它作用於系統全域性,故其名稱必須全域性唯一。相比較來說,serviceaccount隸屬於命名空間,僅用於實現某些特定的操作任務,因此要輕量得多。這兩類賬號都可以隸屬於乙個或多個使用者組。使用者組只是使用者賬號的邏輯集合,它本身並沒有操作許可權,但附加於組上的許可權可由其內部的所有使用者繼承,以實現高效的授權管理機制。

system: unauthenticated:  未能通過任何乙個授權外掛程式檢驗的賬號,即未通過認證測試的使用者所屬的組。

system:authenticated: 認證成功後的使用者自動加入的乙個組,用於快捷引用所有正常通過認證的使用者賬號。

system:serviceaccounts:當前系統上的所有service account物件。

system:serviceaccounts::特定命名空間內所有的serviceaccount物件。

api請求要麼與普通使用者或服務賬戶進行繫結,要麼被視為匿名請求。這意味著集群內部或外部的每個程序,包括由人類使用者使用的kubectl,到節點上的kubelet,再到控制平面的成員元件,必須在向api伺服器發出請求時進行身份驗證,否則即被視為匿名使用者。

2、認證、授權與准入控制基礎

api server處理請求的過程中,認證外掛程式負責鑑定使用者身份,授權外掛程式用於操作許可權許可鑑別,而准入控制則用於在資源物件的建立、刪除、更新或連線操作時實現更精細的許可檢查。

kubernetes使用身份驗證外掛程式對api請求進行身份驗證,支援的認證方式包括客戶端證書、承載令牌、身份驗證**或http basic認證等。api server接收到訪問請求時,它將呼叫認證外掛程式嘗試將以下屬性與訪問請求相關聯。

username: 使用者名稱,如kubernetes-admin等。

uid:使用者的數字標籤符,用於確保使用者身份的唯一性。

groups:使用者所屬組,用於許可權指派和繼承

extra:鍵值資料型別的字串,用於提供認證時需要用到的額外資訊。

api server支援同時啟用多種認證機制,但至少應該分別為service account和user account各自啟用乙個認證外掛程式。同時啟用多種認證機制時,認證過程會以序列的方式進行,直到一種認證機制成功完成即結束。若認證失敗,則伺服器會響應401狀態碼,反之,請求者就會被識別為某個具體的使用者,並且隨後的操作都將以此使用者身份來進行。

認證用於身份鑑別,而授權則實現許可權分派。k8s以外掛程式化的方式實現了這兩種功能,且分別存在多種可用的外掛程式。另外,它還支援准入控制機制,用於補充授權機制以實現更精細的訪問控制功能。

一、訪問控制概述

apiserver作為k8s集群系統的閘道器,是訪問及管理資源物件的唯一入口,餘下所有需要訪問集群資源的元件,包括kube-controller-manager、kube-scheduler、kubelet和kube-proxy等集群基礎元件、coredns等集群的附加元件以及此前使用的kubectl命令等都要經由此閘道器進行集群訪問和管理。這些客戶端均要經由apiserver訪問或改變集群狀態並完成資料儲存,並由它對每一次的訪問請求進行合法性檢驗,包括使用者身份鑑別、操作許可權驗證以及操作是否符合全域性規範的約束等。所有檢查均正常且物件配置資訊合法性檢驗無誤後才能訪問或存入資料於後端儲存系統etcd中。

客戶端認證操作由apiserver配置的一到多個認證外掛程式完成。收到請求後,apiserver依次呼叫為其配置的認證外掛程式來認證客戶端身份,直到其中乙個外掛程式可以識別出請求者的身份為止。授權操作由一到多授權外掛程式進行,它負責確定那些通過認證的使用者是否有許可權執行其發出的資源操作請求,如建立、刪除或修改指定的物件等。隨後,通過授權檢測的使用者所請求的修改相關的操作還要經由一到多個准入控制外掛程式的遍歷檢測。

1、使用者賬戶與使用者組

k8s並不會儲存由認證外掛程式從客戶端請求中提取出的使用者及所屬組的資訊,他們僅僅用於檢測使用者是否有許可權執行其所請求的操作。客戶端訪問api服務的途徑通常有三種:kubectl、客戶端庫或者直接使用rest介面進行請求,而可以執行此類請求的主體也被k8s分為兩類:現實中的人和pod物件,它們的身份分別對應於常規使用者和服務賬號。

useraccount(使用者賬號):一般是指由獨立於k8s之外的其他服務管理的使用者賬號,例如由管理員分發的金鑰、keystore一類的使用者儲存、甚至是包含使用者名稱和密碼列表的檔案等。k8s中不存在表示此類使用者賬號的物件,因此不能被直接新增進k8s系統中。

serviceaccount(服務賬號):是指由k8sapi管理的賬號,用於為pod之中的服務程序在訪問k8sapi時提供身份標識。serviceaccount通常要繫結與特定的命名空間,它們由apiserver建立,或者通過api呼叫手動建立,附帶著一組儲存為secret的用於訪問apiserver的憑據。

useraccount通常用於複雜的業務邏輯管控,它作用於系統全域性,故其名稱必須全域性唯一。相比較來說,serviceaccount隸屬於命名空間,僅用於實現某些特定的操作任務,因此要輕量得多。這兩類賬號都可以隸屬於乙個或多個使用者組。使用者組只是使用者賬號的邏輯集合,它本身並沒有操作許可權,但附加於組上的許可權可由其內部的所有使用者繼承,以實現高效的授權管理機制。

system: unauthenticated:  未能通過任何乙個授權外掛程式檢驗的賬號,即未通過認證測試的使用者所屬的組。

system:authenticated: 認證成功後的使用者自動加入的乙個組,用於快捷引用所有正常通過認證的使用者賬號。

system:serviceaccounts:當前系統上的所有service account物件。

system:serviceaccounts::特定命名空間內所有的serviceaccount物件。

api請求要麼與普通使用者或服務賬戶進行繫結,要麼被視為匿名請求。這意味著集群內部或外部的每個程序,包括由人類使用者使用的kubectl,到節點上的kubelet,再到控制平面的成員元件,必須在向api伺服器發出請求時進行身份驗證,否則即被視為匿名使用者。

2、認證、授權與准入控制基礎

api server處理請求的過程中,認證外掛程式負責鑑定使用者身份,授權外掛程式用於操作許可權許可鑑別,而准入控制則用於在資源物件的建立、刪除、更新或連線操作時實現更精細的許可檢查。

kubernetes使用身份驗證外掛程式對api請求進行身份驗證,支援的認證方式包括客戶端證書、承載令牌、身份驗證**或http basic認證等。api server接收到訪問請求時,它將呼叫認證外掛程式嘗試將以下屬性與訪問請求相關聯。

username: 使用者名稱,如kubernetes-admin等。

uid:使用者的數字標籤符,用於確保使用者身份的唯一性。

groups:使用者所屬組,用於許可權指派和繼承

extra:鍵值資料型別的字串,用於提供認證時需要用到的額外資訊。

api server支援同時啟用多種認證機制,但至少應該分別為service account和user account各自啟用乙個認證外掛程式。同時啟用多種認證機制時,認證過程會以序列的方式進行,直到一種認證機制成功完成即結束。若認證失敗,則伺服器會響應401狀態碼,反之,請求者就會被識別為某個具體的使用者,並且隨後的操作都將以此使用者身份來進行。

k8s新建使用者並授權

在k8s中也有使用者和組的概念,只是不如openshift那麼清晰與好操作。但是原理基本上可以套用,畢竟openshift可以看作是k8s的封裝發行版,可參考openshift使用者與許可權思維導圖。新建乙個k8s使用者大概可以分為以下幾步 具體操作 umask 077 openssl genrsa...

K8S建立使用者RBAC授權

root k8s186 rbac vim usertest csr.json names 證書生成 export kube apiserver 設定集群引數 設定客戶端認證引數 設定上下文引數 kubectl config set context kubernetes cluster kuberne...

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...