Usar a autorização do Microsoft Entra ID para a API do Kubernetes no AKS (Serviço de Kubernetes do Azure)

Aplica-se a: ✔️ AKS Automatic ✔️ AKS Standard

Este artigo mostra como autorizar chamadas para a API do Kubernetes no AKS (Serviço de Kubernetes do Azure) usando identidades Microsoft Entra ID. A autorização do Microsoft Entra ID para a API do Kubernetes usa atribuições de função do Azure RBAC para conceder acesso aos recursos do Kubernetes. Para recursos nativos do Kubernetes, atribua uma das funções internas do AKS (como Leitor de RBAC do Serviço de Kubernetes do Azure) no escopo do cluster ou namespace. Para recursos personalizados (CRDs), atribua uma função personalizada com condições do Azure ABAC que especifiquem a quais grupos ou tipos de CRD o destinatário tem acesso. As duas atribuições de função consistem no seguinte: uma concede acesso a recursos padrão do Kubernetes, e a outra concede acesso condicional a recursos personalizados específicos.

Para a maioria das cargas de trabalho de produção, o AKS Automático é a opção padrão recomendada pronta para produção para o AKS. Os clusters do AKS Automático são pré-configurados com a autorização RBAC do Azure para Kubernetes, para que você possa se concentrar em atribuir as funções corretas do Microsoft Entra a usuários, grupos e entidades de serviço.

Para obter uma visão geral conceitual das opções de autorização de API do Kubernetes disponíveis no AKS, consulte os conceitos de autorização de cluster.

Note

Ao usar a autenticação integrada entre a ID do Microsoft Entra e o AKS, você pode usar usuários, grupos ou entidades de serviço do Microsoft Entra como entidades no RBAC (controle de acesso baseado em função) do Kubernetes. Usando Microsoft Entra ID autorização, você não precisa gerenciar separadamente as identidades e as credenciais do usuário para o Kubernetes. No entanto, você ainda precisa configurar e gerenciar separadamente as atribuições de função do Microsoft Entra ID e quaisquer vinculações de RBAC do Kubernetes.

Note

Os clusters automáticos do AKS são pré-configurados para usar Azure RBAC para autorização do Kubernetes. Você não precisa habilitar --enable-azure-rbac em clusters automáticos do AKS. No AKS Standard, você pode habilitar ou desabilitar Azure RBAC com base na configuração do cluster.

Prerequisites

  • Você precisa da CLI do Azure versão 2.24.0 ou posterior instalada e configurada. Execute az --version para encontrar a versão. Se precisar instalar ou atualizar, consulte Instalar CLI do Azure.
  • Você precisa kubectl, com uma versão mínima de 1.18.3.
  • Você precisa ter a integração gerenciada do Microsoft Entra habilitada no seu cluster antes de poder adicionar a autorização do Microsoft Entra ID para a API do Kubernetes. Se você precisar habilitar a integração gerenciada do Microsoft Entra, consulte Usar a ID do Microsoft Entra no AKS.
  • Novas atribuições de função podem levar até cinco minutos para serem propagadas e atualizadas pelo servidor de autorização.
  • A autorização do Microsoft Entra ID para a API do Kubernetes exige que o locatário do Microsoft Entra configurado para autenticação seja o mesmo que o locatário da assinatura que hospeda seu cluster do AKS.

Comportamento do modo de cluster do AKS

Modo de agrupamento Azure RBAC para Autorização do Kubernetes
AKS Automático Pré-configurado (habilitado por padrão)
AKS Standard Opcional (habilitar com --enable-azure-rbac)

Criar um novo cluster do AKS com integração gerenciada do Microsoft Entra e autorização do Microsoft Entra ID

Para novas cargas de trabalho de produção, use o AKS Automatic. O Azure RBAC para autorização do Kubernetes é pré-configurado em clusters AKS Automatic.

  1. Crie um cluster automático do AKS seguindo Criar um cluster do AKS (Serviço de Kubernetes do Azure) Automático.

  2. Opcional: verifique se a autorização do Azure RBAC para Kubernetes está habilitada em seu cluster usando o comando az aks show.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    az aks show \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --query "aadProfile.enableAzureRbac" \
      --output tsv
    

AKS Standard

  1. Crie um grupo de recursos Azure usando o comando az group create.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Crie um cluster do AKS Standard com integração gerenciada com o Microsoft Entra e autorização do Microsoft Entra ID usando o comando az aks create.

    export CLUSTER_NAME=<cluster-name>
    
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --enable-aad \
        --enable-azure-rbac \
        --generate-ssh-keys
    

    Seu resultado deve ser semelhante ao seguinte exemplo de saída:

    "AADProfile": {
        "adminGroupObjectIds": null,
        "clientAppId": null,
        "enableAzureRbac": true,
        "managed": true,
        "serverAppId": null,
        "serverAppSecret": null,
        "tenantId": "****-****-****-****-****"
    }
    

