Nastavení vazeb identit na Azure Kubernetes Service (AKS)

Nastavte vazby identit v clusterech Azure Kubernetes Service (AKS) pro mapování spravované identity přiřazené uživatelem (UAMI) napříč několika clustery při použití jednoho přihlašovacích údajů federované identity (FIC). Toto nastavení vám pomůže škálovat ověřování Microsoft Entra pro úlohy bez dosažení limitů FIC.

Požadavky

  • Projděte si koncepty vazeb identit a zjistěte, jak fungují vazby identit.
  • Azure CLI verze 2.73.0 nebo novější Pokud chcete zkontrolovat svou verzi, použijte az version příkaz. Pokud chcete nainstalovat nebo aktualizovat Azure CLI, přečtěte si téma Instalace Azure CLI.
  • Pro obor identity a clusteru potřebujete následující oprávnění Azure: Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write a Microsoft.ContainerService/managedClusters/write.
  • K vytváření ClusterRole a ClusterRoleBinding prostředků potřebujete oprávnění správce clusteru Kubernetes (nebo ekvivalentní).

Omezení

Vytvoření testovacích prostředků

  1. Pomocí příkazu vytvořte skupinu az group create prostředků Azure.

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Vytvořte cluster AKS s identitou úloh a vystavitelem OIDC povoleným pomocí az aks create příkazu s příznaky --enable-workload-identity a --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. Pomocí příkazu az identity create vytvořte uživatelsky přiřazenou spravovanou identitu (UAMI).

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

Získání ID UAMI

  • Získejte ID prostředku, objektu zabezpečení, klienta a tenanta UAMI a nastavte je jako proměnné prostředí pomocí následujících az identity show příkazů:

    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)
    

Vytvořte vazbu identity

  • Namapujte UAMI na cluster AKS s vazbou identity příkazem 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
    

    Poznámka:

    Když vytvoříte vazbu identity, AKS automaticky vytvoří přihlašovací údaje federované identity (FIC) pojmenované aks-identity-binding v rámci UAMI. Tyto přihlašovací údaje spravuje AKS. Neupravujte ani neodstraňujte, když se používají vazby identit. FIC vytvořený pro vazby identit je sdílen mezi všemi vazbami identit, které odkazují na stejné UAMI.

Získejte adresu URL vystavitele OIDC pro UAMI

  • Získejte adresu URL vystavitele OIDC přidruženou k UAMI kontrolou vazby identity pomocí az aks identity-binding show příkazu.

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

    Zhuštěný ukázkový výstup:

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

Připojení ke clusteru AKS

  1. Pomocí příkazu získejte přihlašovací údaje az aks get-credentials clusteru AKS a uložte je do samostatného souboru kubeconfig:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. Nastavte proměnnou KUBECONFIG prostředí, aby odkazovala na nový soubor kubeconfig.

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

Autorizujte obory názvů a účty služeb

  • Nakonfigurujte řízení přístupu podle role (RBAC) tak, aby udělil konkrétním subjektům oprávnění používat spravovanou identitu prostřednictvím vazby identity pomocí aplikace tohoto manifestu s následujícím příkazem kubectl apply.

    Poznámka:

    Následující příklad explicitně odkazuje na demo účet služby v demo jmenném prostoru. I když je možné explicitně odkázat na konkrétní služební účet, je také možné odkazovat na kolekci účtů služeb pod subjects. Další informace najdete v tématu Odkazování na témata v dokumentaci 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
    

Vytvoření trezoru klíčů s ochranou před vymazáním a autorizací Azure RBAC

  • Vytvořte trezor klíčů s povolenou ochranou před vymazáním a autorizací Azure RBAC pomocí příkazu az keyvault create s příznaky --enable-purge-protection a --enable-rbac-authorization. Existující trezor klíčů můžete použít také v případě, že je nakonfigurovaný pro ochranu před vymazáním i autorizaci 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
    

Získejte ID prostředku a adresu URL trezoru klíčů

  1. Získejte ID prostředku pro Key Vault pomocí příkazu az keyvault show a nastavte ho jako proměnnou prostředí:

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. Získejte adresu URL trezoru az keyvault show klíčů pomocí příkazu a nastavte ji jako proměnnou prostředí:

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

