Door Microsoft Entra beheerde identiteiten gebruiken in Azure Kubernetes Service (preview)

Door Microsoft Entra beheerde identiteiten maken gebruik van Kubernetes-primitieven om beheerde identiteiten te koppelen voor Azure-resources en -identiteiten in Microsoft Entra-id met pods. Beheer istrators maken identiteiten en bindingen als Kubernetes-primitieven waarmee pods toegang hebben tot Azure-resources die afhankelijk zijn van Microsoft Entra-id als id-provider.

Belangrijk

We raden u aan Microsoft Entra Workload-ID te bekijken. Deze verificatiemethode vervangt door pod beheerde identiteit (preview), die wordt geïntegreerd met de systeemeigen kubernetes-mogelijkheden om te federeren met externe id-providers namens de toepassing.

De open source door Microsoft Entra beheerde identiteit (preview) in Azure Kubernetes Service is afgeschaft op 24-10-2022 en het project dat in september 2023 is gearchiveerd. Zie de afschaffingsmelding voor meer informatie. De door AKS beheerde invoegtoepassing wordt in september 2024 afgeschaft.

Gebruik de volgende opdracht om de door AKS beheerde invoegtoepassing uit te schakelen: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Voordat u begint

U moet Azure CLI versie 2.20.0 of hoger hebben geïnstalleerd.

Beperkingen

  • Maximaal 200 door pods beheerde identiteiten zijn toegestaan voor een cluster.
  • Voor een cluster zijn maximaal 200 door pods beheerde identiteitsonderzondering toegestaan.
  • Door pods beheerde identiteiten zijn alleen beschikbaar in Linux-knooppuntgroepen.
  • Deze functie wordt alleen ondersteund voor clusters met virtuele-machineschaalsets.

De Azure CLI-extensie aks-preview installeren

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

Voer de volgende opdracht uit om de aks-preview-extensie te installeren:

az extension add --name aks-preview

Voer de volgende opdracht uit om bij te werken naar de nieuwste versie van de extensie die is uitgebracht:

az extension update --name aks-preview

De functievlag EnablePodIdentityPreview registreren

Registreer de EnablePodIdentityPreview functievlag met behulp van de opdracht az feature register , zoals wordt weergegeven in het volgende voorbeeld:

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

Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven. Controleer de registratiestatus met behulp van de opdracht az feature show :

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

Wanneer de status Geregistreerd is, vernieuwt u de registratie van de Resourceprovider Microsoft.ContainerService met behulp van de opdracht az provider register:

az provider register --namespace Microsoft.ContainerService

Opties voor de bewerkingsmodus

Door Microsoft Entra beheerde identiteit ondersteunt twee bewerkingsmodi:

  • Standaardmodus: In deze modus worden de volgende twee onderdelen geïmplementeerd in het AKS-cluster:
    • Managed Identity Controller (MIC):een MIC is een Kubernetes-controller die controleert op wijzigingen in pods, AzureIdentity en AzureIdentityBinding via de Kubernetes-API-server. Wanneer een relevante wijziging wordt gedetecteerd, voegt de MIC azureAssignedIdentity toe of verwijdert deze indien nodig. Wanneer een pod is gepland, wijst de MIC de beheerde identiteit in Azure toe aan de onderliggende virtuele-machineschaalset die tijdens de aanmaakfase door de knooppuntgroep wordt gebruikt. Wanneer alle pods met de identiteit worden verwijderd, wordt de identiteit verwijderd uit de virtuele-machineschaalset van de knooppuntgroep, tenzij dezelfde beheerde identiteit wordt gebruikt door andere pods. De MIC voert vergelijkbare acties uit wanneer AzureIdentity of AzureIdentityBinding wordt gemaakt of verwijderd.
    • Managed Identity (NMI): NMI is een pod die wordt uitgevoerd als een DaemonSet op elk knooppunt in het AKS-cluster. NMI onderschept beveiligingstokenaanvragen naar de Azure Instance Metadata Service op elk knooppunt, leidt deze om naar zichzelf en valideert of de pod toegang heeft tot de identiteit waarvoor het een token aanvraagt en het token ophaalt uit de Microsoft Entra-tenant namens de toepassing.
  • Beheerde modus: deze modus biedt alleen NMI. Wanneer Azure is geïnstalleerd via de AKS-clusterinvoegtoepassing, beheert Azure het maken van Kubernetes primitives (AzureIdentity en AzureIdentityBinding) en identiteitstoewijzing als reactie op CLI-opdrachten van de gebruiker. Anders moet, indien geïnstalleerd via Helm-grafiek, de identiteit handmatig worden toegewezen en beheerd door de gebruiker. Zie Pod-identiteit in de beheerde modus voor meer informatie.

