Verwenden von podseitig verwalteten Microsoft Entra-Identitäten in Azure Kubernetes Service (Vorschau)

Vom Pod verwaltete Microsoft Entra-Identitäten verwenden Kubernetes-Primitive, um verwaltete Identitäten für Azure-Ressourcen und Identitäten in Microsoft Entra ID zu Pods zuzuordnen. Administrator*innen erstellen Identitäten und Bindungen als Kubernetes-Primitive, die Pods den Zugriff auf Azure-Ressourcen ermöglichen, für die Microsoft Entra ID als Identitätsanbieter genutzt wird.

Wichtig

Lesen Sie den Artikel zu Microsoft Entra-Workload-IDs. Diese Authentifizierungsmethode ersetzt verwaltete Podidentitäten (Vorschauversion), die in die nativen Kubernetes-Funktionen integriert werden, um im Namen der Anwendung einen Verbund mit externen Identitätsanbietern einzugehen.

Die Podseitig verwaltete Open-Source-Identität von Microsoft Entra (Vorschau) in Azure Kubernetes Service wurde zum 24.10.2022 eingestellt, und das Projekt wurde im September 2023 archiviert. Weitere Informationen finden Sie im Hinweis zur Einstellung. Das Add-On für verwaltete Identitäten in AKS wird im September 2024 eingestellt.

Verwenden Sie den folgenden Befehl, um das AKS-verwaltete Add-On zu deaktivieren: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Voraussetzungen

Hierfür muss Azure CLI-Version 2.20.0 oder höher installiert sein.

Einschränkungen

  • Für einen Cluster sind maximal 200 Podidentitäten zulässig.
  • Für einen Cluster sind maximal 200 Ausnahmen für verwaltete Podidentitäten zulässig.
  • Verwaltete Podidentitäten sind nur in Linux-Knotenpools verfügbar.
  • Diese Funktion wird nur für Back-End-Cluster für Virtual Machine Scale Sets unterstützt.

Installieren der Azure CLI-Erweiterung „aks-preview“

Wichtig

AKS-Previewfunktionen stehen gemäß dem Self-Service- und Aktivierungsprinzip zur Verfügung. Vorschauversionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von den Vereinbarungen zum Service Level und der eingeschränkten Garantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

Führen Sie den folgenden Befehl aus, um die Erweiterung „aks-preview“ zu installieren:

az extension add --name aks-preview

Führen Sie den folgenden Befehl aus, um ein Update auf die neueste veröffentlichte Version der Erweiterung durchzuführen:

az extension update --name aks-preview

Registrieren des Featureflags „EnablePodIdentityPreview“

Registrieren Sie das Featureflag EnablePodIdentityPreview mithilfe des Befehls EnablePodIdentityPreview, wie im folgenden Beispiel gezeigt:

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

Es dauert einige Minuten, bis der Status Registered (Registriert) angezeigt wird. Überprüfen Sie den Registrierungsstatus mithilfe des Befehls az feature show:

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

Wenn der Status Registriert lautet, aktualisieren Sie die Registrierung des Ressourcenanbieters Microsoft.ContainerService mithilfe des Befehls az provider register:

az provider register --namespace Microsoft.ContainerService

Betriebsmodusoptionen

Eine vom Pod verwaltete Microsoft Entra-Identität unterstützt zwei Betriebsmodi:

  • Standardmodus: In diesem Modus werden die beiden folgenden Komponenten im AKS-Cluster bereitgestellt:
    • Managed Identity Controller (MIC): Ein MIC ist ein Kubernetes-Controller, der das System über den Kubernetes-API-Server auf Änderungen an Pods, AzureIdentity und AzureIdentityBinding überwacht. Wenn eine relevante Änderung erkannt wird, fügt der MIC nach Bedarf AzureAssignedIdentity hinzu oder löscht sie. Insbesondere bei der Planung eines Pods weist der MIC die verwaltete Identität in Azure der zugrunde liegenden VM-Skalierungsgruppe zu, die während der Erstellungsphase vom Knotenpool verwendet wird. Wenn alle Pods, die die Identität verwenden, gelöscht werden, wird die Identität aus der VM-Skalierungsgruppe des Knotenpools entfernt – es sei denn, die gleiche verwaltete Identität wird von anderen Pods verwendet. Der MIC führt ähnliche Aktionen aus, wenn AzureIdentity oder AzureIdentityBinding erstellt oder gelöscht werden.
    • Node Management Identity (NMI): NMI ist ein Pod, der auf jedem Knoten im AKS-Cluster als DaemonSet ausgeführt wird. NMI fängt Sicherheitstokenanforderungen an den Azure Instance Metadata Service auf jedem Knoten ab, leitet sie an sich selbst weiter und überprüft, ob der Pod Zugriff auf die Identität hat, für die er ein Token anfordert. Anschließend wird das Token im Auftrag der Anwendung vom Microsoft Entra-Mandanten abgerufen.
  • Verwalteter Modus: Dieser Modus bietet nur NMI. Bei der Installation über das AKS-Cluster-Add-On verwaltet Azure die Erstellung von Kubernetes-Primitiven (AzureIdentity und AzureIdentityBinding) und die Identitätszuweisung als Reaktion auf CLI-Befehle von Benutzer*innen. Andernfalls muss die Identität bei der Installation über ein Helm-Chart manuell zugewiesen und von den Benutzer*innen verwaltet werden. Weitere Informationen finden Sie unter Podidentität im verwalteten Modus.

