Usare le identità gestite da pod di Microsoft Entra nel servizio Azure Kubernetes (anteprima)

Le identità gestite dai pod di Microsoft Entra usano primitive Kubernetes per associare identità gestite per le risorse e le identità di Azure nell'ID Microsoft Entra con i pod. Gli amministratori creano identità e associazioni come primitive Kubernetes che consentono ai pod di accedere alle risorse di Azure che si basano su Microsoft Entra ID come provider di identità.

Importante

È consigliabile esaminare l'ID del carico di lavoro Microsoft Entra. Questo metodo di autenticazione sostituisce l'identità gestita da pod (anteprima), che si integra con le funzionalità native di Kubernetes per operare con qualsiasi provider di identità esterno.

L'identità gestita da pod di Microsoft Entra open source (anteprima) nel servizio Azure Kubernetes è stata deprecata il 24/10/2022 e il progetto è stato archiviato a settembre 2023. Per altre informazioni, vedere Informativa sulle funzionalità deprecate. Il componente aggiuntivo AKS Pod Identity Managed verrà patchato e supportato fino a settembre 2025 per consentire ai clienti di passare a ID dei carichi di lavoro di Microsoft Entra

Per disabilitare il componente aggiuntivo gestito del servizio Azure Kubernetes, usare il comando az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Operazioni preliminari

È necessario che sia installata l'interfaccia della riga di comando di Azure versione 2.20.0 o successiva.

Limiti

  • Per un cluster sono consentite massimo 200 identità gestite da pod.
  • Per un cluster sono consentite massimo 200 eccezioni di identità gestite da pod.
  • Le identità gestite da pod sono disponibili solo nei pool di nodi Linux.
  • Questa funzionalità è supportata solo per i cluster supportati dai set di scalabilità di macchine virtuali.

Installare l'estensione aks-preview per l'interfaccia della riga di comando di Azure

Importante

Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

Per installare l'estensione aks-preview, eseguire il comando seguente:

az extension add --name aks-preview

Per eseguire l'aggiornamento alla versione più recente dell'estensione rilasciata eseguire il comando seguente:

az extension update --name aks-preview

Registrare il flag di funzionalità 'EnablePodIdentityPreview'

Registrare il flag di funzionalità EnablePodIdentityPreview usando il comando az feature register, come mostrato nell'esempio seguente:

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

Sono necessari alcuni minuti per visualizzare lo stato Registered. Verificare lo stato della registrazione usando il comando az feature show:

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

Quando lo stato diventa Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register:

az provider register --namespace Microsoft.ContainerService

Opzioni della modalità operativa

L'identità gestita da pod di Microsoft Entra supporta due modalità di funzionamento:

  • Modalità standard: in questa modalità i due componenti seguenti vengono distribuiti nel cluster del servizio Azure Kubernetes:
    • Controller identità gestita (MIC): un controller identità gestita è un controller Kubernetes che controlla le modifiche apportate ai pod, AzureIdentity e AzureIdentityBinding tramite il server API di Kubernetes. Quando rileva una modifica pertinente, il controller identità gestita aggiunge o elimina AzureAssignedIdentity in base alle esigenze. In particolare, quando viene pianificato un pod, il controller identità gestita assegna l'identità gestita in Azure al set di scalabilità di macchine virtuali sottostante usato dal pool di nodi durante la fase di creazione. Quando tutti i pod che usano l'identità vengono eliminati, rimuove l'identità dal set di scalabilità di macchine virtuali del pool di nodi, a meno che la stessa identità gestita non venga usata da altri pod. Il controller identità gestita esegue azioni simili quando AzureIdentity o AzureIdentityBinding vengono creati o eliminati.
    • Identità gestita del nodo (NMI) l’identità gestita del nodo è un pod che viene eseguito come DaemonSet su ogni nodo nel cluster del servizio Azure Kubernetes. L’identità gestita del nodo intercetta le richieste di token di sicurezza al Servizio metadati dell'istanza di Azure in ogni nodo, reindirizzandole a se stessa ed eseguendo la convalida se il pod ha accesso all'identità per cui richiede un token e recupera il token dal tenant di Microsoft Entra per conto dell'applicazione.
  • Modalità gestita: questa modalità offre solo identità gestita del nodo. Quando viene installato tramite il componente aggiuntivo cluster del servizio Azure Kubernetes, Azure gestisce la creazione di primitive Kubernetes (AzureIdentity e AzureIdentityBinding) e l'assegnazione di identità in risposta ai comandi dell'interfaccia della riga di comando da parte dell'utente. In caso contrario, se installato tramite il grafico Helm, l'identità deve essere assegnata e gestita manualmente dall'utente. Per altre informazioni, vedere Identità pod in modalità gestita.

