在 Kubernetes 環境中,RBAC 是不可或缺的安全機制,用於精細化控管使用者對叢集資源的存取許可權。本文將引導讀者如何在 Microk8s 叢集中設定和驗證 RBAC,確保不同角色的使用者擁有正確的存取許可權。文章將逐步講解如何操作 kubectl 命令、設定 kubeconfig 檔案,以及如何建立和應用 RoleBinding,並搭配實際案例和測試驗證,幫助讀者理解 RBAC 的運作機制。同時,也會探討一些進階議題,例如多租戶環境下的隔離策略和自動化 RBAC 管理,以提升 Kubernetes 叢集的安全性及可管理性。

Kubernetes RBAC 設定與驗證

在進行 Kubernetes RBAC(Role-Based Access Control)設定時,我們需要確保正確組態叢集存取許可權,並驗證使用者角色是否生效。本文將探討如何在 microk8s 環境中進行相關設定與驗證。

步驟一:停止與啟動 microk8s 叢集

首先,我們需要停止並重新啟動 microk8s 叢集,以確保相關設定生效。

# 停止 microk8s 叢集
microk8s stop

# 驗證 microk8s 程式是否已停止
ps -ef | grep [k]ube

# 啟動 microk8s 叢集
microk8s start

# 檢查 microk8s 狀態
microk8s status

內容解密:

  1. microk8s stop:停止 microk8s 叢集的執行。
  2. ps -ef | grep [k]ube:檢查系統中是否存在殘留的 Kubernetes 程式。
  3. microk8s start:重新啟動 microk8s 叢集。
  4. microk8s status:檢視叢集狀態,確認 RBAC 是否已啟用。

步驟二:組態 Linux 使用者的 .kube/config 檔案

接下來,我們需要為特定使用者組態 kubectl 存取叢集的許可權。

# 登入特定使用者帳號
su - k8sreadonly01

# 檢查目前使用者的身份
id

# 嘗試執行 kubectl 命令
microk8s kubectl config current-context

輸出結果顯示該使用者目前沒有足夠的許可權存取 MicroK8s。

內容解密:

  1. su - k8sreadonly01:切換到 k8sreadonly01 使用者。
  2. id:顯示目前使用者的 UID、GID 等資訊。
  3. microk8s kubectl config current-context:嘗試顯示目前的 Kubernetes 環境上下文。

步驟三:安裝獨立的 kubectl 客戶端

由於內建的 microk8s kubectl 需要額外的群組許可權,我們選擇安裝獨立的 kubectl 客戶端。

# 下載並安裝 kubectl 二進位制檔案
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# 賦予執行許可權
chmod 755 kubectl

# 執行 kubectl 版本檢查
./kubectl version

內容解密:

  1. curl 命令:從官方網站下載最新版本的 kubectl
  2. chmod 755 kubectl:設定 kubectl 檔案的執行許可權。
  3. ./kubectl version:執行 kubectl 並檢查其版本資訊。

步驟四:使用 kubectl 連線 microk8s 叢集

嘗試使用新安裝的 kubectl 連線 microk8s 叢集。

# 嘗試取得 pod 資訊
./kubectl get pods

# 指定 API 伺服器位址
./kubectl get pods --server=https://localhost:16443

執行後會出現認證失敗的錯誤提示。

內容解密:

  1. ./kubectl get pods:嘗試取得目前叢集中的 Pod 資訊。
  2. --server=https://localhost:16443:指定 microk8s 的 API 伺服器位址。

驗證與注意事項

  1. RBAC 設定驗證:確認 RBAC 是否正確啟用。

  2. 使用者端組態:正確組態 kubectl 使用者端以連線 microk8s 叢集。

  3. 許可權管理:確保不同使用者具有正確的存取許可權。

  4. 多叢集管理:研究如何在多個 Kubernetes 叢集間進行 RBAC 設定。

  5. 自動化許可權管理:探討如何使用自動化工具進行許可權管理。

  6. 安全最佳實踐:研究 Kubernetes RBAC 的安全最佳實踐。

Kubernetes RBAC 設定流程

  graph LR
    A[停止 microk8s] --> B[啟動 microk8s]
    B --> C[檢查 RBAC 狀態]
    C --> D[組態 kubectl 使用者端]
    D --> E[驗證連線]
    E --> F[測試許可權]

圖表翻譯:

此圖表展示了 Kubernetes RBAC 設定流程的主要步驟:

  1. 停止 microk8s 叢集
  2. 啟動 microk8s 叢集
  3. 檢查 RBAC 是否啟用
  4. 組態獨立的 kubectl 使用者端
  5. 驗證連線是否成功
  6. 測試使用者的許可權是否正確

程式碼範例:RBAC 設定 YAML 檔案

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

內容解密:

  1. apiVersion:指定 Kubernetes API 版本。
  2. kind:定義資源型別為 Role。
  3. metadata.name:指定 Role 的名稱。
  4. rules:定義 Role 的許可權規則。

