Usar identidades gerenciadas por pod do Microsoft Entra no Serviço Kubernetes do Azure (Visualização)

As identidades gerenciadas por pod do Microsoft Entra usam primitivos do Kubernetes para associar identidades gerenciadas para recursos e identidades do Azure na ID do Microsoft Entra a pods. Os administradores criam identidades e associações como primitivas do Kubernetes que permitem que pods acessem recursos do Azure que dependem do Microsoft Entra ID como um provedor de identidade.

Importante

Recomendamos que você revise o ID da carga de trabalho do Microsoft Entra. Esse método de autenticação substitui a identidade gerenciada por pod (visualização), que se integra aos recursos nativos do Kubernetes para federar com quaisquer provedores de identidade externos em nome do aplicativo.

A identidade gerenciada por pod do Microsoft Entra de código aberto (visualização) no Serviço Kubernetes do Azure foi preterida em 24/10/2022 e o projeto arquivado em setembro de 2023. Para obter mais informações, consulte o aviso de descontinuação. O complemento AKS Pod Identity Managed será corrigido e suportado até setembro de 2025 para dar tempo aos clientes de migrar para o Microsoft Entra Workload ID

Para desativar o complemento AKS Gerido, use o seguinte comando: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Antes de começar

Você deve ter a CLI do Azure versão 2.20.0 ou posterior instalada.

Limitações

  • Um máximo de 200 identidades gerenciadas por pod são permitidas para um cluster.
  • Um máximo de 200 exceções de identidade gerenciadas por pod são permitidas para um cluster.
  • As identidades gerenciadas por pod estão disponíveis apenas em pools de nós do Linux.
  • Esse recurso só é suportado para clusters com suporte de Conjuntos de Escala de Máquina Virtual.

Instalar a extensão aks-preview da CLI do Azure

Importante

Os recursos de visualização do AKS estão disponíveis em uma base de autosserviço e opt-in. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente com base no melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Para instalar a extensão aks-preview, execute o seguinte comando:

az extension add --name aks-preview

Execute o seguinte comando para atualizar para a versão mais recente da extensão lançada:

az extension update --name aks-preview

Registre o sinalizador de recurso 'EnablePodIdentityPreview'

Registre o EnablePodIdentityPreview sinalizador de recurso usando o comando az feature register , conforme mostrado no exemplo a seguir:

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

Leva alguns minutos para que o status mostre Registrado. Verifique o status do registro usando o comando az feature show :

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

Quando o status refletir Registrado, atualize o registro do provedor de recursos Microsoft.ContainerService usando o comando az provider register :

az provider register --namespace Microsoft.ContainerService

Opções do modo de operação

A identidade gerenciada por pod do Microsoft Entra suporta dois modos de operação:

  • Modo padrão: Neste modo, os dois componentes a seguir são implantados no cluster AKS:
    • Managed Identity Controller (MIC): um MIC é um controlador Kubernetes que observa alterações em pods, AzureIdentity e AzureIdentityBinding por meio do Kubernetes API Server. Quando deteta uma alteração relevante, o MIC adiciona ou exclui AzureAssignedIdentity conforme necessário. Especificamente, quando um pod é agendado, o MIC atribui a identidade gerenciada no Azure ao Conjunto de Escala de Máquina Virtual subjacente usado pelo pool de nós durante a fase de criação. Quando todos os pods que usam a identidade são excluídos, ele remove a identidade do Conjunto de Escala de Máquina Virtual do pool de nós, a menos que a mesma identidade gerenciada seja usada por outros pods. O MIC executa ações semelhantes quando AzureIdentity ou AzureIdentityBinding são criados ou excluídos.
    • Node Managed Identity (NMI): NMI é um pod que é executado como um DaemonSet em cada nó no cluster AKS. O NMI interceta solicitações de token de segurança para o Serviço de Metadados de Instância do Azure em cada nó, redireciona-as para si mesmo e valida se o pod tem acesso à identidade para a qual está solicitando um token e busca o token do locatário do Microsoft Entra em nome do aplicativo.
  • Modo gerenciado: este modo oferece apenas NMI. Quando instalado por meio do complemento de cluster AKS, o Azure gerencia a criação de primitivas Kubernetes (AzureIdentity e AzureIdentityBinding) e a atribuição de identidade em resposta aos comandos da CLI pelo usuário. Caso contrário, se instalado via gráfico Helm, a identidade precisa ser atribuída manualmente e gerenciada pelo usuário. Para obter mais informações, consulte Identidade do pod no modo gerenciado.

