Kubernetes API訪問鑑權之Basic模式
Kubernetes 支援多種模式的 API 訪問鑑權方式。包括私鑰 + 證書模式,Basic 使用者名稱密碼模式,Bearer Token 模式等。其中最常用的是基於 ServiceAccount 的私鑰 + 證書模式。不過另外兩種模式也在支援範疇,所以我們也瞭解一下,方便特殊場景下的使用。
Basic 使用者鑑權
首先,我們在 API 服務端的 /etc/kubernetes/
目錄下新建一個 users.csv
檔案,內容如下:
[root@ksnode1 kubernetes]# cat users.csv
pass123,jemy,1007,"developer"
然後在 APIServer 的啟動命令列選項中加入選項
--basic-auth-file=/etc/kubernetes/users.csv
我們在叢集外的一個客戶端設定下訪問叢集的 Basic 賬號資訊,主要需要使用者名稱,密碼,叢集 ca 證書以及叢集的 API Server 服務地址。
$ kubectl config set-credentials jemy --username jemy --password pass123
User "jemy" set.
$ kubectl config set-cluster k8s-learning --server https://10.8.1.72:6444 --certificate-authority /etc/kubernetes/pki/env-jxx/ca.pem
$ kubectl config set-context k8s-learning-ctx --cluster k8s-learning --user jemy
$ kubectl config use-context k8s-learning-ctx
然後,我們嘗試直接訪問 nodes 命令,會發現報錯如下:
$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "jemy" cannot list nodes at the cluster scope
這種錯誤表示許可權驗證通過了但是沒有任何的許可權。如果是許可權驗證不通過,報錯如下:
$ kubectl get nodes
error: You must be logged in to the server (Unauthorized)
上面的這個問題主要是由 K8S 的訪問許可權管理模式決定的。K8S 的資源訪問許可權的基本處理流程分為三步:
- Authentication 許可權驗證,簡單來說就是檢查所使用的 API 的使用者許可權是否存在,比如使用者名稱密碼是否正確,就是一個登陸許可權而已
- Authorization 授權驗證,簡單來說就是檢查這個使用者許可權是否擁有操作 K8S 資源的許可權,對哪些資源有操作許可權,只要存在一個資源的操作許可權正確,就允許通過
- Admission Control 准入控制,簡單來說就是檢查這個使用者對這些資源的具體操作許可權是否合法,存在一個不合法則全部拒絕操作
為了讓這個使用者能夠訪問叢集資源,我們給這個普通的使用者 jemy 授權一個系統內建的 ClusterRole:cluster-admin
$ kubectl create clusterrolebinding cluster-admin-for-jemy --clusterrole cluster-admin --user jemy
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-for-jemy created
然後再執行上面的 kubectl get nodes
即可發現節點。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.8.1.75 Ready <none> 23d v1.11.0
10.8.1.76 Ready <none> 23d v1.11.0
我們使用 kubectl get clusterrole cluster-admin -o yaml
看下這個內建的 cluster-admin 定義:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
creationTimestamp: 2018-08-27T01:31:58Z
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: cluster-admin
resourceVersion: "43"
selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/cluster-admin
uid: fd9b31a4-a998-11e8-811b-569fbff0044d
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
- nonResourceURLs:
- '*'
verbs:
- '*'
這個 ClusterRole 裡面定義了所有資源的訪問,配置等操作許可權。
為了瞭解許可權控制,我們可以建立一個自己的 ClusterRole,只允許讀取節點和列舉節點資訊。
先把剛剛的 ClusterRoleBinding 刪除
$ kubectl delete clusterrolebinding cluster-admin-for-jemy
然後先建立我們自己的 ClusterRole
$ kubectl create clusterrole my-cluster-admin --resource nodes --verb 'get,list'
clusterrole.rbac.authorization.k8s.io/my-cluster-admin created
重新建立繫結
$ kubectl create clusterrolebinding cluster-admin-for-jemy --clusterrole my-cluster-admin --user jemy
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-for-jemy created
讀取某個節點資訊,對應 get 操作
$ kubectl get nodes 10.8.1.75
NAME STATUS ROLES AGE VERSION
10.8.1.75 Ready <none> 23d v1.11.0
獲取節點的列表,對應 list 操作
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.8.1.75 Ready <none> 23d v1.11.0
10.8.1.76 Ready <none> 23d v1.11.0
如果獲取其他的資源比如 Pods,就會失敗
$ kubectl get pods
Error from server (Forbidden): pods is forbidden: User "jemy" cannot list pods in the namespace "default"
在上面的例子中,基本介紹了普通使用者在 K8S 中的使用方法,這裡有個小的問題,如果我們改變這個使用者名稱字,需要同步叢集和客戶端的哪些資訊呢?
- 改變 /etc/kubernetes/users.csv 中的使用者名稱 jemy 為 jemygraw,並 scp 到各個 API Server 的節點
- 重啟 APIServer 伺服器
- 修改客戶端~/.kube/config 裡面定義 users 的地方,把裡面的 username 改為 jemygraw
- 在叢集中使用 kubectl edit clusterrolebinding cluster-admin-for-jemy,把裡面定義 subjects 的地方 kind:User 的節點裡面的 name 改為 jemygraw 即可
- 然後客戶端使用 kubectl get nodes 就可以了
這個過程可以自行驗證下,順便再熟悉下上面的操作流程。
參考文件:https://kubernetes.io/docs/reference/access-authn-authz/authentication/
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 【Gin-API系列】Gin中介軟體之鑑權訪問(五)API
- Kubernetes:kube-apiserver 之鑑權APIServer
- Laravel Passport 之api登入鑑權LaravelPassportAPI
- kubernetes之使用http rest api訪問叢集HTTPRESTAPI
- kubernetes使用http rest api訪問叢集之使用postman工具訪問 apiserverHTTPRESTAPIPostmanServer
- API 鑑權新姿勢 – 簽名鑑權API
- API 鑑權新姿勢 - 簽名鑑權API
- kubernetes實戰篇之通過api-server訪問dashboardAPIServer
- kubernetes實戰篇之Dashboard的訪問許可權限制訪問許可權
- Python使用 Kubernetes API 訪問叢集PythonAPI
- Solon rpc 之 SocketD 協議 - 訊息鑑權模式RPC協議模式
- Nginx訪問控制_登陸許可權的控制(http_auth_basic_module)NginxHTTP
- JAVA設計模式之訪問者模式Java設計模式
- PHP設計模式之訪問者模式PHP設計模式
- 使用Docker部署Nacos 2.3.2開啟鑑權後無法訪問控制檯Docker
- 設計模式學習之訪問者模式設計模式
- 【趣味設計模式系列】之【訪問者模式】設計模式
- C#設計模式之訪問者模式C#設計模式
- 23種設計模式之訪問者模式設計模式
- 15.java設計模式之訪問者模式Java設計模式
- Java Web之Struts2訪問Servlet APIJavaWebServletAPI
- kubernetes實踐之十六:RBAC 角色訪問控制
- Kubernetes學習筆記(七):訪問Pod後設資料與Kubernetes API筆記API
- PHP介面HTTP安全認證之Basic模式PHPHTTP模式
- 認證鑑權與API許可權控制在微服務架構中的設計與實現:授權碼模式API微服務架構模式
- JAVA設計模式之 訪問者模式【Visitor Pattern】Java設計模式
- 在kubernetes 叢集內訪問k8s API服務K8SAPI
- kubernetes 原始碼安裝1.18.3 (8)授權 apiserver 訪問 kubelet原始碼APIServer
- 深入理解k8s中的訪問控制(認證、鑑權、審計)流程K8S
- 訪問者模式模式
- Android理解設計模式之組合模式、迭代器模式、訪問者模式Android設計模式
- 透過API訪問HDFSAPI
- JBOSS未授權訪問
- 行為模式-訪問者模式模式
- 設計模式:訪問者模式設計模式
- 從零開始學YC-Framework之鑑權Framework
- 採坑之Android手機訪問相簿許可權問題Android
- vue元件級鑑權Vue元件