Usar identidades gerenciadas por pod do Microsoft Entra no Serviço de Kubernetes do Azure (Versão Prévia)

As identidades do Microsoft Entra gerenciadas por pod usam primitivos do Kubernetes para associar identidades gerenciadas a recursos e identidades do Azure no Microsoft Entra ID com pods. Os administradores criam identidades e vinculações de dados como primitivos do Kubernetes que permitem que os pods acessem os recursos do Azure que usam o Microsoft Entra ID como provedor de identidade.

Importante

Recomendamos que você leia ID de Carga de Trabalho do Microsoft Entra. Esse método de autenticação substitui a identidade gerenciada por pod (versão prévia), que se integra aos recursos nativos do Kubernetes para federar com os provedores de identidade externos em nome do aplicativo.

A identidade gerenciada por pod do Microsoft Entra de software livre (versão prévia) no Serviço de Kubernetes do Azure foi preterida em 24/10/2022, e o projeto arquivado em setembro de 2023. Para obter mais informações, confira o aviso de preterimento. O complemento Gerenciado do AKS começa a ser preterido em setembro de 2024.

Para desabilitar o complemento gerenciado pelo AKS, 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 somente em pools de nós do Linux.
  • Este recurso só tem suporte para clusters apoiados por Conjuntos de Dimensionamento de Máquinas Virtuais.

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

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As versõ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 versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

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 sinalizador de recursos EnablePodIdentityPreview usando o comando az feature register, conforme mostrado no seguinte exemplo:

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

Demora alguns minutos para o status exibir Registrado. Verifique o status do registro usando o comando az feature show:

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

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

az provider register --namespace Microsoft.ContainerService

Opções de modo de operação

A identidade do Microsoft Entra gerenciada por pod dá suporte a dois modos de operação:

  • Modo padrão:nesse modo, os dois componentes a seguir são implantados no cluster do AKS:
    • MIC (Controlador de Identidades Gerenciadas): um MIC é um controlador Kubernetes que inspeciona alterações em pods, AzureIdentity e AzureIdentityBinding por meio do Servidor de API do Kubernetes. Quando detecta 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 Dimensionamento de Máquinas Virtuais 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 Dimensionamento de Máquinas Virtuais do pool de nós, a menos que a mesma identidade gerenciada seja usada por outros pods. O MIC toma ações semelhantes quando AzureIdentity ou AzureIdentityBinding é criado ou excluído.
    • NMI (Node Management Identity): NMI é um pod executado como um DaemonSet em cada nó no cluster AKS. A NMI intercepta solicitações de token de segurança para o Serviço de Metadados da Instância do Azure em cada nó, as redireciona para si mesma, verifica 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: esse modo oferece apenas NMI. Quando instalado por meio do complemento de cluster do AKS, o Azure gerencia a criação de primitivos do Kubernetes (AzureIdentity e AzureIdentityBinding) e a atribuição de identidade em resposta aos comandos da CLI enviados pelo usuário. Caso contrário, se instalado com o gráfico do Helm, a identidade precisa ser atribuída manualmente e gerenciada pelo usuário. Para obter mais informações, confira Identidade do Pod no modo gerenciado.

Ao instalar a identidade do Microsoft Entra gerenciada por pod por meio do gráfico do Helm ou do manifesto YAML, conforme mostrado no Guia de Instalação, você poderá escolher entre os modos standard e managed. Se, alternativamente, você decidir instalar a identidade do Microsoft Entra gerenciada por pod usando o complemento do cluster do AKS, conforme mostrado neste artigo, a configuração usará o modo managed.

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

Observação

Essa é a configuração recomendada padrão

Crie um cluster AKS com a identidade gerenciada por pod e CNI do Azure habilitados. 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 do AKS chamado myAKSCluster no grupo de recursos myResourceGroup.

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

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

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

Observação

Quando você habilita a identidade gerenciada por pod em seu cluster do AKS, um AzurePodIdentityException chamado aks-addon-exception é adicionado ao namespace kube-system. Uma AzurePodIdentityException permite que pods com determinados rótulos acessem o ponto de extremidade do IMDS (Serviço de Metadados de Instância) do Azure sem serem interceptados pelo servidor NMI. A aks-addon-exception permite que complementos do AKS do próprio fornecedor, como a identidade gerenciada por pod do Microsoft Entra, funcionem sem ser preciso configurar manualmente uma AzurePodIdentityException. Opcionalmente, você pode adicionar, remover e atualizar uma AzurePodIdentityException usando az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update ou kubectl.

Atualizar um cluster do AKS com o CNI do Azure

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

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

Como usar o plugin de rede do Kubenet com identidades gerenciadas por pod do Microsoft Entra

Importante

Por questões de segurança, a configuração para executar a identidade do Microsoft Entra gerenciada por pod em um cluster com Kubenet não é recomendada. A configuração padrão do Kubenet não impede a falsificação do ARP, que pode ser usado por um pod para atuar como outro pod e obter acesso a uma identidade que não poderia ter. Siga as etapas de mitigação e configure as políticas antes de habilitar a identidade do Microsoft Entra gerenciada por pod em um cluster com Kubenet.

Reduçã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 só devem usar funcionalidades permitidas" para limitar o ataque de CAP_NET_RAW.

Adicionar NET_RAW a "Funcionalidades de soltar necessárias"

image

Se você não estiver usando o Azure Policy, poderá usar o controlador de admissão OpenPolicyAgent junto com o webhook que valida o Gatekeeper. Desde que você já tenha o Gatekeeper instalado no 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 geração de pods com a funcionalidade 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"]

Criar um cluster do AKS com o plug-in de rede Kubenet

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

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

Atualizar um cluster do AKS com o plug-in de rede Kubenet

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

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

Criar uma identidade

Importante

Você deve ter as permissões relevantes (por exemplo, Proprietário) em sua assinatura 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 -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)"

Atribuir permissões à identidade gerenciada

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

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 Dimensionamento de Máquinas Virtuais do cluster do 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 -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

Criar uma Identidade de pod

Crie uma identidade gerenciada por pod para o cluster usando o 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}

Observação

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

Observação

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

O Azure cria um recurso AzureIdentity em seu cluster que representa a identidade no Azure e um recurso AzureIdentityBinding que conecta o AzureIdentity a um seletor. Você pode ver esses 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 por pod do Microsoft Entra, o pod precisa de um rótulo aadpodidbinding com um valor que corresponda a um seletor de uma AzureIdentityBinding. Por padrão, o seletor corresponderá ao nome da identidade gerenciada por pod, mas também poderá ser definido usando a opção --binding-selector ao chamar az aks pod-identity add.

Para executar uma amostra de aplicativo usando a identidade gerenciada por pod do Microsoft Entra, crie um arquivo demo.yaml com o conteúdo a seguir. Substitua POD_IDENTITY_NAME, IDENTITY_CLIENT_ID e IDENTITY_RESOURCE_GROUP pelos valores das etapas anteriores. Substitua SUBSCRIPTION_ID pela ID da assinatura.

Observação

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 por pod que você executou az aks pod-identity add na etapa anterior.

Implante demo.yaml no mesmo namespace que a identidade gerenciada por pod usando kubectl apply:

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

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

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Verifique se os logs mostram que um token foi adquirido com êxito e que 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, de definido --binding-selector como o mesmo seletor ao criar identidades de 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 aadpodidbinding seguida, de definir o campo no YAML do pod como o seletor de associação especificado.

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

Desabilitar a 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, desabilite 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

Limpar

Para remover do cluster uma identidade do Microsoft Entra gerenciada por pod, remova a amostra de aplicativo 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 -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Próximas etapas

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