K8s Security | CA
K8s CA 與 CSR 憑證簽署流程
什麼是 CA (Certificate Authority)?
K8s 使用內建的 Certificate Authority(CA)簽發憑證給用戶、元件或服務,透過自動化控制流程來統一管理:
- 簽署元件憑證(如 API Server、kubelet)
- 驗證 Client 憑證(RBAC、API 請求)
- 使用 Certificates API 自動化 CSR (CertificateSigningRequest) 流程
CSR (CertificateSigningRequest) 操作流程
CSR 的簽署與核准流程,是由 kube-controller-manager 內部的 controller 自動完成。你可以透過 webhook 或 RBAC 控制誰可以自動批准。
自動化管理證書簽名:
- Create CertificateSigningRequest Object
- Reviewing Requests
- Approve Requests
- Share Certs to Users
1. 建立私鑰與 CSR 檔案
1 | # 產生私鑰 |
2. 將 CSR 編碼後建立 K8s CSR 資源
1 | # Encode: base64 編碼 jane.csr |
建立 CSR 資源時,需將上面 Encode 後的 base64 結果貼入 spec.request 欄位。(jane-csr.yaml)
tr -d '\n'是移除換行符號,確保貼進 YAML 的 spec.request 欄位是一行文字。
範例 YAML:jane-csr.yaml
1 | apiVersion: certificates.k8s.io/v1 |
1 | kubectl apply -f jane-csr.yaml |
3. 審核與批准 CSR 請求
1 | # 查看所有 CSR |
若確認無誤後,執行批准指令:
1 | kubectl certificate approve jane |
若需要拒絕請求,可用:
1 | kubectl certificate deny jane |
4. 取得簽署後的憑證
1 | # 將憑證存出來 |
匯出的 jane.crt 為 PEM 編碼(base64 格式)之 X.509 憑證,可直接用於 kubeconfig 或 openssl 驗證。
現在你就擁有:
- jane.key(私鑰)
- jane.crt(由 K8s 簽署的用戶端憑證)
Certificates API 與控制器說明
在 Kubernetes controlplane 中,kube-controller-manager 是負責執行多種控制器(controller)的核心元件,其中也包含與憑證相關的操作流程。
當簽署 CSR(CertificateSigningRequest)時,Kube Controller Manager 會使用設定好的 CA 憑證(root certificate)與私鑰(private key)對 CSR 進行簽章。
這些憑證簽發流程,實際上是由 Controller Manager 內部的兩個控制器負責處理:
| Controller Name | 功能說明 |
|---|---|
csr-approving controller |
決定是否核准 CSR |
csr-signing controller |
使用 CA 憑證與私鑰簽署 CSR |
檢查 Controller Manager 憑證簽署參數
這些控制器會使用 Controller Manager 設定檔中指定的 CA 憑證與私鑰:
1 | cat /etc/kubernetes/manifests/kube-controller-manager.yaml |
請確認以下參數存在(K8s 使用此 CA 進行簽名):
1 | --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt |
CSR 編碼與解碼小技巧
Encode
1 | cat jane.csr | base64 | tr -d '\n' |
Decode
1 | echo "[Encode後的結果_base64編碼]" | base64 --decode |
小結:K8s CSR 流程重點
- 建立私鑰與 CSR(含 CN 身份)
- 將 CSR base64 編碼後建立 Kubernetes 資源
- 管理員審核並批准(可自動或手動)
- 匯出簽署憑證,供用戶端連線使用