k8s 除了會驗證連線到叢集的身分以外,還可以針對資源(如 pod)的存取進行授權管理。
今天會介紹 k8s 中資源的授權方式:
Node authorization 是一種專門對 kubelet 發出 API 請求進行授權管理的授權方式,例如:kubelet 向 API Server 發出請求以存取 services、pod 或 node 等資訊、kubelet 將當前 node 狀態回報給 API Server。
授權 kubelet 執行的 API 操作:
Node 透過憑證去識別 kubelet 的群組 system:nodes
及名稱 system:node:<nodeName>
。
修改 /etc/kubernetes/manifests/kube-apiserver.yaml
內的 -authorization-mode
flag 新增 Node
認證,存檔後再重新啟動 kube-apiserver 程序。
...
spec:
containers:
- command:
- /bin/sh
- -c
- exec /usr/local/bin/kube-apiserver --v=2
...
--authorization-mode=Node,RBAC,Webhook # 以逗號區隔不同認證機制
...
將屬性 group 起來授權給使用者的一種授權方式,使用者可以是個人或群組。
{
"apiVersion":"abac.authorization.kubernetes.io/v1beta1",
"kind":"Policy",
"spec":{
"user":"alice",
"namespace":"*",
"resource":"*",
"apiGroup":"*"
}
}
{
"apiVersion":"abac.authorization.kubernetes.io/v1beta1",
"kind":"Policy",
"spec":{
"user":"kubelet",
"namespace":"*",
"resource":"pods",
"readonly":true
}
}
實際在使用時,是將 policy 寫成一個檔案,例如: abac-policies.jsonl
,如下所示。
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
// 每一行是一個 Policy
修改 /etc/kubernetes/manifests/kube-apiserver.yaml
內的 -authorization-mode
flag 新增 ABAC
認證,在參數中指定 policy 檔案 --authorization-policy-file=abac-policies.jsonl
,儲存後再重新啟動 kube-apiserver 程序。
...
spec:
containers:
- command:
- /bin/sh
- -c
- exec /usr/local/bin/kube-apiserver --v=2
...
--authorization-mode=ABAC
--authorization-policy-file=abac-policies.jsonl
...
因 policy 及屬性會隨著時間持續增加,長期下會造成管理上的困難。
以角色來當作權限賦予的個體,定義一個角色擁有的權限,賦予給使用者、群組或服務帳戶以限制相關人員的存取。
例如:建立一個 Dev 開發者 Role,賦予該角色 view
、create
、delete
pod 的權限,再將是開發的使用者都賦予這個 Dev 開發者角色,讓使用者擁有 pods 的操作權限。
使用方式:
kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
或是修改 /etc/kubernetes/manifests/kube-apiserver.yaml
內的 -authorization-mode
flag 來設定。
...
spec:
containers:
- command:
- /bin/sh
- -c
- exec /usr/local/bin/kube-apiserver --v=2
...
--authorization-mode=Node,RBAC,Webhook
...
將授權的工作委由外部服務處理。即在請求授權時透過外部服務查詢該使用者或 service 是否具有權限,例如:使用 RESTful HTTP 向第三方服務請求查詢權限。
資源的權限由第三方服務來管理及更新,服務例如 Open Policy Agent (OPA),是一個輕量的政策管理服務。
一樣是在 /etc/kubernetes/manifests/kube-apiserver.yaml
內的 -authorization-mode
flag 新增 Webhook
認證,以及使用參數 --authorization-webhook-config-file=/etc/gcp_authz.config
指定設定檔。
...
spec:
containers:
- command:
- /bin/sh
- -c
- exec /usr/local/bin/kube-apiserver --v=2
...
--authorization-webhook-config-file=/etc/gcp_authz.config
--authorization-mode=Node,RBAC,Webhook
...
k8s 允許資源使用一種以上的授權方式來確保叢集的安全。
在 kube-apiserver.yaml
中指定使用 Node、RBAC、Webhook 三種授權 --authorization-mode=Node,RBAC,Webhook
,授權請求會依序由左至右進行認證,先認證 Node、若 Node 認證被拒絕則再往右 RBAC 進行認證,直到其中一個授權成功。若所有都拒絕,該請求將被拒絕。
RBAC 提供標準的授權管理方式讓管理者方便控管,下篇會深入探討 RBAC 授權方式。