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 de Identidade de Pod do AKS será corrigido e terá suporte até setembro de 2025 para permitir que os clientes migrem para a ID de carga de trabalho do Microsoft Entra
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 visualizações são fornecidas "como estão" e "conforme disponíveis" e estão excluídas dos acordos 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 \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-pod-identity \
--network-plugin azure \
--generate-ssh-keys
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 --resource-group $MY_RESOURCE_GROUP --name $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"
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 \
--resource-group $MY_RESOURCE_GROUP \
--name $MY_CLUSTER \
--enable-pod-identity \
--enable-pod-identity-with-kubenet \
--generate-ssh-keys
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 --resource-group $MY_RESOURCE_GROUP --name $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 --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 à 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 --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 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 --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óximas etapas
Para obter mais informações sobre identidades gerenciadas, consulte Identidades gerenciadas para recursos do Azure.
Azure Kubernetes Service