Quando si installa l'identità gestita da pod di Microsoft Entra tramite il grafico Helm o il manifesto YAML, come illustrato nella Guida all'installazione, è possibile scegliere tra le modalità standard e managed. Se invece si decide di installare l'identità gestita da pod di Microsoft Entra usando il componente aggiuntivo cluster del servizio Azure Kubernetes, come descritto in questo articolo, l'installazione userà la modalità managed.

Creare un cluster del servizio Azure Kubernetes con Azure Container Networking Interface (CNI)

Nota

Questa è la configurazione consigliata predefinita

Creare un cluster del servizio Azure Kubernetes con Azure CNI e l'identità gestita da pod abilitata. I comandi seguenti usano az group create per creare un gruppo di risorse denominato myResourceGroup, e il comando az aks create per creare un cluster del servizio Azure Kubernetes denominato myAKSCluster nel gruppo di risorse myResourceGroup.

az group create --name myResourceGroup --location eastus
az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-pod-identity \
    --network-plugin azure \
    --generate-ssh-keys

Usare az aks get-credentials per accedere al cluster del servizio Azure Kubernetes. Questo comando inoltre scarica e configura anche il certificato client kubectl nel computer di sviluppo.

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

Nota

Quando si abilita l'identità gestita da pod nel cluster del servizio Azure Kubernetes, viene aggiunta una AzurePodIdentityException denominata aks-addon-exception allo spazio dei nomi kube-system. Un'eccezione AzurePodIdentityException consente ai pod con determinate etichette di accedere all'endpoint del Servizio metadati dell'istanza di Azure senza essere intercettato dal server di identità gestita del nodo. L'eccezione aks-addon-exception consente ai componenti aggiuntivi del produttore del servizio Azure Kubernetes, ad esempio l'identità gestita da pod di Microsoft Entra, di operare senza dover configurare manualmente un'eccezione AzurePodIdentityException. Facoltativamente, è possibile aggiungere, rimuovere e aggiornare un'eccezione AzurePodIdentityException usando az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update o kubectl.

Aggiornare un cluster del servizio Azure Kubernetes esistente con Azure CNI

Aggiornare un cluster del servizio Azure Kubernetes esistente con Azure CNI per includere l'identità gestita da pod.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity

Uso del plug-in di rete Kubenet con le identità gestite da pod di Microsoft Entra

Importante

A causa di problemi di sicurezza, l’esecuzione dell'identità gestita da pod Microsoft Entra in un cluster con Kubenet non è una configurazione consigliata. La configurazione predefinita di Kubenet non riesce a impedire lo spoofing ARP, che può essere usato da un pod per agire come un altro pod e ottenere l'accesso a un'identità che non deve avere. Prima di abilitare l'identità gestita dai pod di Microsoft Entra in un cluster con Kubenet, attenersi ai passaggi di mitigazione e configurare i criteri.

Mitigazione

Per attenuare la vulnerabilità a livello di cluster, è possibile usare i criteri predefiniti di Azure "I contenitori del cluster Kubernetes devono usare solo le funzionalità consentite" per limitare l'attacco CAP_NET_RAW.

Aggiungere NET_RAW a "Funzionalità di rimozione necessarie"

image

Se non si usa Criteri di Azure, è possibile usare il controller di ammissione OpenPolicyAgent insieme a Gatekeeper, convalidando il webhook. A condizione che Gatekeeper sia già installato nel cluster, aggiungere il ConstraintTemplate di tipo K8sPSPCapabilities:

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

Aggiungere un modello per limitare la generazione di pod con la funzionalità di 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"]

Creare un cluster del servizio Azure Kubernetes con il plug-in di rete Kubenet

Creare un cluster del servizio Azure Kubernetes con il plug-in di rete Kubenet e l'identità gestita da pod abilitata.

az aks create \
    --resource-group $MY_RESOURCE_GROUP \
    --name $MY_CLUSTER \
    --enable-pod-identity \
    --enable-pod-identity-with-kubenet \
    --generate-ssh-keys

