Utilize a autorização do Microsoft Entra ID para a API do Kubernetes no Azure Kubernetes Service (AKS)

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

Este artigo mostra como autorizar chamadas para a API Kubernetes no Azure Kubernetes Service (AKS) utilizando identidades do Microsoft Entra ID. A autorização do Microsoft Entra ID para a API Kubernetes utiliza atribuições de funções Azure RBAC para conceder acesso aos recursos Kubernetes. Para recursos Kubernetes incorporados, atribua um dos papéis incorporados do AKS (como o Azure Kubernetes Service RBAC Reader) no âmbito do cluster ou namespace. Para recursos personalizados (CRDs), atribua uma função personalizada com condições Azure ABAC que especifiquem a quais grupos ou tipos de CRD o destinatário pode aceder. As duas atribuições de função são compostas por: uma concede acesso aos 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 Automatic é a opção predefinida pronta para produção recomendada para o AKS. Os clusters automáticos do AKS estão pré-configurados com autorização Azure RBAC para Kubernetes, para que possa concentrar-se em atribuir as atribuições corretas de funções Microsoft Entra a utilizadores, grupos e principais de serviço.

Para uma visão conceptual das opções de autorização da API Kubernetes disponíveis no AKS, consulte conceitos de autorização de cluster.

Note

Quando utiliza autenticação integrada entre o Microsoft Entra ID e o AKS, pode usar utilizadores, grupos ou entidades de serviço do Microsoft Entra como sujeitos no controlo de acesso baseado em papéis Kubernetes (Kubernetes RBAC). Ao usar a autorização Microsoft Entra ID, não precisa de gerir separadamente as identidades e credenciais dos utilizadores para o Kubernetes. No entanto, continua a ser necessário configurar e gerir, em separado, as atribuições de funções do Microsoft Entra ID e quaisquer associações RBAC do Kubernetes.

Note

Os clusters automáticos do AKS estão pré-configurados para usar o Azure RBAC para a autorização do Kubernetes. Não precisas de ativar --enable-azure-rbac nos clusters automáticos do AKS. No AKS Standard, pode ativar ou desativar o Azure RBAC consoante a configuração do seu cluster.

Prerequisites

  • Precisas que a versão 2.24.0 ou posterior do CLI do Azure esteja instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, consulte Install CLI do Azure.
  • Precisas de kubectl, com uma versão mínima da 1.18.3.
  • Precisa de ter a integração gerida com o Microsoft Entra ativada no seu cluster antes de poder adicionar a autorização do Microsoft Entra ID para a API Kubernetes. Se precisar de ativar a integração gerida com o Microsoft Entra, consulte Usar o ID 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 inquilino do Microsoft Entra configurado para autenticação seja o mesmo inquilino da subscrição que contém o seu cluster do AKS.

Comportamento do modo cluster do AKS

Modo de cluster Azure RBAC para autorização no Kubernetes
AKS Automático Pré-configurado (ativado por defeito)
Padrão AKS Opcional (ativar com --enable-azure-rbac)

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

Para novas cargas de produção, use o AKS Automatic. A autorização Azure RBAC for Kubernetes está pré-configurada em clusters automáticos AKS.

  1. Crie um cluster automático AKS seguindo Criar um cluster automático Azure Kubernetes Service (AKS).

  2. Opcional: verifique se a autorização Azure RBAC for Kubernetes está ativada no seu cluster usando o az aks show comando.

    # 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
    

Padrão AKS

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

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

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

    Sua saída deve ser semelhante à saída de exemplo a seguir:

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

Ative a autorização do Microsoft Entra ID num cluster AKS existente

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

# 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á têm a autorização Azure RBAC for Kubernetes pré-configurada. Não é preciso executar --enable-azure-rbac para o AKS Automatic.

Funções predefinidas no AKS

O AKS fornece as seguintes funções incorporadas:

Função Description
Azure Kubernetes Service RBAC Reader Permite acesso somente leitura para ver a maioria dos objetos em um namespace. Ele não permite a visualização de funções ou associações de funções. Esta função não permite visualizar Secrets, pois ler o conteúdo dos Secrets possibilita o acesso às credenciais do ServiceAccount no namespace, o que permitiria acesso à API como qualquer ServiceAccount no namespace (uma forma de escalonamento de privilégios).
Escritor RBAC do Serviço Kubernetes do Azure Permite acesso de leitura/gravação à maioria dos objetos em um namespace. Esta função não permite visualizar ou modificar funções ou associações de funções. No entanto, este papel permite aceder Secrets e executar Pods como qualquer ServiceAccount no namespace, podendo assim ser usado para obter os níveis de acesso à API de qualquer ServiceAccount no namespace.
Azure Kubernetes Service RBAC Admin Permite acesso de administrador, destinado a ser concedido dentro de um namespace. Permite acesso de leitura/gravação à maioria dos recursos em um namespace (ou escopo de cluster), incluindo a capacidade de criar funções e associações de função dentro do namespace. Esta função não permite acesso de escrita à quota de recursos nem ao próprio namespace.
Azure Kubernetes Service RBAC Cluster Admin Permite o acesso de superusuário para executar qualquer ação em qualquer recurso. Dá controlo total sobre todos os recursos no cluster e em todos os namespaces.