Wenn Sie die vom Pod verwaltete Microsoft Entra-Identität mit einem Helm-Chart oder YAML-Manifest installieren (wie im Installationsleitfaden gezeigt), können Sie zwischen den Modi standard und managed wählen. Wenn Sie die vom Pod verwaltete Microsoft Entra-Identität stattdessen mithilfe des AKS-Cluster-Add-Ons installieren (wie in diesem Artikel gezeigt), verwendet das Setup den Modus managed.

Erstellen eines AKS-Clusters mit Azure Container Networking Interface (CNI)

Hinweis

Dies ist die standardmäßig empfohlene Konfiguration.

Erstellen Sie einen AKS-Cluster mit Azure CNI, für den eine verwaltete Podidentität aktiviert ist. Im Folgenden wird der Befehl az group create verwendet, um eine Ressourcengruppe mit dem Namen myResourceGroup zu erstellen, und der Befehl az aks create, um in der Ressourcengruppe myResourceGroup einen AKS-Cluster mit dem Namen myAKSCluster zu erstellen.

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

Verwenden Sie az aks get-credentials, um sich bei Ihrem AKS-Cluster anzumelden. Mit diesem Befehl wird auch das kubectl-Clientzertifikat auf Ihren Entwicklungscomputer heruntergeladen und konfiguriert.

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

Hinweis

Wenn Sie verwaltete Podidentitäten in Ihrem AKS-Cluster aktivieren, wird dem Namespace kube-system eine AzurePodIdentityException mit dem Namen aks-addon-exception hinzugefügt. AzurePodIdentityException ermöglicht Pods mit bestimmten Bezeichnungen den Zugriff auf den Azure Instance Metadata Service-Endpunkt (IMDS), ohne vom NMI-Server abgefangen zu werden. Mit aks-addon-exception können AKS-Erstanbieter-Add-Ons, z. B. eine vom Pod verwaltete Microsoft Entra-Identität, ausgeführt werden, ohne dass manuell eine AzurePodIdentityException konfiguriert werden muss. Optional können Sie ein AzurePodIdentityException-Element hinzufügen, entfernen und aktualisieren, indem Sie az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update oder kubectl verwenden.

Aktualisieren eines vorhandenen AKS-Clusters mit Azure CNI

Aktualisieren Sie einen vorhandenen AKS-Cluster mit Azure CNI, um eine verwaltete Podidentität zu integrieren.

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

Verwenden des Kubenet-Netzwerk-Plug-Ins mit vom Pod verwalteten Microsoft Entra-Identitäten

Wichtig

Das Ausführen einer vom Pod verwalteten Microsoft Entra-Identität in einem Cluster mit Kubenet ist aufgrund der Sicherheitsimplikationen keine empfohlene Konfiguration. Die kubenet-Standardkonfiguration verhindert nicht das ARP-Spoofing, das von einem Pod verwendet werden kann, um als ein anderer Pod zu agieren und Zugriff auf eine nicht vorgesehene Identität zu erhalten. Führen Sie die Schritte zur Risikominderung aus, und konfigurieren Sie Richtlinien, bevor Sie eine vom Pod verwaltete Microsoft Entra-Identität in einem Cluster mit Kubenet aktivieren.

Abhilfe

Um das Sicherheitsrisiko auf Clusterebene zu minimieren, können Sie CAP_NET_RAW-Angriffe mithilfe der integrierten Azure-Richtlinie „Container in einem Kubernetes-Cluster dürfen nur zulässige Funktionen verwenden“ begrenzen.

Fügen Sie NET_RAW zu „Zu löschende Funktionen“ hinzu:

image

Wenn Sie Azure Policy nicht nutzen, können Sie den OpenPolicyAgent-Zugriffscontroller zusammen mit dem Gatekeeper-Webhook „Validating“ verwenden. Wenn Sie Gatekeeper bereits in Ihrem Cluster installiert haben, fügen Sie das ConstraintTemplate vom Typ „K8sPSPCapabilities“ hinzu:

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

Fügen Sie eine Vorlage hinzu, um das Erzeugen von Pods mit der NET_RAW-Funktion einzuschränken:

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

Erstellen eines AKS-Clusters mit kubenet-Netzwerk-Plug-In

Erstellen Sie einen AKS-Cluster mit dem kubenet-Netzwerk-Plug-In, für den eine verwaltete Podidentität aktiviert ist.

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

Aktualisieren eines vorhandenen AKS-Clusters mit kubenet-Netzwerk-Plug-In

Aktualisieren Sie einen vorhandenen AKS-Cluster mit dem kubenet-Netzwerk-Plug-In, um eine per Pod verwaltete Identität zu integrieren.

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