Aggiornare un cluster del servizio Azure Kubernetes esistente con il plug-in di rete Kubenet

Aggiornare un cluster del servizio Azure Kubernetes esistente con il plug-in di rete Kubenet per includere l'identità gestita da pod.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Creare un'identità

Importante

Per creare l'identità, è necessario disporre delle autorizzazioni pertinenti (ad esempio Proprietario) nella sottoscrizione.

Creare un'identità che verrà usata dal pod demo con az identity create e impostare le variabili IDENTITY_CLIENT_ID e 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 --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"

Assegnare autorizzazioni per l'identità gestita

Nell’identità gestita che verrà assegnata al pod devono esservi autorizzazioni concesse allineate alle azioni che verranno eseguite.

Per eseguire la demo, l'identità gestita IDENTITY_CLIENT_ID deve disporre delle autorizzazioni Collaboratore macchina virtuale nel gruppo di risorse che contiene il set di scalabilità di macchine virtuali del cluster del servizio Azure Kubernetes.

# 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 --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show --name $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

Creare un'identità pod

Creare un'identità gestita da pod per il cluster che usano 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}

Nota

"POD_IDENTITY_NAME" deve essere un nome di sottodominio DNS valido, come definito in RFC 1123.

Nota

Quando si assegna l'identità gestita da pod usando pod-identity add, l'interfaccia della riga di comando di Azure tenta di concedere il ruolo Operatore identità gestita tramite l'identità gestita da pod (IDENTITY_RESOURCE_ID) all'identità del cluster.

Azure creerà una risorsa AzureIdentity nel cluster che rappresenta l'identità in Azure e una risorsa AzureIdentityBinding che connette AzureIdentity a un selettore. È possibile visualizzare queste risorse con

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

Eseguire un'applicazione di esempio

Perché possa usare l'identità gestita da pod di Microsoft Entra, il pod necessita di un'etichetta aadpodidbinding con un valore corrispondente a un selettore da AzureIdentityBinding. Per impostazione predefinita, il selettore corrisponderà al nome dell'identità gestita da pod, ma può anche essere impostato usando l'opzione --binding-selector alla chiamata di az aks pod-identity add.

Per eseguire un'applicazione di esempio usando l'identità gestita da pod di Microsoft Entra, creare un file demo.yaml con il contenuto seguente. Sostituire POD_IDENTITY_NAME, IDENTITY_CLIENT_ID e IDENTITY_RESOURCE_GROUP con i valori dei passaggi precedenti. Sostituire SUBSCRIPTION_ID con il proprio ID sottoscrizione.

Nota

Nei passaggi precedenti sono state create le variabili POD_IDENTITY_NAME, IDENTITY_CLIENT_ID e IDENTITY_RESOURCE_GROUP. È possibile usare il comando echo per visualizzare il valore impostato per le variabili, ad esempio 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

Si noti che la definizione del pod ha un'etichetta aadpodidbinding con un valore che corrisponde al nome dell'identità gestita da pod az aks pod-identity add eseguita nel passaggio precedente.

Distribuire demo.yaml nello stesso spazio dei nomi dell'identità gestita da pod usando kubectl apply:

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

Verificare che l'applicazione di esempio venga eseguita correttamente usando kubectl logs.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Verificare che i log mostrino che sia stato acquisito correttamente un token e che l'operazione GET abbia esito positivo.

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

Eseguire un'applicazione con più identità

Per consentire a un'applicazione di usare più identità, l’impostazione di --binding-selector deve essere lo stesso selettore per la creazione di identità dei pod.

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

Impostare quindi il campo aadpodidbinding nel pod YAML sul selettore di associazione specificato.

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

Disabilitare l'identità gestita da pod in un cluster esistente

Per disabilitare l'identità gestita da pod in un cluster esistente, rimuovere le identità gestite da pod dal cluster. Disabilitare quindi la funzionalità nel 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

Eseguire la pulizia

Per rimuovere un'identità gestita da pod di Microsoft Entra dal cluster, rimuovere dal cluster l'applicazione di esempio e l'identità gestita da pod. Rimuovere quindi l'identità e l'assegnazione di ruolo dell'identità del cluster.

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 --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Passaggi successivi

Per altre informazioni sulle identità gestite, vedere Identità gestite per le risorse di Azure.