Wanneer u de door Microsoft Entra-pod beheerde identiteit installeert via helm-grafiek of YAML-manifest, zoals wordt weergegeven in de installatiehandleiding, kunt u kiezen tussen de standard ene modus managed . Als u in plaats daarvan besluit om de door Microsoft Entra-pod beheerde identiteit te installeren met behulp van de invoegtoepassing AKS-cluster, zoals wordt weergegeven in dit artikel, wordt de managed modus gebruikt.

Een AKS-cluster maken met Azure Container Networking Interface (CNI)

Notitie

Dit is de standaard aanbevolen configuratie

Maak een AKS-cluster waarvoor Azure CNI en door pods beheerde identiteit is ingeschakeld. De volgende opdrachten gebruiken az group create om een resourcegroep met de naam myResourceGroup en de opdracht az aks create te maken om een AKS-cluster met de naam myAKSCluster te maken in de resourcegroep myResourceGroup .

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

Gebruik az aks get-credentials om u aan te melden bij uw AKS-cluster. Met deze opdracht wordt ook het kubectl clientcertificaat op uw ontwikkelcomputer gedownload en geconfigureerd.

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

Notitie

Wanneer u een door pod beheerde identiteit inschakelt in uw AKS-cluster, wordt een AzurePodIdentityException met de naam aks-addon-exception toegevoegd aan de kube-system-naamruimte . Met een AzurePodIdentityException hebben pods met bepaalde labels toegang tot het EINDPUNT van de Azure Instance Metadata Service (IMDS) zonder dat ze worden onderschept door de NMI-server. Met de aks-addon-exception kunnen AKS first party-invoegtoepassingen, zoals door Microsoft Entra-pods beheerde identiteit, werken zonder dat u handmatig een AzurePodIdentityException hoeft te configureren. U kunt eventueel een AzurePodIdentityException toevoegen, verwijderen en bijwerken met behulp van az aks pod-identity exception add, az aks pod-identity exception deleteof az aks pod-identity exception updatekubectl.

Een bestaand AKS-cluster bijwerken met Azure CNI

Werk een bestaand AKS-cluster bij met Azure CNI om een door pod beheerde identiteit op te nemen.

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

Kubenet-netwerkinvoegtoepassing gebruiken met door Microsoft Entra beheerde identiteiten

Belangrijk

Het uitvoeren van door Microsoft Entra-pods beheerde identiteit in een cluster met Kubenet is geen aanbevolen configuratie vanwege beveiligingsproblemen. De standaard Kubenet-configuratie voorkomt niet dat ARP-adresvervalsing wordt gebruikt, die door een pod kan worden gebruikt om als een andere pod te fungeren en toegang te krijgen tot een identiteit die niet bedoeld is. Volg de beperkingsstappen en configureer beleidsregels voordat u een door Microsoft Entra-pod beheerde identiteit inschakelt in een cluster met Kubenet.

Oplossing

Als u het beveiligingsprobleem op clusterniveau wilt beperken, kunt u het ingebouwde Azure-beleid 'Kubernetes-clustercontainers mogen alleen toegestane mogelijkheden gebruiken' gebruiken om de CAP_NET_RAW-aanval te beperken.

Voeg NET_RAW toe aan 'Vereiste drop capabilities'

image

Als u azure Policy niet gebruikt, kunt u de OpenPolicyAgent-toegangscontroller gebruiken samen met Gatekeeper die webhook valideert. Als u Gatekeeper al hebt geïnstalleerd in uw cluster, voegt u de ConstraintTemplate van het type K8sPSPCapabilities toe:

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

Voeg een sjabloon toe om het spawnen van pods te beperken met de NET_RAW mogelijkheid:

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"]

Een AKS-cluster maken met de Kubenet-netwerkinvoegtoepassing

Maak een AKS-cluster met kubenet-netwerkinvoegtoepassing en door pods beheerde identiteit ingeschakeld.

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

Een bestaand AKS-cluster bijwerken met de Kubenet-netwerkinvoegtoepassing

Werk een bestaand AKS-cluster bij met de Kubenet-netwerkinvoegtoepassing om een door pod beheerde identiteit op te nemen.

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