Habilitar a autorização do Microsoft Entra ID em um cluster AKS existente

Para clusters do AKS Padrão existentes, habilite a autorização do Microsoft Entra ID para a API do Kubernetes usando o comando az aks update com o sinalizador --enable-azure-rbac.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Enable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac

Os clusters automáticos do AKS já vêm com o Azure RBAC para autorização do Kubernetes pré-configurado. Você não precisa executar --enable-azure-rbac para o AKS Automatic.

Funções predefinidas do AKS

O AKS fornece as seguintes funções internas:

Função Descrição
Leitor do RBAC do Serviço de Kubernetes do Azure Permite acesso somente leitura para ver a maioria dos objetos em um namespace. Não permite exibir funções nem associações de função. Essa função não permite a exibição de Secrets, pois a leitura do conteúdo dos Segredos permite acesso às credenciais de ServiceAccount no namespace, o que permitiria acesso à API como qualquer ServiceAccount no namespace (uma forma de elevação de privilégio).
Gravador do RBAC do Serviço de Kubernetes do Azure Permite acesso de leitura/gravação à maioria dos objetos em um namespace. Essa função não permite exibir ou modificar funções ou associações de função. No entanto, essa função permite acessar Secrets e executar Pods como qualquer ServiceAccount no namespace, portanto, ela pode ser usada para obter os níveis de acesso à API de qualquer ServiceAccount no namespace.
Administrador do RBAC do Serviço de Kubernetes do Azure Permite acesso de administrador, destinado a ser concedido em um namespace. Permite acesso de leitura/gravação para a maioria dos recursos em um namespace (ou escopo de cluster), incluindo a capacidade de criar funções e associações de função no namespace. Essa função não permite acesso de gravação à cota de recursos ou ao próprio namespace.
Administrador do cluster RBAC do Serviço de Kubernetes do Azure Permite o acesso de superusuário para executar ações em qualquer recurso. Ele fornece controle total sobre todos os recursos no cluster e em todos os namespaces.

Criar atribuições de função para acesso ao cluster

  1. Obtenha sua ID de recurso do AKS usando o az aks show comando.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
  2. Crie uma atribuição de função usando o az role assignment create comando. <AAD-ENTITY-ID> pode ser um nome de usuário ou a ID do cliente de uma entidade de serviço. O exemplo a seguir cria uma atribuição de função para a função de administrador do RBAC Serviço de Kubernetes do Azure.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the Azure Kubernetes Service RBAC Admin role
    az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

    Note

    Você pode criar as atribuições das funções Serviço de Kubernetes do Azure RBAC Reader e Serviço de Kubernetes do Azure RBAC Writer com escopo definido para um namespace específico dentro do cluster usando o comando az role assignment create e definindo o escopo para o namespace desejado.

    az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
    

Criar definições de funções personalizadas

Para recursos integrados do Kubernetes, as definições de funções personalizadas fazem referência às ações do grupo de API correspondente em Microsoft.ContainerService/managedClusters/. O exemplo a seguir permite que um usuário apenas leia as implantações e nada mais. Para obter a lista completa de possíveis ações, consulte as operações Microsoft.ContainerService.

