Připojení certifikátů certifikační autority pro doplněk Istio service mesh ve službě Azure Kubernetes Service

V doplňku sítě služby Istio pro službu Azure Kubernetes Service ve výchozím nastavení vygeneruje certifikační autorita Istio (CA) kořenový certifikát a klíč podepsaný svým držitelem a používá je k podepsání certifikátů úloh. Pokud chcete chránit kořenový klíč certifikační autority, měli byste použít kořenovou certifikační autoritu, která běží na zabezpečeném počítači offline. Kořenovou certifikační autoritu můžete použít k vydávání zprostředkujících certifikátů certifikačním autoritám Istio, které běží v každém clusteru. Certifikační autorita Istio může podepisovat certifikáty úloh pomocí certifikátu a klíče určeného správcem a distribuovat kořenový certifikát určený správcem do úloh jako kořen důvěryhodnosti. Tento článek se věnuje tomu, jak používat vlastní certifikáty a klíče pro certifikační autoritu Istio v doplňku Istio service mesh pro službu Azure Kubernetes Service.

Diagram znázorňující kořenovou a zprostředkující certifikační autoritu s istio

V tomto článku se dozvíte, jak nakonfigurovat certifikační autoritu Istio s kořenovým certifikátem, podpisovým certifikátem a klíčem poskytovaným jako vstupy pomocí služby Azure Key Vault do doplňku Istio service mesh.

Než začnete

Ověření verze Azure CLI

Doplněk vyžaduje instalaci Azure CLI verze 2.57.0 nebo novější. Verzi můžete ověřit spuštěním az --version . Pokud chcete nainstalovat nebo upgradovat, přečtěte si téma [Instalace Azure CLI][azure-cli-install].

Nastavení služby Azure Key Vault

  1. K zadání certifikátu a vstupů klíčů do doplňku Istio potřebujete prostředek služby Azure Key Vault.

  2. Potřebujete vygenerovat kořenový certifikát, zprostředkující certifikáty, zprostředkující klíč a řetěz certifikátů offline. Kroky 1 až 3 tady mají příklad, jak tyto soubory vygenerovat.

  3. Vytváření tajných kódů ve službě Azure Key Vault pomocí certifikátů a klíče:

    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. Povolte zprostředkovatele služby Azure Key Vault pro ovladač CSI úložiště tajných kódů pro váš cluster:

    az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTER
    

    Poznámka:

    Při obměně certifikátů můžete řídit, jak rychle se tajné kódy synchronizují do clusteru, můžete použít --rotation-poll-interval parametr doplňku Poskytovatele tajných kódů služby Azure Key Vault. Příklad: az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s

  5. Autorizovat spravovanou identitu přiřazenou uživatelem doplňku, aby měla přístup k prostředku služby 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
    

    Poznámka:

    Pokud jste vytvořili službu Key Vault s autorizací Azure RBAC pro váš model oprávnění místo zásad přístupu k trezoru, postupujte podle těchto pokynů a vytvořte oprávnění pro spravovanou identitu. Přidejte přiřazení role Azure pro Key Vault Reader spravovanou identitu přiřazenou uživatelem doplňku.

Nastavení doplňku sítě služeb založeného na Istio s certifikáty certifikační autority plug-in

  1. Povolte doplněk sítě služby Istio pro váš existující cluster AKS a při odkazování na tajné kódy služby Azure Key Vault, které byly vytvořeny dříve:

    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
    

    Poznámka:

    U existujících clusterů s doplňkem Istio pomocí kořenového certifikátu podepsaného svým držitelem vygenerovaného certifikační autoritou Istio není přepnutí na certifikační autoritu modulu plug-in podporováno. Nejprve je potřeba síť v těchto clusterech zakázat a pak ji znovu povolit pomocí výše uvedeného příkazu, abyste prošli vstupy certifikační autority modulu plug-in.

  2. Ověřte, že se v cacerts clusteru vytvoří:

    kubectl get secret -n aks-istio-system
    

    Očekávaný výstup:

    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. Ověřte, že řídicí rovina Istio převzala vlastní certifikační autoritu:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController | grep x509
    

    Očekávaný výstup by měl vypadat přibližně takto:

    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"
    

Obměně certifikační autority

Možná budete muset pravidelně obměňovat certifikační autority z důvodů zabezpečení nebo zásad. V této části se dozvíte, jak zpracovat scénáře obměny zprostředkující certifikační autority a kořenové certifikační autority.

Obměně zprostředkující certifikační autority

  1. Zprostředkující certifikační autoritu můžete otočit a zároveň zachovat stejnou kořenovou certifikační autoritu. Aktualizujte tajné kódy v prostředku služby Azure Key Vault pomocí nového certifikátu a souborů klíčů:

    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. Počkejte na dobu trvání --rotation-poll-interval. Zkontrolujte, jestli cacerts se tajný klíč v clusteru aktualizoval na základě nové zprostředkující certifikační autority aktualizované v prostředku služby Azure Key Vault:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    Očekávaný výstup by měl vypadat přibližně takto:

    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. Úlohy přijímají certifikáty z řídicí roviny Istio, které jsou ve výchozím nastavení platné po dobu 24 hodin. Pokud pody nerestartujete, všechny úlohy získávají nové listové certifikáty založené na nové zprostředkující certifikační autoritě za 24 hodin. Pokud chcete vynutit, aby všechny tyto úlohy získaly nové listové certifikáty hned od nové zprostředkující certifikační autority, musíte úlohy restartovat.

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

Obměně kořenové certifikační autority

  1. Tajné kódy služby Azure Key Vault je potřeba aktualizovat pomocí kořenového souboru certifikátu se zřetězením starých a nových kořenových certifikátů:

    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 Obsah tohoto formátu:

    -----BEGIN CERTIFICATE-----
    <contents of old root certificate>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <contents of new root certificate>
    -----END CERTIFICATE-----
    

    Doplněk zahrnuje CronJob spuštění každých deset minut v clusteru a kontroluje aktualizace kořenového certifikátu. Pokud zjistí aktualizaci, restartuje řídicí rovinu Istio (istiod nasazení) a vyzvedne aktualizace. Můžete zkontrolovat jeho protokoly a ověřit, že byla zjištěna aktualizace kořenového certifikátu a že se řídicí rovina Istio restartovala:

    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}')
    

    Očekávaný výstup:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    Po istiod restartování by mělo být uvedeno, že do domény důvěryhodnosti byly přidány dva certifikáty:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system 
    

    Očekávaný výstup:

    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. Musíte buď počkat na 24 hodin (výchozí čas platnosti certifikátu typu list), nebo vynutit restartování všech úloh. Díky tomu všechny úlohy rozpoznávají staré i nové certifikační autority pro ověřování mTLS.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. Tajné kódy služby Azure Key Vault teď můžete aktualizovat jenom pomocí nové certifikační autority (bez staré certifikační autority):

    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>
    

    Zkontrolujte protokoly a ověřte detekci aktualizace kořenového CronJob certifikátu a restartování 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}')
    

    Očekávaný výstup:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    Po istiod aktualizaci by se mělo potvrdit pouze použití nové kořenové certifikační autority:

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    Očekávaný výstup:

    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"
    

    Z ukázkových výstupů uvedených v tomto článku si můžete všimnout, že jsme přešli z kořene A (používá se při povolování doplňku) do kořenového adresáře B.

  4. Můžete buď znovu počkat na 24 hodin, nebo vynutit restartování všech úloh. Vynucení restartování získají nové listové certifikáty od nové kořenové certifikační autority okamžitě.

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