antony@notes:~/kubernetes$ cat "Create-a-normal-user-with-Client-certificate-in-Kubernetes.md"
Create a normal user with Client certificate in 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=group1和O=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 權限。
總結
上述命令完成了一個完整的用戶認證配置流程:
- 生成私鑰:創建用戶
user2的 RSA 私鑰。 - 生成 CSR:使用私鑰生成證書簽名請求,包含用戶身份信息。
- 提交 CSR:將 CSR 提交到 Kubernetes 集群。
- 批准 CSR:管理員批准 CSR,獲取 CA 簽署的證書。
- 獲取證書:提取並保存簽署的證書。
- 配置憑證:將私鑰和證書添加到
kubectl配置中。 - 配置上下文:關聯用戶和集群,創建上下文。
- 測試訪問:驗證認證是否成功並檢查權限。
這個過程展示了如何為 Kubernetes 集群添加新用戶並配置其認證,確保安全性(通過證書和私鑰)和靈活性(通過 RBAC 控制權限)。如果您有其他問題,歡迎隨時提出!