在 Azure Kubernetes Service 上為 Istio 型服務網格附加元件插入 CA 憑證
在 Azure Kubernetes Service 的 Istio 型服務網格附加元件中,Istio 憑證授權單位 (CA) 預設會產生自我簽署的根憑證和金鑰,並使用這些根憑證和金鑰簽署工作負載憑證。 若要保護根 CA 金鑰,您應該在離線時使用安全電腦上執行的根 CA。 您可以使用根 CA,向每個叢集中執行的 Istio CA 發出中繼憑證。 Istio CA 可以使用系統管理員指定的憑證和金鑰簽署工作負載憑證,並將系統管理員指定的根憑證散發至工作負載做為信任的根目錄。 本文說明如何在 Azure Kubernetes Service 的 Istio 型服務網格附加元件中,自備 Istio CA 的憑證和金鑰。
本文說明如何使用 Azure Key Vault 對 Istio 型服務網狀架構附加元件提供的根憑證、簽署憑證和金鑰來設定 Istio 憑證授權單位。
開始之前
確認 Azure CLI 版本
附加元件需要安裝 Azure CLI 2.57.0 版或更新版本。 您可以執行 az --version
來驗證版本。 若要安裝或升級,請參閱[安裝 Azure CLI][azure-cli-install]。
設定 Azure Key Vault
您需要 Azure Key Vault 資源,才能將憑證和金鑰輸入提供給 Istio 附加元件。
您必須離線產生根憑證、中繼憑證、中繼金鑰和憑證鏈結。 此處的步驟 1-3 有如何產生這些檔案的範例。
使用憑證和金鑰在 Azure Key Vault 中建立祕密:
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path-to-folder/cert-chain.pem>
為叢集啟用祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者:
az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTER
注意
輪替憑證時,若要控制祕密同步至叢集的速度,您可以使用 Azure Key Vault 祕密提供者附加元件的
--rotation-poll-interval
參數。 例如:az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s
授權附加元件的使用者指派受控識別,以存取 Azure Key Vault 資源:
OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv) az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list
注意
如果您使用 Azure RBAC 授權為您的權限模型建立金鑰保存庫,而非使用保存庫存取原則,請遵循此處的指示建立受控識別的權限。 請為附加元件的使用者指派受控識別新增
Key Vault Reader
的 Azure 角色指派。
使用外掛程式 CA 憑證設定 Istio 型服務網格附加元件
在參考稍早建立的 Azure Key Vault 祕密時,為現有的 AKS 叢集啟用 Istio 服務網格附加元件:
az aks mesh enable --resource-group $RESOURCE_GROUP --name $CLUSTER \ --root-cert-object-name root-cert \ --ca-cert-object-name ca-cert \ --ca-key-object-name ca-key \ --cert-chain-object-name cert-chain \ --key-vault-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$AKV_NAME
注意
對於使用的自我簽署根憑證是由 Istio CA 產生的現有叢集,不支援切換至外掛程式 CA。 您必須先停用這些叢集上的網格,然後使用上述命令再次啟用網格,以傳遞外掛程式 CA 輸入。
驗證已在
cacerts
叢集上建立:kubectl get secret -n aks-istio-system
預期輸出:
NAME TYPE DATA AGE cacerts opaque 4 13h sh.helm.release.v1.azure-service-mesh-istio-discovery.v380 helm.sh/release.v1 1 2m15s sh.helm.release.v1.azure-service-mesh-istio-discovery.v381 helm.sh/release.v1 1 8s
驗證 Istio 控制平面已挑選自訂憑證授權單位:
kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController | grep x509
預期的輸出應該類似:
2023-11-06T15:49:15.493732Z info x509 cert - Issuer: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", Subject: "", SN: e191d220af347c7e164ec418d75ed19e, NotBefore: "2023-11-06T15:47:15Z", NotAfter: "2033-11-03T15:49:15Z" 2023-11-06T15:49:15.493764Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", SN: 885034cba2894f61036f2956fd9d0ed337dc636, NotBefore: "2023-11-04T01:40:02Z", NotAfter: "2033-11-01T01:40:02Z" 2023-11-06T15:49:15.493795Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
憑證授權單位輪替
基於安全性或原則因素,您可能會需要定期輪替憑證授權單位。 本節將逐步引導您處理中繼 CA 和根 CA 輪替案例。
中繼憑證授權單位輪替
您可以輪替中繼 CA,同時保持 CA 不變。 使用新的憑證和金鑰檔案更新 Azure Key Vault 資源中的祕密:
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
等候
--rotation-poll-interval
的時間持續時間。 根據 Azure Key Vault 資源上更新的新中繼 CA,檢查叢集上是否已重新整理cacerts
祕密:kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
預期的輸出應該類似:
2023-11-07T06:16:21.091844Z info Update Istiod cacerts 2023-11-07T06:16:21.091901Z info Using istiod file format for signing ca files 2023-11-07T06:16:21.354423Z info Istiod has detected the newly added intermediate CA and updated its key and certs accordingly 2023-11-07T06:16:21.354910Z info x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: b2753c6a23b54d8364e780bf664672ce, NotBefore: "2023-11-07T06:14:21Z", NotAfter: "2033-11-04T06:16:21Z" 2023-11-07T06:16:21.354967Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z" 2023-11-07T06:16:21.355007Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z" 2023-11-07T06:16:21.355012Z info Istiod certificates are reloaded
工作負載會從 Istio 控制平面接收憑證,預設為 24 小時有效。 如果您未重新啟動 Pod,全部工作負載都會在 24 小時內根據新的中繼 CA 取得新的分葉憑證。 如果您想要強制全部這些工作負載立即從新的中繼 CA 取得新的分葉憑證,則需要重新啟動工作負載。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
根憑證授權單位輪替
您需要使用根憑證檔案來更新 Azure Key Vault 祕密,其中包含舊憑證和新根憑證的串連:
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
root-cert.pem
的內容遵循下列格式:-----BEGIN CERTIFICATE----- <contents of old root certificate> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <contents of new root certificate> -----END CERTIFICATE-----
附加元件包含
CronJob
,這會在叢集上每十分鐘執行一次,以檢查根憑證的更新。 如果這偵測到更新,這會重新啟動 Istio 控制平面 (istiod
部署) 以挑選更新。 您可以檢查其記錄,以確認偵測到根憑證更新,而且 Istio 控制平面已重新啟動:kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
預期輸出:
Root certificate update detected. Restarting deployment... deployment.apps/istiod-asm-1-17 restarted Deployment istiod-asm-1-17 restarted.
istiod
重新啟動之後,這應該會指出已將兩個憑證新增至信任網域:kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system
預期輸出:
2023-11-07T06:42:00.287916Z info Using istiod file format for signing ca files 2023-11-07T06:42:00.287928Z info Use plugged-in cert at etc/cacerts/ca-key.pem 2023-11-07T06:42:00.288254Z info x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: 286451ca8ff7bf9e6696f56bef829d42, NotBefore: "2023-11-07T06:40:00Z", NotAfter: "2033-11-04T06:42:00Z" 2023-11-07T06:42:00.288279Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z" 2023-11-07T06:42:00.288298Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z" 2023-11-07T06:42:00.288303Z info Istiod certificates are reloaded 2023-11-07T06:42:00.288365Z info spiffe Added 2 certs to trust domain cluster.local in peer cert verifier
您必須等候 24 小時 (分葉憑證有效性的預設時間),或強制重新啟動全部工作負載。 如此一來,全部工作負載都會同時辨識新舊憑證授權單位以進行 mTLS 驗證。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
您現在可以只使用新的 CA 更新 Azure Key Vault 祕密(不含舊的 CA):
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
檢查的
CronJob
記錄,以確認偵測根憑證更新,並重新啟動istiod
:kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
預期輸出:
Root certificate update detected. Restarting deployment... deployment.apps/istiod-asm-1-17 restarted Deployment istiod-asm-1-17 restarted.
istiod
更新之後,這應該只會確認使用新的根 CA:kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
預期輸出:
2023-11-07T08:01:17.780299Z info x509 cert - Issuer: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", Subject: "", SN: 1159747c72cc7ac7a54880cd49b8df0a, NotBefore: "2023-11-07T07:59:17Z", NotAfter: "2033-11-04T08:01:17Z" 2023-11-07T08:01:17.780330Z info x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", SN: 2aba0c438652a1f9beae4249457023013948c7e2, NotBefore: "2023-11-04T01:42:12Z", NotAfter: "2033-11-01T01:42:12Z" 2023-11-07T08:01:17.780345Z info x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Root B,O=Istio", SN: 3f9da6ddc4cb03749c3f43243a4b701ce5eb4e96, NotBefore: "2023-11-04T01:41:54Z", NotAfter: "2033-11-01T01:41:54Z"
從本文所示的範例輸出中,您可以看到我們已從根 A 移至根 B (在啟用附加元件時使用)。
您可以再次等候 24 小時,也可以強制重新啟動全部工作負載。 強制重新啟動可讓工作負載立即從新的根 CA 取得新的分葉憑證。
kubectl rollout restart deployment <deployment name> -n <deployment namespace>