iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 16

Day16. 什麼身分,做什麼事,沒說的就是不行!

  • 分享至 

  • xImage
  •  

🦏 以憑證(certificates)作為安全性管控,可以讓我們判斷來源者為何,是否可以進行存取,而當通關驗證後,並不代表能為所欲為,需看該身分被授予了什麼權限(Authorization),像是同樣能走進大樓,住戶能開大門與自家門,不能隨意闖入別人家,而管理員則能走進管理室。K8s當中API 請求的授權發生於api-server當中,根據內外部的各項資訊決定是否有權限能執行該事項

授權 AUTHORIZATION

授權設定於API-SERVER的authorization mode,若有多項設定的話,依序做檢驗,預設為AlwaysAllow,機制如下:

  1. Node: Node Authorizer,基於pod分配,授予kubelet所需的權限,憑證名稱屬於system:node:<node_name>, 並且group屬於SYSTEM:NODE
  2. ABAC (attribute-based access control configurations): 建立policy檔案,控管policy和user,每次更新都需重啟api-server,難以控管
  3. RBAC (role-based access controls): 將權限統一管控在角色(role), 而使用者(user)與角色相連結,若有異動權限,更改角色即可,權限像是有檢視、建立、修改檔案等,此模式下,使用rbac.authorization.k8s.io API去驅動授權決定,透過API能動態設置權限政策
  4. Webhook: 外包授權,為同步(synchronous)的請求,需等到遠端服務回應,如:open policy agent
  5. AlwaysAllow: 完全允許
  6. AlwaysDeny: 完全拒絕

RBAC

此種授權方式涉及4種object:Role、ClusterRole、RoleBinding及ClusterRoleBinding

Role與ClusterRole包含一連串的權限,說明可以做的事情,由於K8s的以namespace或非namespaced分類,因此作以下區分

  • 角色(Role): 綁定命名空間(namespace)
  • 叢集角色(ClusterRole): 不綁定命名空間,跟角色同道理,只是應用範圍主要在叢集範圍cluster wide,可以針對namespaced resources建立角色,變成能跨命名空間存取資源

建立role object

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
# 指定作用的API group
- apiGroups: [""]
  resources: ["pods"]
  # 執行動作及細項名稱
  verbs: ["list", "get", "create", "update", "delete"]
  resourceNames: ["blue", "orange"]
- apiGroups: [""]
  resources: ["ConfigMap"]
  verbs: ["create"]

Cluster Roles

可以透過指令查看資源是否為namespacedkubectl api-resources --namespaced=true/false

  • namespaced: pods, replicasets, jobs, deployments, services, secrets, roles, rolebindings, configmaps...
  • cluster scoped: nodes, PV, PVC, clusterroles, clusterrolebindings, certificatesigningrequests, namespaces...

建立ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-administrator
rules:
- apiGroups: [""]
  resources: [“nodes"]
  verbs: ["list“, "get", “create“, “delete"]

role與clusterRole指令

# 列出roles
kubectl get roles
# 計算有多少role
kubectl get roles --no-headers | wc -l
# 列出詳細詳細資訊
kubectl describe role <name>
# 確認權限 can-i <action>
kubectl auth can-i create deployments
# 確認權限: 以特定身分執行,管理員可查,指定命名空間 --namespace <name>
kubectl --as qa-user create deployments
# 查看authorizations, 看檔案或process
cat /etc/kubernetes/manifests/kube-apiserver.yaml
ps -aux | grep authorization
# 建立角色: 帶入動作及資源參數
kubectl create role <name> --verb=list,create,delete --resource=pods
# 編輯角色
kubectl edit role <name> -n <namespace>
# 計算有多少clusterroles
kubectl get clusterroles --no-headers | wc -l
# 列出詳細詳細資訊
kubectl describe clusterroles
# 建立clusterrole: 帶入動作及資源參數
kubectl create clusterrole <name> --verb=get,list,watch --resource=nodes
# 列出resource的簡稱, 版本, kind, namespaced
kubectl api-resources

上一篇
Day15. 讓責任 更加輕鬆之CSR 管理與限定範圍
下一篇
Day17. 獲取頭銜(binding),打開世界的大門
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言