Para recursos personalizados, a função personalizada deve conceder a ação de dados de recursos personalizados aplicável, como Microsoft.ContainerService/managedClusters/customresources/read. Uma função personalizada por si só não filtra o acesso por grupo ou tipo de CRD (definição de recurso personalizado). Para aplicar essa filtragem, adicione uma condição ABAC do Azure à atribuição de função. Para o procedimento completo, consulte Restringir o acesso a recursos personalizados usando condições ABAC.

  1. Para criar suas próprias definições de função personalizadas, copie o arquivo a seguir, substitua <YOUR-SUBSCRIPTION-ID> por sua própria ID de assinatura e salve-o como deploy-view.json.

    {
        "Name": "AKS Deployment Reader",
        "Description": "Lets you view all deployments in cluster/namespace.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/apps/deployments/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. Crie a definição de função usando o comando az role definition create, definindo --role-definition para o arquivo deploy-view.json que você criou na etapa anterior.

    az role definition create --role-definition @deploy-view.json 
    
  3. Atribua a definição de função a um usuário ou outra identidade usando o az role assignment create comando.

        # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS Deployment Reader role
    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

Restringir o acesso a recursos personalizados usando condições ABAC (versão prévia)

Importante

As funcionalidades em versão preliminar do AKS estão disponíveis de forma optativa e por autoatendimento. As versões prévias são fornecidas “no estado em que se encontram” 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:

As condições ABAC permitem filtrar atribuições de função do Microsoft Entra ID para grupos e tipos específicos de recursos personalizados (CRD) – centralmente, direto do Microsoft Entra ID, sem precisar criar manifestos Role e RoleBinding de RBAC do Kubernetes por cluster. Para obter informações sobre Azure ABAC, consulte O que são condições de atribuição de função Azure?

Quando usar condições ABAC

Use esse recurso quando quiser:

  • Restrinja quais grupos ou tipos de CRD um designado pode listar ou obter.
  • Aplique centralmente limites de acesso a recursos personalizados a partir do Microsoft Entra ID sem precisar gerenciar o RBAC do Kubernetes e os objetos Role e RoleBinding em cada cluster.
  • Distinguir entre CRDs publicados por diferentes operadores (por exemplo, permitir secrets-store.csi.x-k8s.io enquanto bloqueia security.istio.io).

Atributos de condição disponíveis

Os seguintes atributos de solicitação estão disponíveis ao criar condições para a API do Kubernetes em um cluster do AKS:

Attribute Descrição
Microsoft.ContainerService/managedClusters/customResources:group O grupo de API do recurso personalizado que está sendo acessado (por exemplo, secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind O tipo do recurso personalizado que está sendo acessado (por exemplo, secretproviderclasses).

Adicionar uma condição ABAC a uma atribuição de função

O exemplo a seguir cria uma função personalizada de Leitor de CRD do AKS que concede acesso de leitura a recursos personalizados. Em seguida, ele atribui a função com uma condição que só permite acesso a secretproviderclasses no grupo secrets-store.csi.x-k8s.io (o CRD usado pelo provedor do Azure Key Vault para o Secrets Store CSI Driver).

  1. Salve a definição de função a seguir em um arquivo nomeado crd-reader.json, substituindo <YOUR-SUBSCRIPTION-ID> por sua própria ID de assinatura.

    {
        "Name": "AKS CRD Reader",
        "Description": "Lets you read custom resources in the cluster.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/customresources/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. Crie a definição de função usando o az role definition create comando.

    az role definition create --role-definition @crd-reader.json
    
  3. Salve a seguinte condição em um arquivo chamado abac-condition.txt. A condição permite que leituras de recursos não personalizados passem inalteradas e restringe leituras de recursos personalizados a um grupo e tipo específicos.

    (
     (
      !(ActionMatches{'Microsoft.ContainerService/managedClusters/customresources/read'})
     )
     OR
     (
      @Request[Microsoft.ContainerService/managedClusters/customResources:group] StringEqualsIgnoreCase 'secrets-store.csi.x-k8s.io'
      AND
      @Request[Microsoft.ContainerService/managedClusters/customResources:kind] StringEqualsIgnoreCase 'secretproviderclasses'
     )
    )
    
  4. Crie a atribuição de função com a condição usando o az role assignment create comando.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS CRD Reader role with an ABAC condition
    az role assignment create \
        --role "AKS CRD Reader" \
        --assignee <AAD-ENTITY-ID> \
        --scope $AKS_ID \
        --condition "$(cat abac-condition.txt)" \
        --condition-version "2.0" \
        --description "Allow reads on SecretProviderClass resources only"
    

Você também pode adicionar uma condição por meio do portal do Azure. Na página Adicionar atribuição de função , selecione a guia Condições e, em seguida, selecione Adicionar condição e use o editor visual para criar a expressão.

Verificar a condição

Após a propagação da atribuição de função (o que pode levar até cinco minutos), faça login como o usuário designado e confirme se ele consegue ler o CRD autorizado, mas não os demais CRDs.

  1. Obtenha as credenciais do cluster usando o az aks get-credentials comando.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the cluster credentials
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Lista secretproviderclasses do grupo secrets-store.csi.x-k8s.io, conforme permitido pela condição. O comando deve ter êxito e retornar os recursos existentes ou uma lista vazia (ou um erro não encontrado se o CRD não estiver instalado no cluster).

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. Lista authorizationpolicies do grupo Istio security.istio.io que a condição bloqueia. O comando deve falhar com um erro Forbidden direto do webhook de autorização do Microsoft Entra ID (supondo que o CRD do Istio esteja instalado no cluster; caso contrário kubectl retorna um erro de página não encontrada antes que o servidor da API chegue ao webhook de autorização).

    kubectl get authorizationpolicies.security.istio.io --all-namespaces
    

Limpar os recursos

Desabilitar a autorização do Microsoft Entra ID

Remova a autorização do Microsoft Entra ID usando o comando az aks update com a opção --disable-azure-rbac.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Disable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac

Excluir atribuição de função

  1. Listar atribuições de função usando o az role assignment list comando.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # List role assignments for the AKS cluster
    az role assignment list --scope $AKS_ID --query [].id --output tsv
    
  2. Exclua as atribuições de função usando o az role assignment delete comando.

    az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
    

Excluir definição de função

Exclua uma definição de função personalizada usando o az role definition delete comando.

az role definition delete --name "AKS Deployment Reader"

Excluir o grupo de recursos e o cluster AKS

Exclua o grupo de recursos (e o cluster do AKS que ele contém) usando o az group delete comando.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>

# Delete the resource group and all resources in it
az group delete --name $RESOURCE_GROUP --yes --no-wait

Para saber mais sobre o AKS, confira os seguintes artigos: