Konfigurera identitetsbindningar på Azure Kubernetes Service (AKS)

Konfigurera identitetsbindningar i dina AkS-kluster (Azure Kubernetes Service) för att mappa en användartilldelad hanterad identitet (UAMI) över flera kluster när du använder en enda federerad identitetsautentisering (FIC). Den här konfigurationen hjälper dig att skala Microsoft Entra-autentisering för arbetsbelastningar utan att överskrida FIC-gränserna.

Förutsättningar

  • Granska begrepp för identitetsbindningar för att förstå hur identitetsbindningar fungerar.
  • Azure CLI version 2.73.0 eller senare. Om du vill kontrollera din version använder du az version kommandot . Information om hur du installerar eller uppdaterar Azure CLI finns i Installera Azure CLI.
  • Du behöver följande Azure-behörigheter för identitets- och klusteromfånget: Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write och Microsoft.ContainerService/managedClusters/write.
  • Du behöver Behörigheter för Kubernetes-klusteradministratör (eller motsvarande) för att skapa ClusterRole och ClusterRoleBinding resurser.

Begränsningar

Skapa testresurser

  1. Skapa en Azure-resursgrupp med kommandot az group create .

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Skapa ett AKS-kluster med aktiverad arbetsbelastningsidentitet och OIDC-utfärdare med hjälp av az aks create-kommandot och flaggorna --enable-workload-identity och --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. Skapa en användartilldelad hanterad identitet (UAMI) med kommandot az identity create .

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

Hämta UAMI-ID:t

  • Hämta resurs-, huvud-, klient- och klient-ID:t för UAMI och ange dem som miljövariabler med hjälp av följande az identity show kommandon:

    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)
    

Skapa en identitetsbindning

  • Mappa UAMI till AKS-klustret med en identitetsbindning med kommandot 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
    

    Anmärkning

    När du skapar en identitetsbindning skapar AKS automatiskt en federerad identitetsautentisering (FIC) med namnet aks-identity-binding under UAMI. Den här autentiseringsuppgiften hanteras av AKS. Ändra eller ta inte bort den när identitetsbindningar används. Den FIC som skapats för identitetsbindningar delas över alla identitetsbindningar som refererar till samma UAMI.

Hämta OIDC-utfärdarens URL för UAMI

  • Hämta url:en för OIDC-utfärdaren som är associerad med UAMI genom att granska identitetsbindningen med kommandot az aks identity-binding show .

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

    Komprimerade exempelutdata:

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

Ansluta till AKS-klustret

  1. Hämta autentiseringsuppgifterna för AKS-klustret med kommandot az aks get-credentials och spara dem i en separat kubeconfig-fil:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. KUBECONFIG Ange miljövariabeln så att den pekar på den nya kubeconfig-filen:

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

Auktorisera namnområden och tjänstkonton

  • Konfigurera rollbaserad åtkomstkontroll (RBAC) för att ge specifika entiteter behörighet att använda den hanterade identiteten via identitetsbindning genom att tillämpa följande manifest med kommandot kubectl apply.

    Anmärkning

    Följande exempel refererar uttryckligen till demo tjänstkontot i demo namnområdet. Det är ett alternativ att uttryckligen referera till ett specifikt tjänstkonto, men det är också möjligt att referera till en samling tjänstkonton under subjects. Mer information finns i Referera till ämnen i Kubernetes-dokumentationen.

    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
    

Skapa ett nyckelvalv med rensningsskydd och Azure RBAC-auktorisering

  • Skapa ett nyckelvalv med rensningsskydd och Azure RBAC-auktorisering aktiverat med kommandot az keyvault create med flaggorna --enable-purge-protection och --enable-rbac-authorization . Du kan också använda ett befintligt nyckelvalv om det är konfigurerat för både rensningsskydd och Azure RBAC-auktorisering.

    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
    

Hämta resurs-ID och URL för nyckelvalvet

  1. Hämta resurs-ID:t för nyckelvalvet med kommandot az keyvault show och ange det som en miljövariabel:

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. Hämta key vault-URL:en med kommandot az keyvault show och ange den som en miljövariabel:

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

Konfigurera åtkomst till key vault och skapa hemlighet

Följande steg visar hur du kommer åt hemligheter, nycklar eller certifikat i Azure Key Vault från podden. Exemplen i det här avsnittet konfigurerar åtkomst till hemligheter i nyckelvalvet för arbetsbelastningsidentiteten, men du kan utföra liknande steg för att konfigurera åtkomst till nycklar eller certifikat.

I följande exempel visas hur du använder Azure RBAC-behörighetsmodellen för att ge podden åtkomst till nyckelvalvet. Mer information om Azure RBAC-behörighetsmodellen för Azure Key Vault finns i Bevilja behörighet till program för åtkomst till Azure Key Vault med hjälp av Azure RBAC.

  1. Hämta objekt-ID för den inloggade användaren med kommandot az ad signed-in-user show och ange det som en miljövariabel:

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. Tilldela dig själv rollen Azure RBAC Key Vault Secrets Officer i nyckelvalvet med hjälp av az role assignment create kommandot .

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Skapa en hemlighet i nyckelvalvet med kommandot 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. Tilldela rollen Key Vault Secrets User till UAMI med hjälp av az role assignment create kommandot .

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

Kommentera tjänstkonto

  1. Kommentera tjänstkontot med det hanterade identitetsklient-ID:t med hjälp av kubectl annotate kommandot .

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. Kommentera tjänstkontot med det hanterade identitetsklient-ID:t med hjälp av kubectl annotate kommandot .

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

Distribuera exempelprogram

  • Distribuera exempelpodden som använder identitetsbindning för att hämta en åtkomsttoken för den hanterade identiteten för att få åtkomst till Azure Key Vault med hjälp av följande kubectl apply kommando:

    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
    

Kontrollera åtkomsten till nyckelvalvet från exempelprogrammet

  1. Beskriv podden och bekräfta att miljövariabler och projicerade tokenvolymmonteringar finns med kommandot kubectl describe pod.

    kubectl describe pod demo -n demo
    

    Förväntade utdata ska innehålla värden för AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_FEDERATED_TOKEN_FILE, AZURE_AUTHORITY_HOST, AZURE_KUBERNETES_TOKEN_PROXY. AZURE_KUBERNETES_SNI_NAME, och AZURE_KUBERNETES_CA_FILE.

  2. Kontrollera att podden kan hämta en token och komma åt resursen med hjälp av kubectl logs kommandot .

    kubectl logs demo -n demo
    

    Om det lyckas bör utdata likna följande exempel:

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

Skala identitetsbindningar över flera kluster

Med identitetsbindningar kan du mappa flera AKS-kluster till samma UAMI medan du fortfarande använder en enda FIC. Om du vill skala identitetsbindningar mellan flera kluster kan du upprepa stegen från Skapa en identitetsbindning genom att verifiera åtkomsten till nyckelvalvet från exempelprogrammet för varje extra kluster som du vill mappa till samma UAMI (skapa en ny identitetsbindning per kluster).

Rensa resurser

Om du inte längre behöver de resurser som du skapade i den här artikeln kan du rensa dem för att undvika framtida kostnader.

  1. Ta bort podden med kommandot kubectl delete pod .

    kubectl delete pod demo -n demo
    
  2. Ta bort namnområdet med kommandot kubectl delete ns .

    kubectl delete ns demo
    
  3. Ta bort resursgruppen och alla relaterade resurser med kommandot az group delete .

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