Kubernetes RBAC 設定與驗證完整

Kubernetes 設定檔的建立與自訂

在 Kubernetes 中,正確組態 kubeconfig 檔案對於使用者身份驗證和叢集存取至關重要。本章節將詳細介紹如何為特定使用者建立和自訂 kubeconfig 檔案。

建立 .kube 目錄

首先,我們需要為使用者 k8sreadonly01 建立 .kube 目錄,用於存放 Kubernetes 設定檔。執行以下指令:

mkdir ~/.kube

生成叢集組態檔案

使用具有管理許可權的使用者(如 k8sadmin01)生成叢集組態檔案:

microk8s config > /tmp/config

檢視生成的組態檔案內容:

cat /tmp/config

輸出範例:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREekNDQWZlZ0F3SUJBZ0lVWmd4TXlNS2JJOHJLcVgyeUdCVSt<SNIP>YkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    server: https://192.168.0.81:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: admin
  name: microk8s
current-context: microk8s
kind: Config
preferences: {}
users:
- name: admin
  user:
    token: UUtu<SNIP>Zz0K

自訂 kubeconfig 檔案

將生成的組態檔案複製到 k8sreadonly01 使用者的 .kube 目錄:

cp /tmp/config .kube/config

編輯 .kube/config 檔案,更新以下欄位:

  1. user 欄位(位於 context 下)
  2. name 欄位(位於 users 下)
  3. token 欄位(位於 users 下的 user 中)

更新後的檔案範例:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREekNDQWZlZ0F3SUJBZ0lVQzZubUZ5ZWxWUy94V2N2NnMxTG5<SNIP>TGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    server: https://192.168.0.81:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: k8sreadonly01
  name: microk8s
current-context: microk8s
kind: Config
preferences: {}
users:
- name: k8sreadonly01
  user:
    token: Dw<K8sreadonly01年的Token>rf

驗證組態變更

使用 diff 命令對比變更前後的組態檔案差異:

diff -y config_before config_after

測試 kubeconfig 組態

使用更新後的 kubeconfig 檔案嘗試取得 Pod 資訊:

./kubectl get pods

預期輸出錯誤訊息:

Error from server (Forbidden): pods is forbidden: User "k8sreadonly01" cannot list resource "pods" in API group "" in the namespace "default"

這個錯誤表示使用者已成功驗證,但尚無許可權存取資源。

角色繫結(RoleBinding)設定

建立 ClusterRoleBinding

使用具有管理許可權的使用者執行以下指令,為 k8sreadonly01k8sreadonly02 使用者繫結 view 角色:

microk8s kubectl create clusterrolebinding crole-k8sreadonly --clusterrole view --user k8sreadonly01 --user k8sreadonly02

預期輸出:

clusterrolebinding.rbac.authorization.k8s.io/crole-k8sreadonly created

驗證許可權設定

再次執行取得 Pod 資訊的指令:

./kubectl get pods

這次應該能夠成功取得 Pod 資訊,證明 k8sreadonly01 使用者已具備只讀許可權。

技術解析與最佳實踐

kubeconfig 檔案結構解析

  graph LR
    A[kubeconfig 檔案] --> B[clusters]
    A --> C[contexts]
    A --> D[users]
    B --> E[cluster 資訊]
    C --> F[context 設定]
    D --> G[使用者憑證]

圖表翻譯: 此圖表展示了 kubeconfig 檔案的主要結構,包括叢集資訊、上下文設定和使用者憑證三個主要部分。

安全性考量

  1. 憑證管理:使用安全的 token 管理機制,避免將敏感資訊暴露在版本控制系統中。
  2. 最小許可權原則:為使用者分配最小必要許可權,限制不必要的存取。
  3. 定期更新憑證:定期更新 token 和憑證,確保系統安全性。

效能最佳化

  1. 組態檔案管理:集中管理 kubeconfig 檔案,避免多個版本混淆。
  2. 許可權稽核:定期稽核使用者許可權,確保符合最小許可權原則。
  3. 自動化佈署:使用自動化工具佈署和管理 kubeconfig 檔案。
程式碼範例詳解

以下是一個用於生成 kubeconfig 檔案的指令碼範例:

#!/bin/bash

# 建立 .kube 目錄
mkdir -p ~/.kube

# 生成 kubeconfig 檔案
microk8s config > /tmp/kubeconfig

# 複製 kubeconfig 到正確位置
cp /tmp/kubeconfig ~/.kube/config

# 編輯 kubeconfig 檔案
sed -i 's/admin/k8sreadonly01/g' ~/.kube/config
sed -i 's/原token/新token/g' ~/.kube/config