Quando você instala a identidade gerenciada pelo pod do Microsoft Entra via gráfico Helm ou manifesto YAML, conforme mostrado no Guia de Instalação, você pode escolher entre o standard modo e managed . Se, em vez disso, você decidir instalar a identidade gerenciada pelo pod do Microsoft Entra usando o complemento de cluster AKS, conforme mostrado neste artigo, a instalação usará o managed modo.

Criar um cluster AKS com a CNI (Interface de Rede de Contêiner) do Azure

Nota

Esta é a configuração padrão recomendada

Crie um cluster AKS com CNI do Azure e identidade gerenciada por pod habilitada. Os comandos a seguir usam az group create para criar um grupo de recursos chamado myResourceGroup e o comando az aks create para criar um cluster AKS chamado myAKSCluster no grupo de recursos 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

Use az aks get-credentials para entrar no seu cluster AKS. Este comando também baixa e configura o certificado do kubectl cliente no computador de desenvolvimento.

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

Nota

Quando você habilita a identidade gerenciada por pod em seu cluster AKS, uma AzurePodIdentityException chamada aks-addon-exception é adicionada ao namespace kube-system. Um AzurePodIdentityException permite que pods com determinados rótulos acessem o ponto de extremidade IMDS (Serviço de Metadados de Instância) do Azure sem serem intercetados pelo servidor NMI. O aks-addon-exception permite que os addons primários do AKS, como a identidade gerenciada pelo pod do Microsoft Entra, operem sem a necessidade de configurar manualmente um AzurePodIdentityException. Opcionalmente, você pode adicionar, remover e atualizar um AzurePodIdentityException usando az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception updateou kubectl.

Atualizar um cluster AKS existente com o Azure CNI

Atualize um cluster AKS existente com o Azure CNI para incluir a identidade gerenciada por pod.

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

Usando o plug-in de rede Kubenet com identidades gerenciadas por pod do Microsoft Entra

Importante

Executar a identidade gerenciada por pod do Microsoft Entra em um cluster com Kubenet não é uma configuração recomendada devido a preocupações de segurança. A configuração padrão do Kubenet falha ao impedir a falsificação ARP, que pode ser utilizada por um pod para agir como outro pod e obter acesso a uma identidade que não se destina a ter. Siga as etapas de mitigação e configure as políticas antes de habilitar a identidade gerenciada pelo pod do Microsoft Entra em um cluster com Kubenet.

Mitigação

Para atenuar a vulnerabilidade no nível do cluster, você pode usar a política interna do Azure "Os contêineres de cluster do Kubernetes devem usar apenas recursos permitidos" para limitar o ataque CAP_NET_RAW.

Adicionar NET_RAW a "Recursos de queda necessários"

image

Se você não estiver usando a Política do Azure, poderá usar o controlador de admissão OpenPolicyAgent junto com o Gatekeeper validando o webhook. Desde que você já tenha o Gatekeeper instalado em seu cluster, adicione o ConstraintTemplate do tipo K8sPSPCapabilities:

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

Adicione um modelo para limitar a desova de Pods com a capacidade de 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"]

Crie um cluster AKS com o plug-in de rede Kubenet

Crie um cluster AKS com o plug-in de rede Kubenet e a identidade gerenciada por pod habilitada.

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

Atualize um cluster AKS existente com o plug-in de rede Kubenet