Erstellen einer Identität

Wichtig

Sie müssen über die entsprechenden Berechtigungen (z. B. „Besitzer“) für Ihr Abonnement verfügen, um die Identität zu erstellen.

Erstellen Sie mit az identity create eine Identität, die vom Demopod verwendet wird, und legen Sie die Variablen IDENTITY_CLIENT_ID und IDENTITY_RESOURCE_ID fest.

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

Zuweisen von Berechtigungen für die verwaltete Identität

Der verwalteten Identität, die dem Pod zugewiesen wird, müssen die erforderlichen Berechtigungen für die auszuführenden Aktionen gewährt werden.

Zum Ausführen des Demos muss die verwaltete Identität IDENTITY_CLIENT_ID in der Ressourcengruppe, die die VM-Skalierungsgruppe Ihres AKS-Clusters enthält, über Berechtigungen vom Typ „Mitwirkender für virtuelle Computer“ verfügen.

# 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

Erstellen einer Podidentität

Erstellen Sie mit az aks pod-identity add eine verwaltete Podidentität für den Cluster.

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}

Hinweis

POD_IDENTITY_NAME muss ein gültiger DNS-Unterdomänenname sein, wie in RFC 1123 definiert.

Hinweis

Wenn Sie die verwaltete Podidentität mithilfe von pod-identity add zuweisen, wird von der Azure CLI versucht, der Clusteridentität über die verwaltete Podidentität (IDENTITY_RESOURCE_ID) die Rolle „Operator für verwaltete Identität“ zuzuweisen.

Azure erstellt eine AzureIdentity-Ressource in Ihrem Cluster, die die Identität in Azure darstellt, und eine AzureIdentityBinding-Ressource, die AzureIdentity mit einem Selektor verbindet. Sie können diese Ressourcen wie folgt anzeigen:

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

Ausführen einer Beispielanwendung

Damit ein Pod eine vom Pod verwaltete Microsoft Entra-Identität verwenden kann, muss der Pod mit der Bezeichnung aadpodidbinding mit einem Wert versehen werden, der mit einem Selektor einer AzureIdentityBinding übereinstimmt. Standardmäßig stimmt der Selektor mit dem Namen der verwalteten Podidentität überein, er kann aber auch beim Aufruf von az aks pod-identity add mit der Option --binding-selector festgelegt werden.

Erstellen Sie eine demo.yaml-Datei mit dem folgenden Inhalt, um eine Beispielanwendung auszuführen, die eine vom Pod verwaltete Microsoft Entra-Identität verwendet. Ersetzen Sie POD_IDENTITY_NAME, IDENTITY_CLIENT_ID und IDENTITY_RESOURCE_GROUP durch die Werte aus den vorherigen Schritten. Ersetzen Sie SUBSCRIPTION_ID durch Ihre Abonnement-ID.

Hinweis

In den vorherigen Schritten haben Sie die Variablen POD_IDENTITY_NAME, IDENTITY_CLIENT_ID und IDENTITY_RESOURCE_GROUP erstellt. Sie können einen Befehl wie echo verwenden, um den für Variablen festgelegten Wert anzuzeigen, z. B. 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

Beachten Sie Folgendes: Die Poddefinition verfügt über die Bezeichnung aadpodidbinding mit einem Wert, der dem Namen der verwalteten Podidentität entspricht, für die Sie im vorherigen Schritt az aks pod-identity add ausgeführt haben.

Stellen Sie demo.yaml in demselben Namespace wie Ihre verwaltete Podidentität bereit, indem Sie kubectl apply verwenden:

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

Vergewissern Sie sich mit kubectl logs, dass die Ausführung der Beispielanwendung erfolgreich war.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Vergewissern Sie sich in den Protokollen, dass der Abruf eines Tokens und der GET-Vorgang erfolgreich waren.

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

Ausführen einer Anwendung mit mehreren Identitäten

Damit eine Anwendung mehrere Identitäten verwenden kann, legen Sie beim Erstellen von Podidentitäten --binding-selector auf denselben Selektor fest.

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

Legen Sie dann das aadpodidbinding-Feld in Ihrem Pod-YAML auf den von Ihnen angegebenen Bindungsselektor fest.

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

Deaktivieren von von einem Pod verwalteten Identitäten in einem vorhandenen Cluster

Um von einem Pod verwaltete Identitäten in einem vorhandenen Cluster zu deaktivieren, entfernen Sie die von einem Pod verwaltete Identitäten aus dem Cluster. Deaktivieren Sie dann die Funktion im Cluster.

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

Bereinigen

Um eine vom Pod verwaltete Microsoft Entra-Identität aus Ihrem Cluster zu entfernen, müssen Sie die Beispielanwendung und die vom Pod verwaltete Identität aus dem Cluster entfernen. Entfernen Sie dann die Identität und die Rollenzuweisung der Clusteridentität.

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ächste Schritte

Weitere Informationen zu verwalteten Identitäten finden Sie unter Was sind verwaltete Identitäten für Azure-Ressourcen?.