Använda Microsoft Entra-poddhanterade identiteter i Azure Kubernetes Service (förhandsversion)

Microsoft Entra-poddhanterade identiteter använder Kubernetes-primitiver för att associera hanterade identiteter för Azure-resurser och identiteter i Microsoft Entra-ID med poddar. Administratörer skapar identiteter och bindningar som Kubernetes-primitiver som gör att poddar kan komma åt Azure-resurser som förlitar sig på Microsoft Entra-ID som identitetsprovider.

Viktigt!

Vi rekommenderar att du granskar Microsoft Entras arbetsbelastnings-ID. Den här autentiseringsmetoden ersätter poddhanterad identitet (förhandsversion), som integreras med kubernetes interna funktioner för att federera med externa identitetsprovidrar för programmets räkning.

Den öppen källkod Microsoft Entra-poddhanterade identiteten (förhandsversion) i Azure Kubernetes Service blev inaktuell den 24 september 2022 och projektet arkiverades i september 2023. Mer information finns i utfasningsmeddelandet. AKS Managed-tillägget börjar fasas ut i september 2024.

Om du vill inaktivera det hanterade AKS-tillägget använder du följande kommando: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Innan du börjar

Du måste ha Azure CLI version 2.20.0 eller senare installerad.

Begränsningar

  • Högst 200 poddhanterade identiteter tillåts för ett kluster.
  • Högst 200 poddhanterade identitetsfel tillåts för ett kluster.
  • Poddhanterade identiteter är endast tillgängliga i Linux-nodpooler.
  • Den här funktionen stöds endast för vm-skalningsuppsättningar med säkerhetskopierade kluster.

Installera Azure CLI-tillägget aks-preview

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och anmäl dig. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport på bästa sätt. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Kör följande kommando för att installera aks-preview-tillägget:

az extension add --name aks-preview

Kör följande kommando för att uppdatera till den senaste versionen av tillägget som släpptes:

az extension update --name aks-preview

Registrera funktionsflaggan EnablePodIdentityPreview

Registrera funktionsflaggan EnablePodIdentityPreview med kommandot az feature register , som du ser i följande exempel:

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Det tar några minuter för statusen att visa Registrerad. Kontrollera registreringsstatusen med kommandot az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

När statusen visar Registrerad uppdaterar du registreringen av Resursprovidern Microsoft.ContainerService med hjälp av kommandot az provider register :

az provider register --namespace Microsoft.ContainerService

Alternativ för åtgärdsläge

Microsoft Entra poddhanterad identitet stöder två driftslägen:

  • Standardläge: I det här läget distribueras följande två komponenter till AKS-klustret:
    • Managed Identity Controller (MIC): En MIC är en Kubernetes-styrenhet som bevakar ändringar i poddar, AzureIdentity och AzureIdentityBinding via Kubernetes API Server. När den identifierar en relevant ändring lägger MIC till eller tar bort AzureAssignedIdentity efter behov. När en podd schemaläggs tilldelar MIC den hanterade identiteten i Azure till den underliggande vm-skalningsuppsättningen som används av nodpoolen under fasen för att skapa den. När alla poddar som använder identiteten tas bort tas identiteten bort från nodpoolens vm-skalningsuppsättning, såvida inte samma hanterade identitet används av andra poddar. MIC vidtar liknande åtgärder när AzureIdentity eller AzureIdentityBinding skapas eller tas bort.
    • Nodhanterad identitet (NMI): NMI är en podd som körs som en DaemonSet på varje nod i AKS-klustret. NMI fångar upp begäranden om säkerhetstoken till Azure Instance Metadata Service på varje nod, omdirigerar dem till sig själv och verifierar om podden har åtkomst till den identitet som den begär en token för och hämtar token från Microsoft Entra-klienten för programmets räkning.
  • Hanterat läge: Det här läget erbjuder endast NMI. När det installeras via AKS-klustertillägget hanterar Azure skapandet av Kubernetes-primitiver (AzureIdentity och AzureIdentityBinding) och identitetstilldelning som svar på CLI-kommandon från användaren. Annars måste identiteten tilldelas och hanteras manuellt av användaren om den installeras via Helm-diagrammet. Mer information finns i Poddidentitet i hanterat läge.