Criar atribuições de funções para acesso a clusters

  1. Obtenha o ID do seu recurso 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 utilizador ou o ID do cliente de um principal de serviço. O exemplo seguinte cria uma atribuição de papel para o papel de Administrador RBAC do Azure Kubernetes Service.

    # 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

    Pode criar as atribuições de funções Azure Kubernetes Service RBAC Reader e Azure Kubernetes Service RBAC Writer delimitadas a um namespace específico no cluster, utilizando o comando az role assignment create e definindo o âmbito para o namespace pretendido.

    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 Kubernetes incorporados, as definições de funções personalizadas referenciam a ação do grupo de API correspondente sob Microsoft.ContainerService/managedClusters/. O exemplo seguinte permite ao utilizador ler apenas implementações e nada mais. Para a lista completa de possíveis ações, consulte as operações do Microsoft.ContainerService.

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

  1. Para criar as suas próprias definições de funções personalizadas, copie o ficheiro seguinte, substitua <YOUR-SUBSCRIPTION-ID> pelo seu próprio ID de subscrição e depois guarde-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 az role definition create comando, definindo o --role-definition para o deploy-view.json ficheiro que criou no passo anterior.

    az role definition create --role-definition @deploy-view.json 
    
  3. Atribuir a definição de função a um utilizador 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 (prévia)

Importante

Os recursos de pré-visualização do AKS estão disponíveis numa base de autosserviço e adesão voluntária. 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 versões de teste do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Assim sendo, estas funcionalidades não se destinam ao uso em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

As condições ABAC permitem-lhe filtrar as atribuições de funções do Microsoft Entra ID para grupos e tipos específicos de recursos personalizados (CRD) — de forma centralizada, no Microsoft Entra ID, sem escrever manifestos Role de RBAC do Kubernetes e RoleBinding do Kubernetes para cada cluster. Para contexto sobre o Azure ABAC, veja Quais são as condições de atribuição de funções no Azure?

Quando usar as condições ABAC

Use esta funcionalidade quando quiser:

  • Restringa que grupos ou tipos de CRD um cessionário pode listar ou obter.
  • Aplicar limites personalizados de acesso a recursos de forma centralizada a partir do Microsoft Entra ID, sem a necessidade de gerir o RBAC do Kubernetes e os objetos em cada cluster.
  • Distinguir entre CRDs publicados por diferentes operadores (por exemplo, permitir secrets-store.csi.x-k8s.io ao mesmo tempo que bloqueia security.istio.io).

Atributos de condição disponíveis

Os seguintes atributos de pedido estão disponíveis ao criar condições para a API Kubernetes num cluster AKS:

Attribute Description
Microsoft.ContainerService/managedClusters/customResources:group O grupo de API do recurso personalizado acedido (por exemplo, secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind O tipo do recurso personalizado a ser acedido (por exemplo, secretproviderclasses).

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

O exemplo seguinte cria a função personalizada AKS CRD Reader, que concede acesso de leitura a recursos personalizados. Depois, atribui a função com uma condição que só permite o acesso a secretproviderclasses no grupo secrets-store.csi.x-k8s.io (o CRD utilizado pelo fornecedor Azure Key Vault para o Secrets Store CSI Driver).

  1. Guarde a seguinte definição de função num ficheiro chamado crd-reader.json, substituindo <YOUR-SUBSCRIPTION-ID> pelo seu próprio ID de subscrição.

    {
        "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 do papel usando o az role definition create comando.

    az role definition create --role-definition @crd-reader.json
    
  3. Guardar a seguinte condição num ficheiro chamado abac-condition.txt. A condição permite que leituras de recursos não personalizadas passem sem alterações e restringe leituras personalizadas 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ções 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"
    

Também podes adicionar uma condição através do portal Azure. Na página Adicionar atribuição de funções , selecione o separador Condições , depois selecione Adicionar condição e use o editor visual para construir a expressão.

Verificar a condição

Depois de a atribuição da função se propagar (até cinco minutos), inicie sessão como designado e confirme que consegue ler o CRD permitido, mas não outros 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, permitido pela condição. O comando deve ter sucesso e devolver ou os recursos existentes ou uma lista vazia (ou um erro de 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, bloqueada pela condição. O comando deve falhar com um Forbidden erro do webhook de autorização do Microsoft Entra ID (assumindo que o CRD Istio está instalado no cluster; caso contráriokubectl, retorna um erro não encontrado antes do servidor API chegar ao webhook de autorização).

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

Limpeza de recursos

Desativar a autorização do Microsoft Entra ID

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

# 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. Liste as atribuições de funções 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. Apaga as atribuições de funções usando o az role assignment delete comando.

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

Excluir definição de função

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

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

Eliminar grupo de recursos e cluster AKS

Elimina o grupo de recursos (e o cluster 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, consulte os seguintes artigos: