Konfigurowanie powiązań tożsamości w Azure Kubernetes Service (AKS)

Skonfiguruj powiązania tożsamości w klastrach usługi Azure Kubernetes Service (AKS), aby zamapować tożsamość zarządzaną przypisaną przez użytkownika (UAMI) w wielu klastrach przy użyciu pojedynczego poświadczenia tożsamości federacyjnej (FIC). Ta konfiguracja ułatwia skalowanie uwierzytelniania Microsoft Entra dla zasobów bez osiągnięcia limitów FIC.

Wymagania wstępne

  • Zapoznaj się z pojęciami dotyczącymi powiązań tożsamości , aby zrozumieć, jak działają powiązania tożsamości.
  • Interfejs wiersza polecenia platformy Azure w wersji 2.73.0 lub nowszej. Aby sprawdzić wersję, użyj az version polecenia . Aby zainstalować lub zaktualizować interfejs wiersza polecenia platformy Azure, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.
  • Potrzebne są następujące uprawnienia platformy Azure dotyczące tożsamości i zakresu klastra: Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write i Microsoft.ContainerService/managedClusters/write.
  • Do tworzenia zasobów ClusterRole i ClusterRoleBinding potrzebujesz uprawnień administratora klastra Kubernetes (lub równoważnych).

Ograniczenia

Tworzenie zasobów testowych

  1. Utwórz grupę zasobów platformy Azure przy użyciu az group create polecenia .

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Utwórz klaster AKS z włączoną tożsamością składnika obciążenia i wystawcą OIDC, używając polecenia az aks create z flagami --enable-workload-identity i --enable-oidc-issuer.

    export CLUSTER_NAME="ib-test-cluster"
    
    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --location $LOCATION --no-ssh-key --enable-workload-identity --enable-oidc-issuer
    
  3. Utwórz tożsamość zarządzaną przypisaną przez użytkownika (UAMI) przy użyciu polecenia az identity create.

    export MI_NAME="ib-test-mi"
    az identity create --resource-group $RESOURCE_GROUP --name $MI_NAME
    

Pobierz identyfikatory UAMI

  • Pobierz identyfikatory zasobów, głównego, klienta i dzierżawy UAMI i ustaw je jako zmienne środowiskowe przy użyciu następujących az identity show poleceń:

    export MI_RESOURCE_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query id --output tsv)
    export MI_PRINCIPAL_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query principalId --output tsv)
    export MI_CLIENT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query clientId --output tsv)
    export MI_TENANT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query tenantId --output tsv)
    

Tworzenie powiązania tożsamości

  • Zmapuj UAMI na klaster AKS za pomocą powiązania tożsamości przy użyciu polecenia az aks identity-binding create.

    az aks identity-binding create --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib" --managed-identity-resource-id $MI_RESOURCE_ID
    

    Uwaga / Notatka

    Podczas tworzenia powiązania tożsamości usługa AKS automatycznie tworzy poświadczenia tożsamości federacyjnej (FIC) o nazwie aks-identity-binding w obszarze UAMI. Poświadczeniem zarządza Azure Kubernetes Service (AKS). Nie modyfikuj ani nie usuwaj go, gdy wiązania tożsamości są używane. FIC utworzony dla powiązań tożsamości jest współużytkowany w ramach wszystkich powiązań tożsamości odnoszących się do tego samego UAMI.

Uzyskiwanie adresu URL dostawcy identyfikacji OIDC dla UAMI

  • Uzyskaj adres URL wystawcy OIDC powiązany z UAMI, badając powiązanie tożsamości przy użyciu polecenia az aks identity-binding show.

    az aks identity-binding show --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib"
    

    Skondensowane przykładowe dane wyjściowe:

    {
      "oidcIssuer": {
        "oidcIssuerUrl": "https://ib.oic.prod-aks.azure.com/<MI-tenant-id>/<MI-client-id>"
      }
    }
    

Nawiązywanie połączenia z klastrem usługi AKS

  1. Pobierz poświadczenia klastra AKS przy użyciu polecenia az aks get-credentials i zapisz je w osobnym pliku kubeconfig.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. Ustaw zmienną KUBECONFIG środowiskową, aby wskazywała nowy plik kubeconfig:

    export KUBECONFIG="$(pwd)/${CLUSTER_NAME}.kubeconfig"
    

Autoryzowanie przestrzeni nazw i kont usług

  • Skonfiguruj kontrolę dostępu opartą na rolach (RBAC), aby przyznać określonym podmiotom uprawnienia do korzystania z tożsamości zarządzanej za pośrednictwem powiązania tożsamości, stosując następujący manifest przy użyciu następującego kubectl apply polecenia.

    Uwaga / Notatka

    Poniższy przykład jawnie odwołuje się do demo konta usługi w demo przestrzeni nazw. Chociaż jawne odwoływanie się do określonego konta usługi jest jedną z opcji, można również odwołać się do kolekcji kont usług w obszarze subjects. Aby uzyskać więcej informacji, zobacz Odwoływanie się do tematów w dokumentacji platformy Kubernetes.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: demo
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: demo
      namespace: demo
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    rules:
      - verbs: ["use-managed-identity"]
        apiGroups: ["cid.wi.aks.azure.com"]
        resources: ["${MI_CLIENT_ID}"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-mi-${MI_CLIENT_ID}
    subjects:
      - kind: ServiceAccount
        name: demo
        namespace: demo
    EOF
    

Utwórz magazyn kluczy z ochroną przed usunięciem i autoryzacją RBAC w Azure

  • Utwórz magazyn kluczy z ochroną przed czyszczeniem i autoryzacją RBAC platformy Azure włączoną przy użyciu polecenia az keyvault create z flagami --enable-purge-protection i --enable-rbac-authorization. Możesz również użyć istniejącego magazynu kluczy, jeśli jest skonfigurowany do ochrony przed czyszczeniem i autoryzacji Azure RBAC.

    export KEY_VAULT_NAME="ib-test"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --enable-purge-protection \
        --enable-rbac-authorization
    

Pobierz identyfikator zasobu i adres URL magazynu kluczy

  1. Pobierz identyfikator zasobu magazynu kluczy przy użyciu polecenia az keyvault show i ustaw go jako zmienną środowiskową.

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. Pobierz adres URL magazynu kluczy przy użyciu az keyvault show polecenia i ustaw go jako zmienną środowiskową:

    export KEYVAULT_URL="$(az keyvault show \
        --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query properties.vaultUri \
        --output tsv)"
    

Konfigurowanie dostępu do magazynu kluczy i tworzenie tajemnicy

W poniższych krokach pokazano, jak uzyskać dostęp do tajemnic, kluczy lub certyfikatów w usłudze Azure Key Vault z poziomu podu. Przykłady w tej sekcji umożliwiają skonfigurowanie dostępu do wpisów tajnych w magazynie kluczy dla tożsamości obciążenia, ale możesz wykonać podobne kroki, aby skonfigurować dostęp do kluczy lub certyfikatów.

W poniższym przykładzie pokazano, jak używać modelu uprawnień RBAC platformy Azure, aby przyznać podowi dostęp do Azure Key Vault. Aby uzyskać więcej informacji na temat modelu uprawnień RBAC platformy Azure dla usługi Azure Key Vault, zobacz Udzielanie uprawnień aplikacjom do uzyskiwania dostępu do usługi Azure Key Vault przy użyciu kontroli dostępu opartej na rolach platformy Azure.

  1. Pobierz identyfikator obiektu zalogowanego użytkownika przy użyciu az ad signed-in-user show polecenia i ustaw go jako zmienną środowiskową:

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. Przypisz sobie rolę Oficera tajemnic w Key Vault platformy Azure używając polecenia az role assignment create.

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Utwórz klucz tajny w magazynie kluczy za pomocą polecenia az keyvault secret set.

    export KEY_VAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name $KEY_VAULT_NAME \
        --name $KEY_VAULT_SECRET_NAME \
        --value "Hello\!"
    
  4. Przypisz rolę Użytkownika wpisów tajnych usługi Key Vault do interfejsu użytkownika az role assignment create przy użyciu polecenia .

    az role assignment create \
        --assignee-object-id $MI_PRINCIPAL_ID \
        --role "Key Vault Secrets User" \
        --scope $KEY_VAULT_RESOURCE_ID \
        --assignee-principal-type ServicePrincipal
    

Dodawanie adnotacji do konta usługi

  1. Dodaj adnotację do konta usługi przy użyciu polecenia kubectl annotate z identyfikatorem dzierżawy tożsamości zarządzanej.

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. Adnotuj konto usługi identyfikatorem klienta tożsamości zarządzanej, korzystając z polecenia kubectl annotate.

    kubectl annotate sa demo -n demo azure.workload.identity/client-id=$MI_CLIENT_ID
    

Wdrażanie przykładowej aplikacji

  • Wdróż przykładowy zasobnik, który za pomocą powiązania tożsamości uzyskuje token dostępu dla zarządzanej tożsamości, aby uzyskać dostęp do usługi Azure Key Vault, używając następującego polecenia kubectl apply.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: demo
      labels:
        azure.workload.identity/use: "true"
      annotations:
        azure.workload.identity/use-identity-binding: "true"
    spec:
      serviceAccount: demo
      containers:
        - name: azure-sdk
          # source code: https://github.com/Azure/azure-workload-identity/blob/feature/custom-token-endpoint/examples/identitybinding-msal-go/main.go
          image: ghcr.io/bahe-msft/azure-workload-identity/identitybinding-msal-go:latest-linux-amd64
          env:
            - name: KEYVAULT_URL
              value: ${KEYVAULT_URL}
            - name: SECRET_NAME
              value: ${KEY_VAULT_SECRET_NAME}
      restartPolicy: Never
    EOF
    

Weryfikowanie dostępu do magazynu kluczy z przykładowej aplikacji

  1. Opisz zasobnik i potwierdź, że zmienne środowiskowe oraz projekcje montażu woluminu tokenu są obecne przy użyciu polecenia kubectl describe pod.

    kubectl describe pod demo -n demo
    

    Oczekiwane dane wyjściowe powinny zawierać wartości , AZURE_CLIENT_ID, AZURE_TENANT_IDAZURE_FEDERATED_TOKEN_FILE, AZURE_AUTHORITY_HOST, AZURE_KUBERNETES_TOKEN_PROXY. AZURE_KUBERNETES_SNI_NAME, i AZURE_KUBERNETES_CA_FILE.

  2. Sprawdź, czy zasobnik może uzyskać token i dostęp do zasobu, używając polecenia kubectl logs.

    kubectl logs demo -n demo
    

    W przypadku powodzenia dane wyjściowe powinny być podobne do następującego przykładu:

    I1107 20:03:42.865180       1 main.go:77] "successfully got secret" secret="Hello!"
    