Konfigurace přístupu k trezoru klíčů a vytvoření tajného kódu

Následující kroky ukazují, jak získat přístup k tajným klíčům, klíčům nebo certifikátům ve službě Azure Key Vault z podu. Příklady v této části konfigurují přístup k tajemstvím v trezoru klíčů pro identitu pracovního zatížení, ale můžete realizovat podobné kroky ke konfiguraci přístupu ke klíčům nebo certifikátům.

Následující příklad ukazuje, jak pomocí modelu oprávnění Azure RBAC udělit podu přístup k trezoru klíčů. Další informace o modelu oprávnění Azure RBAC pro Azure Key Vault najdete v tématu Udělení oprávnění aplikacím pro přístup ke službě Azure Key Vault pomocí Azure RBAC.

  1. Získejte ID objektu přihlášeného uživatele pomocí az ad signed-in-user show příkazu a nastavte ho jako proměnnou prostředí:

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. Přiřaďte si roli důstojníka pro tajemství Azure RBAC Key Vault v trezoru klíčů pomocí příkazu az role assignment create.

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Pomocí příkazu az keyvault secret set vytvořte v trezoru klíčů tajný kód.

    export KEY_VAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name $KEY_VAULT_NAME \
        --name $KEY_VAULT_SECRET_NAME \
        --value "Hello\!"
    
  4. Pomocí příkazu přiřaďte roli uživatele tajných kódů služby Key Vault do UAMI az role assignment create .

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

Přidávání poznámek k účtu služby

  1. Označte účet služby identifikátorem tenanta spravované identity pomocí příkazu kubectl annotate.

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. Pomocí příkazu poznamenejte účet služby identifikátorem klienta spravované identity kubectl annotate.

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

Nasazení ukázkové aplikace

  • Nasaďte ukázkový pod, který používá vazbu identit k získání přístupového tokenu pro spravovanou identitu pro přístup ke službě Azure Key Vault pomocí následujícího kubectl apply příkazu:

    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
    

Ověření přístupu k trezoru klíčů z ukázkové aplikace

  1. Popis podu a potvrzení proměnných prostředí a připojení svazků s projektovaným tokenem jsou k dispozici pomocí kubectl describe pod příkazu.

    kubectl describe pod demo -n demo
    

    Očekávaný výstup by měl obsahovat hodnoty pro AZURE_CLIENT_ID, AZURE_TENANT_IDAZURE_FEDERATED_TOKEN_FILE, , . AZURE_AUTHORITY_HOSTAZURE_KUBERNETES_TOKEN_PROXY AZURE_KUBERNETES_SNI_NAME, a AZURE_KUBERNETES_CA_FILE.

  2. Pomocí příkazu ověřte, že pod může získat token a získat přístup k prostředku kubectl logs .

    kubectl logs demo -n demo
    

    V případě úspěchu by měl být výstup podobný následujícímu příkladu:

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

Škálování vazeb identit napříč několika clustery

Vazby identit umožňují mapování více clusterů AKS na stejné rozhraní UAMI, zatímco stále používají jeden FIC. Pokud chcete škálovat vazby identit napříč několika clustery, můžete zopakovat kroky z části Vytvoření vazby identity prostřednictvím ověření přístupu k trezoru klíčů z ukázkové aplikace pro každý další cluster, který chcete namapovat na stejný UAMI (vytvoření nové vazby identit na cluster).

Vyčistěte zdroje

Pokud už prostředky vytvořené v tomto článku nepotřebujete, můžete je vyčistit, abyste se vyhnuli vzniku budoucích nákladů.

  1. Odstraňte pod pomocí kubectl delete pod příkazu.

    kubectl delete pod demo -n demo
    
  2. Odstraňte obor názvů pomocí kubectl delete ns příkazu.

    kubectl delete ns demo
    
  3. Smažte skupinu prostředků a všechny související prostředky pomocí příkazu az group delete.

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