Share via


在 Azure Kubernetes Service 上插入 Istio 型服務網格附加元件 CA 憑證

在 Azure Kubernetes Service 的 Istio 型服務網格附加元件中,根據預設,Istio 證書頒發機構單位 (CA) 會產生自我簽署的跟證書和密鑰,並使用它們來簽署工作負載憑證。 若要保護根 CA 金鑰,您應該在離線時使用安全電腦上執行的根 CA。 您可以使用根 CA,向每個叢集中執行的 Istio CA 發出中繼憑證。 Istio CA 可以使用系統管理員指定的憑證和金鑰簽署工作負載憑證,並將系統管理員指定的根憑證散發至工作負載做為信任的根目錄。 本文說明如何在 Azure Kubernetes Service 的 Istio 型服務網格附加元件中,自備 Istio CA 的憑證和金鑰。

顯示具有 Istio 之根 CA 和中繼 CA 的圖表。

本文說明如何使用 Azure Key Vault 對 Istio 型服務網狀架構附加元件提供的根憑證、簽署憑證和金鑰來設定 Istio 憑證授權單位。

開始之前

確認 Azure CLI 版本

附加元件需要安裝 Azure CLI 2.57.0 版或更新版本。 您可以執行 az --version 來驗證版本。 若要安裝或升級,請參閱 [安裝 Azure CLI][azure-cli-install]。

設定 Azure Key Vault

  1. 您需要 Azure Key Vault 資源,才能將憑證和金鑰輸入提供給 Istio 附加元件。

  2. 您必須離線產生根憑證、中繼憑證、中繼金鑰和憑證鏈結。 此處的步驟 1-3 有如何產生這些檔案的範例。

  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/cert-chain.pem>
    
  4. 叢集啟用祕密存放區 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

  5. 授權附加元件的使用者指派受控識別,以存取 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 授權,請遵循這裡的指示來建立受控識別的許可權。 為附加元件的使用者指派受控識別新增 Azure 角色指派 Key Vault Reader

使用外掛程式 CA 憑證設定 Istio 型服務網格附加元件

  1. 在參考稍早建立的 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 輸入。

  2. 驗證已在 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    
    
  3. 驗證 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 輪替案例。

中繼憑證授權單位輪替

  1. 您可以輪替中繼 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>
    
  2. 等候 --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
    
  3. 工作負載會從 Istio 控制平面接收憑證,預設為 24 小時有效。 如果您未重新啟動 Pod,全部工作負載都會在 24 小時內根據新的中繼 CA 取得新的分葉憑證。 如果您想要強制全部這些工作負載立即從新的中繼 CA 取得新的分葉憑證,則需要重新啟動工作負載。

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    

根憑證授權單位輪替

  1. 您需要使用根憑證檔案來更新 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
    
  2. 您必須等候 24 小時 (分葉憑證有效性的預設時間),或強制重新啟動全部工作負載。 如此一來,全部工作負載都會同時辨識新舊憑證授權單位以進行 mTLS 驗證

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. 您現在可以只使用新的 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 (在啟用附加元件時使用)。

  4. 您可以再次等候 24 小時,也可以強制重新啟動全部工作負載。 強制重新啟動可讓工作負載立即從新的根 CA 取得新的分葉憑證。

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>