天天看點

Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

系列文章目錄

文章目錄

  • ​​系列文章目錄​​
  • ​​前言​​
  • ​​一、預設的kubernetes-admin具有所有權限​​
  • ​​1.1 檢視config裡面的user​​
  • ​​1.2 如何檢視使用者屬于哪個使用者組​​
  • ​​1.3 檢視使用者組所綁定的role/clusterrole​​
  • ​​二、自定義的kubernetes-admin具有所有權限​​
  • ​​總結​​

前言

k8s有的時候權限不夠,可以檢視一個使用者具有哪些權限

一、預設的kubernetes-admin具有所有權限

1.1 檢視config裡面的user

凡是使用kubeadm安裝起來的k8s叢集,在叢集外使用fabric8連接配接,可以擁有對所有的資源resource進行所有的操作verb的權限,這是因為fabric8加載了 /root/.kube/config 檔案,這個檔案如下:

Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

這個檔案包括三個部分,分别是 叢集cluster、使用者user,以及将叢集和使用者綁定起來的上下文context,我們現在就看這個user,名稱name為 kubernetes-admin。

這個使用者下沒有綁定任何的role,如下:

Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

是以,這個使用者一定要是綁定在某個使用者組下面,然後這個使用者組綁定role,是以這個使用者才有對k8s資源的操作權限的。

user需要對k8s資源有操作權限,兩種方式:

(1) user綁定role

(2) user綁定userGroup,然後這個userGroup綁定role.

Kubernetes 有着以下幾個内建的用于特殊使用者組userGroup,如下:

system:unauthenticated :未能通過任何一個授權插件檢驗的賬号,即未通過認證測 試的使用者所屬的組 。

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

system : serviceaccounts :目前系統上的所有 Service Account 對象。

1.2 如何檢視使用者屬于哪個使用者組

無法檢視一個使用者組下面有哪些使用者,但是可以檢視一個使用者屬于哪個使用者組

兩種方法:

方式1:執行 cd /etc/kubernetes/pki ,然後檢視 xxx.crt 檔案

openssl x509 -in cbmljs.crt -noout -text      

方式2:檢視 kubectl 依賴的 config 檔案(需要安裝上python3和pyyaml)

cat /root/.kube/config | python3 -c 'import yaml, sys; print(yaml.safe_load(sys.stdin)["users"][0]["user"]["client-certificate-data"])'|base64 -d| openssl x509 -noout -text      

| 左邊表示輸入,右邊表示輸出

cat /root/.kube/config

​​

​python -c 'import yaml, sys; print(yaml.load(sys.stdin)["users"][0]["user"]["client-certificate-data"])'​

​​ 提取裡面一點

base64 -d

openssl x509 -noout -text 輸出

這裡選擇方式2,因為在 pki 目錄下面沒有找到 kubernetes-admin 使用者對應的 .crt 檔案,是以隻能通過 /root/.kube/config 檔案檢視了(或者 /etc/kubernetes/admin.conf 檔案),如下:

先給linux k8s主節點所在的linux機器安裝python3,然後安裝上 pyyaml 這個module,如下:

pip3 isntall pyyaml      
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

執行 檢視 /root/.kube/config 檔案,可以看到 kubernetes-admin 關聯的使用者組是 system:masters

Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

Subject中O(organization)的值代表使用者組,CN (common name)代表使用者名

1.3 檢視使用者組所綁定的role/clusterrole

檢視 哪個 rolebinding 或者 clusterrolebinding 綁定了這個 使用者組 system:masters

kubectl get clusterrolebinding -o wide -A | grep system:masters      
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

可以看到 有一個名為 cluster-admin 的clusterrolebinding,綁定了一個名為 cluster-admin的 clusterrole 和一個名為 system:masters的使用者或使用者組。

接下來,檢視這個 名為 cluster-admin 的clusterrole 有哪些全年

kubectl get clusterrole cluster-admin -o yaml      
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

是以,解釋了為什麼fabric8使用 /root/.kube/config 這個檔案,就可以操作整個k8s的所有資源,因為這個 config 檔案裡面的kubernetes-admin使用者,屬于 system:masters 使用者組,同時這個使用者組又綁定了 cluster-admin 這個 clusterrole,而 cluster-admin 這個clusterrole,擁有對所有 apiGroups 下任何類型的資源resource 的任何操作verb 的權限。

小結:預設使用者 kubernetes-admin 在使用者組 system:masters 裡面,可以任意操作k8s的資源。

二、自定義的kubernetes-admin具有所有權限

筆者自己在 12.168.100.151 這個機器上建立 cbmljs 使用者,要想看一下這個使用者具有哪些權限

方式1:/etc/kubernetes/pki 目錄下 crt 檔案

方式2:使用pki目錄下的三個檔案,為 cbmlijs 生成的 config 檔案

先看方式1,如下

cd /etc/kubernetes/pki
openssl x509 -in cbmljs.crt -noout -text      
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)
kubectl get clusterrolebinding -o wide -A | grep cbmljs
kubectl get rolebinding -o wide -A | grep cbmljs
kubectl get clusterrolebinding -o wide -A | grep k8s
kubectl get rolebinding -o wide -A | grep k8s
kubectl get clusterrole cluster-reader -o yaml
kubectl get role pods-reader -o yaml      
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)
Kubernetes_18_檢視一個使用者具有哪些權限(RBAC實踐類)

cat /home/cbmljs/.kube/config | python3 -c ‘import yaml, sys; print(yaml.safe_load(sys.stdin)[“users”][0][“user”][“client-certificate-data”])’|base64 -d| openssl x509 -noout -text

總結