K8S基本操作-39-K8S 的使用者與權限
我們是否能在 K8S 建立使用者
並非直接建立,而是採用 x509 建立使用者鑰匙後建立。
K8S 的權限種類
Node
例如每個 Worker Node 都擁有一個權限身份,設置在 kubelet 用來存取 Kube API。
ABAC (屬性基礎權限控制 Attribute-Based Access Control)
基於屬性的權限身分。
-
屬性:屬性是描述資源、請求和用戶特徵的鍵值對。例如,資源屬性可以包括資源類型、資源名稱、資源命名空間等;請求屬性可以包括請求方法、請求 URL 等;用戶屬性可以包括用戶名稱、用戶角色、用戶組等。
-
策略:策略是定義訪問控制規則的集合。策略通常由以下幾個部分組成:
-
效果:效果可以是允許或拒絕。
-
資源:資源是策略所適用的資源類型。
-
屬性:屬性是策略所使用的屬性。
-
角色:角色是將策略綁定到用戶的集合。
以下為範例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Policy
metadata:
name: allow-pods-in-default-namespace
spec:
allow:
- effect: Allow
resources:
- pods
namespaces:
- default
users:
- system:serviceaccount:default:default
RBAC (角色基礎權限控制 Role-Based Access Control)
Role-Based Access Control (RBAC) 是一種基於角色的訪問控制模型。在 RBAC 模型中,訪問控制決策是根據用戶的角色來進行的。
- 角色:角色是一組權限的集合。
- 角色綁定:角色綁定是將角色綁定到用戶或組的集合。
這種權限控制要建立兩個 YAML , 一個是定義角色,一個是把角色綁定在某特定用戶上。
範例1
設置一個管理員角色:
rbac-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: admin
rules:
- apiGroups:
- "*"
resources:
- "*"
verbs:
- "*"
綁定 admin 在用戶 Peter 上
rbac-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: admin-binding
subjects:
- kind: User
name: peter
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: admin
使用以下指令:
kubectl create -f rbac-role.yaml
kubectl create -f rbac-rolebinding.yaml
範例2
建立一個可以查看 Pod 的角色:
rbac-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: view-pods
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
然後賦予到 Jane 身上
rbac-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: view-pods-binding
subjects:
- kind: User
name: jane
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: view-pods
範例3
dev-user 使用者綁定於 developer 角色,可以對 Pod 進行操作,可以建立 ConfigMap 。
developer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list", "get", "create", "update", "delete"]
- apiGroups: [""]
resources: ["ConfigMap"]
verbs: ["create"]
devuser-developer-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devuser-developer-binding
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
範例4
建議一個只能對名為 blue 或者 orange 的 Pod 進行更新的角色 developer:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", “create“, “update“]
resourceNames: [“blue“, “orange”]
Webhook
委託第三方支持 Webhook 的系統進行權限驗證,如: Open Policy Agent。
https://www.openpolicyagent.org/
K8S API Server 負責允許權限種類
K8S API Server 啟動時,需要決定要開啟哪些授權方式,例如以下範例:
ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${INTERNAL_IP} \\
--allow-privileged=true \\
--apiserver-count=3 \\
--authorization-mode=NODE,RBAC,WEBHOOK \\
--bind-address=0.0.0.0 \\
--enable-swagger-ui=true \\
--etcd-cafile=/var/lib/kubernetes/ca.pem \\
--etcd-certfile=/var/lib/kubernetes/apiserver-etcd-client.crt \\
--etcd-keyfile=/var/lib/kubernetes/apiserver-etcd-client.key \\
--etcd-servers=https://127.0.0.1:2379 \\
--event-ttl=1h \\
--kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \\
--kubelet-client-certificate=/var/lib/kubernetes/apiserver-etcd-client.crt \\
--kubelet-client-key=/var/lib/kubernetes/apiserver-etcd-client.key \\
--service-node-port-range=30000-32767 \\
--client-ca-file=/var/lib/kubernetes/ca.pem \\
--tls-cert-file=/var/lib/kubernetes/apiserver.crt \\
--tls-private-key-file=/var/lib/kubernetes/apiserver.key \\
--v=2
其中這一段:
--authorization-mode=NODE,RBAC,WEBHOOK
這代表一個使用者 Node 驗證失敗後,會進行 RBAC 驗證,最後是 WEBHOOK。
角色有關的命令行
取得角色列表:
kubectl get roles
取得角色綁定:
kubectl get rolebindings
描述一個角色:
kubectl describe role <角色名稱>
描述角色綁定:
kubectl describe rolebinding <角色綁定名稱>
確認角色是否能存取某個資源
例如:檢查自己是否能建立 deployments:
kubectl auth can-i create deployments
輸出:
yes
這代表可以。
詢問 dev-user 用戶是否建立 deployments:
kubectl auth can-i create deployments --as dev-user
輸出:
no