Wtyczki certyfikatów CA dla dodatku siatki usług opartej na Istio dla Azure Kubernetes Service

W dodatku Service Mesh opartym na Istio dla usługi Azure Kubernetes Service urząd certyfikacji (CA) Istio domyślnie generuje główny certyfikat z podpisem własnym oraz klucz i używa ich do podpisywania certyfikatów obciążeń. Aby chronić klucz głównego urzędu certyfikacji, należy użyć głównego urzędu certyfikacji, który działa na bezpiecznej maszynie w trybie offline. Za pomocą głównego urzędu certyfikacji można wystawiać certyfikaty pośrednie do urzędów certyfikacji Istio, które działają w każdym klastrze. Urząd Certyfikacji Istio może podpisywać certyfikaty dla obciążeń przy użyciu certyfikatu i klucza określonego przez administratora oraz dystrybuować certyfikat główny, również określony przez administratora, do obciążeń jako korzeń zaufania. W tym artykule opisano, jak używać własnych certyfikatów i kluczy dla urzędu certyfikacji Istio w dodatku siatki usług bazującej na Istio dla Azure Kubernetes Service.

Diagram przedstawiający nadrzędny i pośredni urząd certyfikacji z Istio.

W tym artykule opisano, jak skonfigurować urząd certyfikacji Istio, używając certyfikatu głównego, certyfikatu podpisującego i klucza dostarczonych jako dane wejściowe za pośrednictwem Azure Key Vault do dodatku do siatki usług opartej na Istio.

Zanim rozpoczniesz

Weryfikowanie wersji Azure CLI

Dodatek wymaga zainstalowania Azure CLI w wersji 2.57.0 lub nowszej. Możesz uruchomić polecenie az --version , aby zweryfikować wersję. Aby zainstalować lub uaktualnić, zobacz Install Azure CLI.

Konfigurowanie Azure Key Vault

  1. Potrzebujesz zasobu Azure Key Vault aby podać certyfikat i kluczowe dane wejściowe do dodatku Istio.

  2. Należy wygenerować certyfikat główny, certyfikaty pośrednie, klucz pośredni i łańcuch certyfikatów w trybie offline. Kroki 1–3 z tego miejsca zawierają przykład sposobu generowania tych plików.

  3. Utwórz wpisy tajne w Azure Key Vault przy użyciu certyfikatów i klucza:

    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>
    
  4. Włącz dostawcę Azure Key Vault w sterowniku CSI magazynu tajemnic dla klastra.

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

    Uwaga

    Podczas rotacji certyfikatów, aby kontrolować, jak szybko wpisy tajne są synchronizowane z klastrem, można użyć parametru --rotation-poll-interval dodatku dostawcy wpisów tajnych Azure Key Vault. Na przykład: az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s.

  5. Jeśli Key Vault używa Azure kontroli dostępu opartej na rolach dla modelu uprawnień, postępuj zgodnie z instrukcjami here aby przypisać rolę Azure użytkownika Key Vault Secrets User dla tożsamości zarządzanej przypisanej przez użytkownika dodatku. Alternatywnie, jeśli magazyn kluczy korzysta z modelu uprawnień zasad dostępu magazynu, autoryzuj przypisaną tożsamość zarządzaną użytkownika dodatku, aby uzyskać dostęp do zasobu Azure Key Vault, korzystając z polityki dostępu.

    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
    

Konfigurowanie dodatku siatki usług opartej na platformie Istio z certyfikatami CA wtyczki

  1. Włącz dodatek siatki usługi Istio dla istniejącego klastra usługi AKS podczas odwoływania się do utworzonych wcześniej wpisów tajnych Azure Key Vault:

    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
    

    Uwaga

    W przypadku istniejących klastrów z dodatkiem Istio, korzystających z samopodpisanego certyfikatu głównego generowanego przez CA Istio, przełączenie na CA wtyczki nie jest obsługiwane. Najpierw należy wyłączyć mesh w tych klastrach, a następnie włączyć go ponownie przy użyciu powyższego polecenia, aby umożliwić przekazywanie wejść CA wtyczki.

  2. Sprawdź, czy płaszczyzna sterowania Istio odebrała niestandardowy urząd certyfikacji:

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

    Oczekiwane dane wyjściowe powinny być podobne do następujących:

    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"
    

Rotacja urzędu certyfikacji

Ze względów bezpieczeństwa lub zasad może być konieczne okresowe obracanie urzędów certyfikacji. W tej sekcji opisano sposób obsługi scenariuszy rotacji pośredniego urzędu certyfikacji i głównego urzędu certyfikacji.

Rotacja pośredniego urzędu certyfikacji

  1. Można zmienić pośredni urząd certyfikacji, zachowując ten sam nadrzędny urząd certyfikacji. Zaktualizuj tajemnice w zasobie Azure Key Vault za pomocą nowych plików certyfikatów i kluczy:

    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. Poczekaj na czas trwania --rotation-poll-interval. Sprawdź, czy certyfikaty w klastrze zostały odświeżone na podstawie nowego pośredniego urzędu certyfikacji, który został zaktualizowany w zasobie Azure Key Vault.

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

    Oczekiwane dane wyjściowe powinny być podobne do następujących:

    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. Obciążenia otrzymują certyfikaty z płaszczyzny sterowania Istio, które są domyślnie ważne przez 24 godziny. Jeśli nie uruchomisz ponownie podów, wszystkie obciążenia uzyskają nowe certyfikaty końcowe na podstawie nowego pośredniego CA w ciągu 24 godzin. Jeśli chcesz wymusić na wszystkich tych zadaniach uzyskanie nowych certyfikatów końcowych natychmiast od nowego pośredniego urzędu certyfikacji, należy ponownie uruchomić zadania.

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

Rotacja nadrzędnego urzędu certyfikacji

  1. Należy zaktualizować tajemnice Azure Key Vault z plikiem certyfikatu głównego zawierającym zarówno stare, jak i nowe certyfikaty główne.

    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>
    

    Zawartość root-cert.pem ma następujący format:

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

    Sprawdź istiod dzienniki, gdy certyfikaty zostaną zsynchronizowane z klastrem.

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

    Oczekiwane dane wyjściowe:

    2023-11-07T06:42:00.287916Z     info    Updating new ROOT-CA
    2023-11-07T06:42:00.287928Z     info    update root cert and generate new dns certs
    2023-11-07T06:42:00.288254Z     info    Update trust anchor with new root cert
    2023-11-07T06:42:00.288279Z     info    trustBundle     updating Source IstioCA with certs
    2023-11-07T06:42:00.288298Z     info    Istiod has detected the newly added intermediate CA and updated its key and certs accordingly
    2023-11-07T06:42:00.288303Z     info    Istiod certificates are reloaded
    
  2. Musisz poczekać 24 godziny (domyślny czas ważności certyfikatu liścia) lub wymusić ponowne uruchomienie wszystkich obciążeń. Dzięki temu wszystkie obciążenia rozpoznają zarówno stare, jak i nowe urzędy certyfikacji na potrzeby weryfikacji mTLS.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. Teraz możesz zaktualizować sekrety Azure Key Vault tylko przy użyciu nowego urzędu certyfikacji (nowego CA, bez starego 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>
    

    Sprawdź istiod dzienniki, gdy certyfikaty zostaną zsynchronizowane z klastrem.

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

    Oczekiwane dane wyjściowe:

    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"
    

    Na podstawie przykładowych wyników przedstawionych w tym artykule można zauważyć, że przeszliśmy z Root A (używanego podczas włączania dodatku) do Root B.