När du installerar Microsoft Entra-poddhanterad identitet via Helm-diagrammet eller YAML-manifestet enligt installationsguiden kan du välja mellan standard läget ochmanaged. Om du i stället bestämmer dig för att installera microsoft Entra-poddhanterad identitet med hjälp av AKS-klustertillägget enligt beskrivningen i den här artikeln använder managed installationen läget.

Skapa ett AKS-kluster med Azure Container Networking Interface (CNI)

Kommentar

Det här är den rekommenderade standardkonfigurationen

Skapa ett AKS-kluster med Azure CNI och poddhanterad identitet aktiverad. Följande kommandon använder az group create för att skapa en resursgrupp med namnet myResourceGroup och kommandot az aks create för att skapa ett AKS-kluster med namnet myAKSCluster i resursgruppen myResourceGroup .

az group create --name myResourceGroup --location eastus
az aks create -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

Använd az aks get-credentials för att logga in på ditt AKS-kluster. Det här kommandot laddar också ned och konfigurerar kubectl klientcertifikatet på utvecklingsdatorn.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Kommentar

När du aktiverar poddhanterad identitet i ditt AKS-kluster läggs ett AzurePodIdentityException med namnet aks-addon-exception till i kube-system-namnområdet . Med En AzurePodIdentityException kan poddar med vissa etiketter komma åt SLUTpunkten för Azure Instance Metadata Service (IMDS) utan att fångas upp av NMI-servern. Aks-addon-exception tillåter AKS-tillägg från första part, till exempel Microsoft Entra-poddhanterad identitet, att fungera utan att behöva konfigurera en AzurePodIdentityException manuellt. Du kan också lägga till, ta bort och uppdatera en AzurePodIdentityException med hjälp av az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception updateeller kubectl.

Uppdatera ett befintligt AKS-kluster med Azure CNI

Uppdatera ett befintligt AKS-kluster med Azure CNI för att inkludera poddhanterad identitet.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

Använda Kubenet-nätverksinsticksprogrammet med Microsoft Entra-poddhanterade identiteter

Viktigt!

Att köra Microsoft Entra-poddhanterad identitet i ett kluster med Kubenet är inte en rekommenderad konfiguration på grund av säkerhetsproblem. Kubenet-standardkonfigurationen förhindrar inte förfalskning av ARP, som kan användas av en podd för att fungera som en annan podd och få åtkomst till en identitet som den inte är avsedd att ha. Följ åtgärdsstegen och konfigurera principer innan du aktiverar Microsoft Entra-poddhanterad identitet i ett kluster med Kubenet.

Åtgärd

För att minska sårbarheten på klusternivå kan du använda den inbyggda Azure-principen "Kubernetes-klustercontainrar bör endast använda tillåtna funktioner" för att begränsa CAP_NET_RAW attack.

Lägg till NET_RAW till "Nödvändiga släppfunktioner"

image

Om du inte använder Azure Policy kan du använda OpenPolicyAgent-antagningskontrollanten tillsammans med Gatekeeper som validerar webhooken. Förutsatt att du redan har Gatekeeper installerat i klustret lägger du till ConstraintTemplate av typen K8sPSPCapabilities:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

Lägg till en mall för att begränsa yngningen av poddar med funktionen NET_RAW:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Skapa ett AKS-kluster med Kubenet-nätverksinsticksprogrammet

Skapa ett AKS-kluster med Kubenet-nätverks-plugin och poddhanterad identitet aktiverad.

az aks create -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Uppdatera ett befintligt AKS-kluster med Kubenet-nätverksinsticksprogrammet