Een identiteit maken

Belangrijk

U moet de relevante machtigingen (bijvoorbeeld Eigenaar) voor uw abonnement hebben om de identiteit te maken.

Maak een identiteit die wordt gebruikt door de demopod met az identity create en stel de IDENTITY_CLIENT_ID en IDENTITY_RESOURCE_ID variabelen in.

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)"

Machtigingen toewijzen voor de beheerde identiteit

De beheerde identiteit die aan de pod wordt toegewezen, moet machtigingen krijgen die zijn afgestemd op de acties die worden uitgevoerd.

Als u de demo wilt uitvoeren, moet de IDENTITY_CLIENT_ID beheerde identiteit machtigingen voor inzender voor virtuele machines hebben in de resourcegroep die de virtuele-machineschaalset van uw AKS-cluster bevat.

# 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

Een pod-identiteit maken

Maak een door pod beheerde identiteit voor het cluster met behulp van 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}

Notitie

De 'POD_IDENTITY_NAME' moet een geldige DNS-subdomeinnaam zijn, zoals gedefinieerd in RFC 1123.

Notitie

Wanneer u de door pod beheerde identiteit toewijst met behulp van pod-identity add, probeert de Azure CLI de rol Managed Identity Operator toe te wijzen aan de door pod beheerde identiteit (IDENTITY_RESOURCE_ID) aan de clusteridentiteit.

Azure maakt een AzureIdentity-resource in uw cluster die de identiteit in Azure vertegenwoordigt en een AzureIdentityBinding-resource die de AzureIdentity verbindt met een selector. U kunt deze resources weergeven met

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

Een voorbeeldtoepassing uitvoeren

Voor een pod om een door Microsoft Entra-pod beheerde identiteit te kunnen gebruiken, heeft de pod een aadpodidbinding-label nodig met een waarde die overeenkomt met een selector uit een AzureIdentityBinding. Standaard komt de selector overeen met de naam van de door pod beheerde identiteit, maar deze kan ook worden ingesteld met behulp van de optie bij het --binding-selector aanroepen az aks pod-identity add.

Als u een voorbeeldtoepassing wilt uitvoeren met behulp van een door Microsoft Entra-pod beheerde identiteit, maakt u een demo.yaml bestand met de volgende inhoud. Vervang POD_IDENTITY_NAME, IDENTITY_CLIENT_ID en IDENTITY_RESOURCE_GROUP door de waarden uit de vorige stappen. Vervang SUBSCRIPTION_ID door uw abonnements-id.

Notitie

In de vorige stappen hebt u de variabelen POD_IDENTITY_NAME, IDENTITY_CLIENT_ID en IDENTITY_RESOURCE_GROUP gemaakt. U kunt een opdracht gebruiken, bijvoorbeeld echo om de waarde weer te geven die u hebt ingesteld voor variabelen 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

U ziet dat de poddefinitie een aadpodidbinding-label heeft met een waarde die overeenkomt met de naam van de door pod beheerde identiteit die u in de vorige stap hebt uitgevoerd az aks pod-identity add .

Implementeer demo.yaml in dezelfde naamruimte als uw door pod beheerde identiteit met behulp van kubectl apply:

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

Controleer of de voorbeeldtoepassing is uitgevoerd met behulp van kubectl logs.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Controleer of in de logboeken een token is verkregen en of de GET-bewerking is geslaagd.

...
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
...

Een toepassing met meerdere identiteiten uitvoeren

Als u wilt dat een toepassing meerdere identiteiten gebruikt, stelt u de --binding-selector kiezer in op dezelfde selector bij het maken van pod-identiteiten.

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

Stel vervolgens het aadpodidbinding veld in uw pod YAML in op de bindingselector die u hebt opgegeven.

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

Door pod beheerde identiteit op een bestaand cluster uitschakelen

Als u een door pod beheerde identiteit wilt uitschakelen op een bestaand cluster, verwijdert u de door pod beheerde identiteiten uit het cluster. Schakel vervolgens de functie in het cluster uit.

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

Opschonen

Als u een door Microsoft Entra-pod beheerde identiteit uit uw cluster wilt verwijderen, verwijdert u de voorbeeldtoepassing en de door pod beheerde identiteit uit het cluster. Verwijder vervolgens de identiteit en de roltoewijzing van de clusteridentiteit.

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"

Volgende stappen

Zie Beheerde identiteiten voor Azure-resources voor meer informatie over beheerde identiteiten.