iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
DevOps

第一次參賽就學 Kubernetes系列 第 25

[Day 25] Authentication

  • 分享至 

  • xImage
  •  

k8s 除了會驗證連線到叢集的身分以外,還可以針對資源(如 pod)的存取進行授權管理。

今天會介紹 k8s 中資源的授權方式:

  1. Node
  2. Attribute Based Access Control (ABAC)
  3. Role Based Access Control (RBAC)
  4. Webhook

Node

Node authorization 是一種專門對 kubelet 發出 API 請求進行授權管理的授權方式,例如:kubelet 向 API Server 發出請求以存取 services、pod 或 node 等資訊、kubelet 將當前 node 狀態回報給 API Server。

授權 kubelet 執行的 API 操作:

  • 讀取操作(向 API Server 存取資訊):services、endpoints、nodes、pods、secrets 與 configmaps 等資源。
  • 寫入操作(回報資訊給 API Server):nodes 與 nodes 的狀態、pods 與 pods 的狀態、Event。

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 # 以逗號區隔不同認證機制
      ...

Attribute-based access control (ABAC)

將屬性 group 起來授權給使用者的一種授權方式,使用者可以是個人或群組。

範例

  • 賦予 alice 對所有資源可以做任何操作。
{
   "apiVersion":"abac.authorization.kubernetes.io/v1beta1",
   "kind":"Policy",
   "spec":{
      "user":"alice",
      "namespace":"*",
      "resource":"*",
      "apiGroup":"*"
   }
}
  • kubelet 可以讀取所有 pod。
{
   "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 及屬性會隨著時間持續增加,長期下會造成管理上的困難。

Role-based access control (RBAC)

以角色來當作權限賦予的個體,定義一個角色擁有的權限,賦予給使用者、群組或服務帳戶以限制相關人員的存取。

例如:建立一個 Dev 開發者 Role,賦予該角色 viewcreatedelete 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
	  ...

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 授權方式。


參考來源

  1. Kubernetes - Using Node Authorization
  2. Certified Kubernetes Administrator (CKA) with Practice Tests
  3. Kubernetes: Authorization Part1-Authorization Modes Overview

上一篇
[Day 24] Package Manager - Helm
下一篇
[Day 26] Authentication - Role Based Access Control (RBAC)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言