#### 內容解密:

  1. 使用 mkdir -p 建立目錄,若目錄已存在則不會報錯。

  2. microk8s config 命令用於生成 Kubernetes 叢集的組態檔案。

  3. 使用 sed -i 命令直接修改檔案內容,將 admin 使用者替換為 k8sreadonly01,並更新 token。

  4. 增強 RBAC 設定:探索更複雜的 RBAC 設定場景,如多角色繫結和自定義角色建立。

  5. 自動化憑證管理:研究使用自動化工具進行憑證和 token 的管理與輪換。

  6. 叢集安全管理:探討 Kubernetes 叢集的安全管理最佳實踐,包括網路策略和日誌稽核等。

透過遵循本,您將能夠建立一個安全、可靠的 Kubernetes 使用者管理機制,為您的容器化應用提供堅實的基礎。

Kubernetes RBAC 設定與測試

在 Kubernetes 中,根據角色的存取控制(RBAC)是一種重要的安全機制,用於管理使用者對叢集資源的存取許可權。本文將探討如何為不同使用者設定 RBAC 規則,並進行詳細的測試驗證。

Step 5: 測試使用者許可權

首先,我們以只讀使用者 k8sreadonly01 為例,進行許可權測試。執行以下命令取得 Pod 資訊:

./kubectl get pods

結果分析:

NAME                        READY   STATUS             RESTARTS   AGE
mydeployment-55bb4df494-tp4vw   1/1   Running            1 (104m ago)   44h
dep-webserver-7d7459d5d7-5z8qb   0/1   ImagePullBackOff   0          44h

內容解密:

此命令成功取得了 Pod 的資訊,證明 k8sreadonly01 使用者具有讀取許可權。

接下來,嘗試執行刪除 Pod 的操作:

./kubectl delete pod dep-webserver-7d7459d5d7-5z8qb

結果分析:

Error from server (Forbidden): pods "dep-webserver-7d7459d5d7-5z8qb" is forbidden: 
User "k8sreadonly01" cannot delete resource "pods" in API group "" in the namespace "default"

內容解密:

由於 k8sreadonly01 使用者僅具有讀取許可權,因此刪除操作被禁止,符合預期結果。

設定 DevOps 使用者許可權

假設 k8sdevops01k8sdevops02 分別屬於不同的業務單元(BU01 和 BU02),我們需要為他們在各自的名稱空間內授予完整操作許可權。

步驟1:生成使用者 Token

dd if=/dev/urandom bs=48 count=1 2> /dev/null | base64 -i | cut -b1-61 | tee k8sdevops01-token.txt
dd if=/dev/urandom bs=48 count=1 2> /dev/null | base64 -i | cut -b1-61 | tee k8sdevops02-token.txt

內容解密:

使用 dd 命令生成隨機 Token,並儲存到檔案中。這些 Token 將用於使用者身份驗證。

步驟2:將 Token 新增到已知 Token 檔案

echo "生成的Token,k8sdevops01,edit" >> /var/snap/microk8s/current/credentials/known_tokens.csv
echo "生成的Token,k8sdevops02,edit" >> /var/snap/microk8s/current/credentials/known_tokens.csv

內容解密:

將生成的 Token 新增到 known_tokens.csv 檔案中,並賦予 edit 角色,允許使用者進行資源的建立、讀取、更新和刪除操作。

步驟3:重啟 Kubernetes 叢集

microk8s stop; sleep 30; microk8s start; sleep 30; microk8s status

內容解密:

重啟叢集使新的 Token 生效。sleep 命令用於確保叢集有足夠時間完成啟動和停止操作。

步驟4:設定使用者的 .kube/config 檔案

  1. 下載 kubectl 二進位制檔案:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod 755 kubectl
mkdir .kube
cp /tmp/config .kube/config
  1. 編輯 ~/.kube/config 檔案,更新 usertoken 欄位。

測試驗證:

執行以下命令測試 kubectl 是否組態正確:

./kubectl get pods

結果分析:

Error from server (Forbidden): pods is forbidden: User "k8sdevops01" cannot list resource "pods" in API group "" in the namespace "default"

內容解密:

由於尚未為 k8sdevops01 使用者授予任何許可權,因此操作被禁止。這是預期的結果。

圖表說明

  graph LR
A[開始] --> B[生成Token]
B --> C[新增Token到已知檔案]
C --> D[重啟叢集]
D --> E[設定使用者Config檔案]
E --> F[測試使用者許可權]

圖表翻譯:

此圖示展示了為 DevOps 使用者設定 RBAC 許可權的流程,包括生成 Token、更新組態、重啟叢集和測試許可權等步驟。

參考資料

  1. 多租戶環境下的隔離策略:研究如何在多租戶環境下實作更精細的隔離策略,確保不同租戶之間的資源隔離。
  2. 跨名稱空間的許可權管理:探索如何在不同名稱空間之間進行許可權共用和隔離,以滿足複雜的業務需求。
  3. 自動化 RBAC 管理:開發自動化工具,簡化 RBAC 規則的管理和佈署流程,提高效率和準確性。

透過不斷最佳化和改進 RBAC 設定,可以進一步提升 Kubernetes 叢集的安全性和可管理性。