Skalowanie powiązań tożsamości w wielu klastrach

Powiązania tożsamości umożliwiają mapowanie wielu klastrów usługi AKS na tę samą zarządzaną tożsamość przypisaną użytkownikowi (UAMI), jednocześnie używając pojedynczego FIC. Aby skalować powiązania tożsamości w wielu klastrach, możesz powtórzyć kroki opisane w artykule Tworzenie powiązania tożsamości za pomocą weryfikacji dostępu do magazynu kluczy z przykładowej aplikacji dla każdego dodatkowego klastra, który ma zostać zamapowyny na ten sam interfejs użytkownika (utworzenie nowego powiązania tożsamości dla klastra).

Uprzątnij zasoby

Jeśli nie potrzebujesz już zasobów utworzonych w tym artykule, możesz je wyczyścić, aby uniknąć ponoszenia przyszłych kosztów.

  1. Usuń zasobnik przy użyciu kubectl delete pod polecenia .

    kubectl delete pod demo -n demo
    
  2. Usuń przestrzeń nazw przy użyciu kubectl delete ns polecenia .

    kubectl delete ns demo
    
  3. Usuń grupę zasobów i wszystkie powiązane zasoby przy użyciu az group delete polecenia .

    az group delete --name $RESOURCE_GROUP --yes --no-wait