在 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
內容解密:
- microk8s stop:停止 microk8s 叢集的執行。
- ps -ef | grep [k]ube:檢查系統中是否存在殘留的 Kubernetes 程式。
- microk8s start:重新啟動 microk8s 叢集。
- microk8s status:檢視叢集狀態,確認 RBAC 是否已啟用。
步驟二:組態 Linux 使用者的 .kube/config 檔案
接下來,我們需要為特定使用者組態 kubectl 存取叢集的許可權。
# 登入特定使用者帳號
su - k8sreadonly01
# 檢查目前使用者的身份
id
# 嘗試執行 kubectl 命令
microk8s kubectl config current-context
輸出結果顯示該使用者目前沒有足夠的許可權存取 MicroK8s。
內容解密:
- su - k8sreadonly01:切換到- k8sreadonly01使用者。
- id:顯示目前使用者的 UID、GID 等資訊。
- 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
內容解密:
- curl命令:從官方網站下載最新版本的- kubectl。
- chmod 755 kubectl:設定- kubectl檔案的執行許可權。
- ./kubectl version:執行- kubectl並檢查其版本資訊。
步驟四:使用 kubectl 連線 microk8s 叢集
嘗試使用新安裝的 kubectl 連線 microk8s 叢集。
# 嘗試取得 pod 資訊
./kubectl get pods
# 指定 API 伺服器位址
./kubectl get pods --server=https://localhost:16443
執行後會出現認證失敗的錯誤提示。
內容解密:
- ./kubectl get pods:嘗試取得目前叢集中的 Pod 資訊。
- --server=https://localhost:16443:指定 microk8s 的 API 伺服器位址。
驗證與注意事項
- 
RBAC 設定驗證:確認 RBAC 是否正確啟用。 
- 
使用者端組態:正確組態 kubectl使用者端以連線 microk8s 叢集。
- 
許可權管理:確保不同使用者具有正確的存取許可權。 
- 
多叢集管理:研究如何在多個 Kubernetes 叢集間進行 RBAC 設定。 
- 
自動化許可權管理:探討如何使用自動化工具進行許可權管理。 
- 
安全最佳實踐:研究 Kubernetes RBAC 的安全最佳實踐。 
Kubernetes RBAC 設定流程
  graph LR
    A[停止 microk8s] --> B[啟動 microk8s]
    B --> C[檢查 RBAC 狀態]
    C --> D[組態 kubectl 使用者端]
    D --> E[驗證連線]
    E --> F[測試許可權]
圖表翻譯:
此圖表展示了 Kubernetes RBAC 設定流程的主要步驟:
- 停止 microk8s 叢集
- 啟動 microk8s 叢集
- 檢查 RBAC 是否啟用
- 組態獨立的 kubectl 使用者端
- 驗證連線是否成功
- 測試使用者的許可權是否正確
程式碼範例:RBAC 設定 YAML 檔案
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
內容解密:
- apiVersion:指定 Kubernetes API 版本。
- kind:定義資源型別為 Role。
- metadata.name:指定 Role 的名稱。
- 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 檔案,更新以下欄位:
- user欄位(位於- context下)
- name欄位(位於- users下)
- 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
使用具有管理許可權的使用者執行以下指令,為 k8sreadonly01 和 k8sreadonly02 使用者繫結 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 檔案的主要結構,包括叢集資訊、上下文設定和使用者憑證三個主要部分。
安全性考量
- 憑證管理:使用安全的 token 管理機制,避免將敏感資訊暴露在版本控制系統中。
- 最小許可權原則:為使用者分配最小必要許可權,限制不必要的存取。
- 定期更新憑證:定期更新 token 和憑證,確保系統安全性。
效能最佳化
- 組態檔案管理:集中管理 kubeconfig檔案,避免多個版本混淆。
- 許可權稽核:定期稽核使用者許可權,確保符合最小許可權原則。
- 自動化佈署:使用自動化工具佈署和管理 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
#### 內容解密:
- 
使用 mkdir -p建立目錄,若目錄已存在則不會報錯。
- 
microk8s config命令用於生成 Kubernetes 叢集的組態檔案。
- 
使用 sed -i命令直接修改檔案內容,將admin使用者替換為k8sreadonly01,並更新 token。
- 
增強 RBAC 設定:探索更複雜的 RBAC 設定場景,如多角色繫結和自定義角色建立。 
- 
自動化憑證管理:研究使用自動化工具進行憑證和 token 的管理與輪換。 
- 
叢集安全管理:探討 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 使用者許可權
假設 k8sdevops01 和 k8sdevops02 分別屬於不同的業務單元(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 檔案
- 下載 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
- 編輯 ~/.kube/config檔案,更新user和token欄位。
測試驗證:
執行以下命令測試 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、更新組態、重啟叢集和測試許可權等步驟。
參考資料
- Kubernetes 官方檔案:RBAC Authorization
- MicroK8s 檔案:Configuring MicroK8s
- 多租戶環境下的隔離策略:研究如何在多租戶環境下實作更精細的隔離策略,確保不同租戶之間的資源隔離。
- 跨名稱空間的許可權管理:探索如何在不同名稱空間之間進行許可權共用和隔離,以滿足複雜的業務需求。
- 自動化 RBAC 管理:開發自動化工具,簡化 RBAC 規則的管理和佈署流程,提高效率和準確性。
透過不斷最佳化和改進 RBAC 設定,可以進一步提升 Kubernetes 叢集的安全性和可管理性。
 
            