Uppdatera ett befintligt AKS-kluster med Kubenet-nätverksinsticksprogrammet så att det innehåller poddhanterad identitet.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Skapa en identitet

Viktigt!

Du måste ha relevanta behörigheter (till exempel Ägare) för din prenumeration för att skapa identiteten.

Skapa en identitet som ska användas av demopodden med az identity create och ange variablerna IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_ID .

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

Tilldela behörigheter för den hanterade identiteten

Den hanterade identitet som ska tilldelas till podden måste beviljas behörigheter som överensstämmer med de åtgärder som den kommer att vidta.

Om du vill köra demonstrationen måste den IDENTITY_CLIENT_ID hanterade identiteten ha behörighet som deltagare för virtuell dator i resursgruppen som innehåller VM-skalningsuppsättningen för ditt AKS-kluster.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show -n $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Skapa en poddidentitet

Skapa en poddhanterad identitet för klustret med hjälp av az aks pod-identity add.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

Kommentar

"POD_IDENTITY_NAME" måste vara ett giltigt DNS-underdomännamn enligt definitionen i RFC 1123.

Kommentar

När du tilldelar den poddhanterade identiteten med hjälp pod-identity addav försöker Azure CLI bevilja rollen Hanterad identitetsoperator över den poddhanterade identiteten (IDENTITY_RESOURCE_ID) till klusteridentiteten.

Azure skapar en AzureIdentity-resurs i klustret som representerar identiteten i Azure och en AzureIdentityBinding-resurs som ansluter AzureIdentity till en väljare. Du kan visa dessa resurser med

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

Köra ett exempelprogram

För att en podd ska kunna använda Microsoft Entra poddhanterad identitet behöver podden en aadpodidbinding-etikett med ett värde som matchar en väljare från en AzureIdentityBinding. Som standard matchar väljaren namnet på den poddhanterade identiteten, men den kan också anges med hjälp av --binding-selector alternativet när du anropar az aks pod-identity add.

Om du vill köra ett exempelprogram med microsoft entra poddhanterad identitet skapar du en demo.yaml fil med följande innehåll. Ersätt POD_IDENTITY_NAME, IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_GROUP med värdena från föregående steg. Ersätt SUBSCRIPTION_ID med ditt prenumerations-ID.

Kommentar

I föregående steg skapade du variablerna POD_IDENTITY_NAME, IDENTITY_CLIENT_ID och IDENTITY_RESOURCE_GROUP . Du kan använda ett kommando som till exempel för att visa det värde som echo du har angett för variabler, till exempel echo $POD_IDENTITY_NAME.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Observera att podddefinitionen har en aadpodidbinding-etikett med ett värde som matchar namnet på den poddhanterade identitet som du körde az aks pod-identity add i föregående steg.

Distribuera demo.yaml till samma namnområde som din poddhanterade identitet med hjälp av kubectl apply:

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

Kontrollera att exempelprogrammet körs med .kubectl logs

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Kontrollera att loggarna visar att en token har hämtats och att GET-åtgärden lyckas.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

Köra ett program med flera identiteter

Om du vill att ett program ska kunna använda flera identiteter anger du --binding-selector till samma väljare när du skapar poddidentiteter.

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

Ange sedan fältet aadpodidbinding i din podd-YAML till den bindningsväljare som du har angett.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

Inaktivera poddhanterad identitet i ett befintligt kluster

Om du vill inaktivera poddhanterad identitet i ett befintligt kluster tar du bort de poddhanterade identiteterna från klustret. Inaktivera sedan funktionen i klustret.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

Rensa

Om du vill ta bort en Microsoft Entra-poddhanterad identitet från klustret tar du bort exempelprogrammet och den poddhanterade identiteten från klustret. Ta sedan bort identiteten och rolltilldelningen för klusteridentiteten.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Nästa steg

Mer information om hanterade identiteter finns i Hanterade identiteter för Azure-resurser.