Skip to content

antony@notes:~/kubernetes$ cat "Create-a-normal-user-with-Client-certificate-in-Kubernetes.md"

Create a normal user with Client certificate in Kubernetes

2025-02-27· kubernetes

Create a normal user with Client certificate in Kubernetes

Step1: 生成私鑰

openssl genrsa -out user2.key 2048
  • 功能:使用 OpenSSL 工具生成一個 2048 位元的 RSA 私鑰,並將其保存到文件 user2.key 中。
  • 參數說明
    • genrsa:OpenSSL 的子命令,用於生成 RSA 私鑰。
    • -out user2.key:指定輸出文件名稱為 user2.key
    • 2048:指定私鑰的位元長度為 2048 位,這是當前推薦的安全標準,提供足夠的加密強度。
  • 作用:私鑰是用戶身份認證的基礎,用於後續生成證書簽名請求(CSR)和與簽署的證書配對進行身份驗證。

2. 生成證書簽名請求(CSR)

openssl req -new -key user2.key -out user2.csr -subj "/CN=user2/O=group1/O=group2"
  • 功能:使用私鑰 user2.key 生成一個新的證書簽名請求(CSR),並將其保存到文件 user2.csr 中。
  • 參數說明
    • req -new:OpenSSL 的子命令,表示生成新的證書簽名請求。
    • -key user2.key:指定用於生成 CSR 的私鑰文件。
    • -out user2.csr:指定輸出 CSR 文件名稱為 user2.csr
    • -subj "/CN=user2/O=group1/O=group2":指定 CSR 的主題(Subject),其中:
      • CN=user2:Common Name(通用名稱),在 Kubernetes 中用作用戶名稱。
      • O=group1O=group2:Organization(組織),在 Kubernetes 中表示用戶所屬的組,用於基於角色的訪問控制(RBAC)。
  • 作用:CSR 包含用戶的公鑰和身份信息(如用戶名和組),後續將提交給 Kubernetes 集群的證書頒發機構(CA)進行簽署。

3. 創建並提交 CSR 到 Kubernetes 集群

kubectl apply -f - <<EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: user2
spec:
  request: $(cat user2.csr | base64 | tr -d '\n')
  usages: ['digital signature', 'key encipherment', 'client auth']
  signerName: kubernetes.io/kube-apiserver-client
EOF
  • 功能:通過 kubectl apply 命令創建一個 CertificateSigningRequest (CSR) 資源,並將其提交到 Kubernetes 集群。
  • 參數說明
    • kubectl apply -f -:從標準輸入(這裡使用 heredoc <<EOF)應用資源定義。
    • apiVersion: certificates.k8s.io/v1:指定 Kubernetes API 版本為 v1,適用於 Kubernetes v1.19 及以上版本。
    • kind: CertificateSigningRequest:指定資源類型為 CSR。
    • metadata.name: user2:CSR 的名稱為 user2
    • spec.request:包含 Base64 編碼的 CSR 內容,通過命令 (cat user2.csr | base64 | tr -d '\n') 將 CSR 文件轉換為一行 Base64 字符串。
    • spec.usages:指定證書的用途,包括:
      • 'digital signature':用於數據簽名。
      • 'key encipherment':用於加密密鑰。
      • 'client auth':用於客戶端身份驗證,這是 Kubernetes 用戶認證的主要用途。
    • spec.signerName: kubernetes.io/kube-apiserver-client:指定簽署者為 Kubernetes 內置的 kube-apiserver-client,用於生成客戶端證書。
  • 作用:將 CSR 提交到 Kubernetes 集群,等待管理員批准並由集群的 CA 簽署。

4. 批准 CSR

kubectl certificate approve user2
  • 功能:批准名為 user2 的 CSR,使其可以被集群的證書簽署者簽署。
  • 參數說明
    • kubectl certificate approve:Kubernetes 命令,用於批准指定的 CSR。
    • user2:要批准的 CSR 名稱。
  • 作用:批准後,Kubernetes 集群的 CA 會自動簽署該 CSR,生成證書並將其存儲在 CSR 資源的 status.certificate 字段中。

5. 獲取並保存簽署的證書

kubectl get csr user2 -o jsonpath='{.status.certificate}' | base64 --decode > user2.crt
  • 功能:從 CSR 資源中提取經 CA 簽署的證書,解碼後保存到文件 user2.crt 中。
  • 參數說明
    • kubectl get csr user2 -o jsonpath='{.status.certificate}':從名為 user2 的 CSR 中獲取 status.certificate 字段,該字段包含 Base64 編碼的證書。
    • base64 --decode:將 Base64 編碼的證書解碼為 PEM 格式。
    • > user2.crt:將解碼後的證書保存到文件 user2.crt 中。
  • 作用:獲取由 Kubernetes CA 簽署的證書,該證書與 user2.key 配對,用於認證用戶身份。

6. 設定 kubectl 的用戶憑證

kubectl config set-credentials user2 --client-key user2.key --client-certificate user2.crt --embed-certs
  • 功能:在 kubectl 的配置文件(默認為 ~/.kube/config)中添加名為 user2 的用戶憑證。
  • 參數說明
    • kubectl config set-credentials user2:創建或更新名為 user2 的用戶憑證。
    • --client-key user2.key:指定私鑰文件 user2.key
    • --client-certificate user2.crt:指定證書文件 user2.crt
    • --embed-certs:將私鑰和證書的內容內嵌到配置文件中,而不是僅引用文件路徑,便於集中管理。
  • 作用:配置 kubectl 以使用 user2 的私鑰和證書進行身份驗證。

7. 設定 kubectl 的上下文

kubectl config set-context user2 --cluster single --user user2
  • 功能:創建一個名為 user2 的上下文,關聯到集群 single 和用戶 user2
  • 參數說明
    • kubectl config set-context user2:創建或更新名為 user2 的上下文。
    • --cluster single:指定集群名稱為 single(需確保該集群已在 ~/.kube/config 中定義)。
    • --user user2:指定用戶為 user2
  • 作用:上下文定義了如何連接特定集群並使用哪個用戶的憑證。創建後,可通過 kubectl config use-context user2 切換到此上下文。

8. 獲取節點列表

kubectl get nodes
  • 功能:列出 Kubernetes 集群中的所有節點。
  • 參數說明
    • kubectl get nodes:顯示集群中節點的名稱、狀態、角色等信息。
  • 作用:這是一個測試命令,用於驗證 user2 的憑證是否正確配置並有權訪問集群。如果成功執行,表示認證和上下文配置有效;否則,可能需要檢查用戶的 RBAC 權限。

總結

上述命令完成了一個完整的用戶認證配置流程:

  1. 生成私鑰:創建用戶 user2 的 RSA 私鑰。
  2. 生成 CSR:使用私鑰生成證書簽名請求,包含用戶身份信息。
  3. 提交 CSR:將 CSR 提交到 Kubernetes 集群。
  4. 批准 CSR:管理員批准 CSR,獲取 CA 簽署的證書。
  5. 獲取證書:提取並保存簽署的證書。
  6. 配置憑證:將私鑰和證書添加到 kubectl 配置中。
  7. 配置上下文:關聯用戶和集群,創建上下文。
  8. 測試訪問:驗證認證是否成功並檢查權限。

這個過程展示了如何為 Kubernetes 集群添加新用戶並配置其認證,確保安全性(通過證書和私鑰)和靈活性(通過 RBAC 控制權限)。如果您有其他問題,歡迎隨時提出!