Atualize um cluster AKS existente com o plug-in de rede Kubenet para incluir a identidade gerenciada por pod.

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

Criar uma identidade

Importante

Tem de ter as permissões relevantes (por exemplo, Proprietário) na sua subscrição para criar a identidade.

Crie uma identidade que será usada pelo pod de demonstração com az identity create e defina as variáveis 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)"

Atribuir permissões para a identidade gerenciada

A identidade gerenciada que será atribuída ao pod precisa receber permissões alinhadas com as ações que serão executadas.

Para executar a demonstração, a identidade gerenciada IDENTITY_CLIENT_ID deve ter permissões de Colaborador de Máquina Virtual no grupo de recursos que contém o Conjunto de Escala de Máquina Virtual do cluster AKS.

# 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

Criar uma identidade de pod

Crie uma identidade gerenciada por pod para o cluster usando az aks pod-identity addo .

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

O "POD_IDENTITY_NAME" tem de ser um nome de subdomínio DNS válido, conforme definido no RFC 1123.

Nota

Quando você atribui a identidade gerenciada por pod usando pod-identity addo , a CLI do Azure tenta conceder a função de Operador de Identidade Gerenciada sobre a identidade gerenciada por pod (IDENTITY_RESOURCE_ID) à identidade do cluster.

O Azure criará um recurso AzureIdentity em seu cluster representando a identidade no Azure e um recurso AzureIdentityBinding que conecta o AzureIdentity a um seletor. Pode ver estes recursos com

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

Executar um aplicativo de exemplo

Para que um pod use a identidade gerenciada pelo pod do Microsoft Entra, o pod precisa de um rótulo aadpodidbinding com um valor que corresponda a um seletor de um AzureIdentityBinding. Por padrão, o seletor corresponderá ao nome da identidade gerenciada pelo pod, mas também pode ser definido usando a --binding-selector opção ao chamar az aks pod-identity add.

Para executar um aplicativo de exemplo usando a identidade gerenciada pelo pod do Microsoft Entra, crie um demo.yaml arquivo com o seguinte conteúdo. Substitua POD_IDENTITY_NAME, IDENTITY_CLIENT_ID e IDENTITY_RESOURCE_GROUP pelos valores das etapas anteriores. Substitua SUBSCRIPTION_ID pelo seu ID de subscrição.

Nota

Nas etapas anteriores, você criou as variáveis POD_IDENTITY_NAME, IDENTITY_CLIENT_ID e IDENTITY_RESOURCE_GROUP . Você pode usar um comando como echo para exibir o valor definido para variáveis, por exemplo 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

Observe que a definição de pod tem um rótulo aadpodidbinding com um valor que corresponde ao nome da identidade gerenciada pelo pod executada az aks pod-identity add na etapa anterior.

Implante demo.yaml no mesmo namespace que sua identidade gerenciada pelo pod usando kubectl apply:

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

Verifique se o aplicativo de exemplo é executado com êxito usando kubectl logso .

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Verifique se os logs mostram que um token foi adquirido com êxito e se a operação GET foi bem-sucedida.

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

Executar um aplicativo com várias identidades

Para permitir que um aplicativo use várias identidades, defina o --binding-selector para o mesmo seletor ao criar identidades 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

Em seguida, defina o aadpodidbinding campo no seu pod YAML para o seletor de ligação que você especificou.

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

Desabilitar identidade gerenciada por pod em um cluster existente

Para desabilitar a identidade gerenciada por pod em um cluster existente, remova as identidades gerenciadas por pod do cluster. Em seguida, desative o recurso no 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

Limpeza

Para remover uma identidade gerenciada por pod do Microsoft Entra do cluster, remova o aplicativo de exemplo e a identidade gerenciada por pod do cluster. Em seguida, remova a identidade e a atribuição de função da identidade do 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"

Próximos passos

Para obter mais informações sobre identidades gerenciadas, consulte Identidades gerenciadas para recursos do Azure.