Usar o RBAC do Azure para a autorização do Kubernetes

Hoje, você já pode aproveitar a autenticação integrada entre o Azure AD (Azure Active Directory) e o AKS. Quando habilitada, essa integração permite que os clientes usem usuários, grupos ou entidades de serviço do Azure AD como entidades no RBAC do Kubernetes; saiba mais aqui. Com esse recurso, você não precisa gerenciar identidades e credenciais de usuários separadamente para o Kubernetes. No entanto, você ainda precisa configurar e gerenciar o RBAC do Azure e o RBAC do Kubernetes separadamente. Para obter mais detalhes sobre a autenticação e a autorização com RBAC no AKS, consulte aqui.

Este documento trata de uma nova abordagem que permite o controle de acesso e o gerenciamento unificado entre recursos do Azure, o AKS e recursos do Kubernetes.

Antes de começar

A capacidade de gerenciar o RBAC para recursos do Kubernetes no Azure oferece a você a opção de gerenciar o RBAC para recursos de cluster usando o Azure ou mecanismos nativos do Kubernetes. Quando habilitada, as entidades de segurança do Azure AD serão validadas exclusivamente pelo RBAC do Azure, enquanto usuários e contas de serviço regulares do Kubernetes são validados exclusivamente pelo RBAC do Kubernetes. Para obter mais detalhes sobre a autenticação e a autorização com RBAC no AKS, consulte aqui.

Pré-requisitos

  • Verifique se você tem a CLI do Azure versão 2.24.0 ou posterior
  • Verifique se você instalou o kubectl v1.18.3+.

Limitações

  • Requer a integração do Azure AD gerenciado.
  • Use kubectl v1.18.3+.
  • Se você tem CRDs e está fazendo definições de função personalizadas, a única maneira de cobrir CRDs hoje é fornecer Microsoft.ContainerService/managedClusters/*/read. O AKS está trabalhando para fornecer permissões mais granulares para CRDs. Para os objetos restantes, você pode usar Grupos de API específicos, por exemplo: Microsoft.ContainerService/apps/deployments/read.
  • Novas atribuições de função podem levar até 5 min para serem propagadas e atualizadas pelo servidor de autorização.
  • Requer que o locatário do Azure AD configurado para autenticação seja o mesmo que o locatário da assinatura que contém o cluster do AKS.

Criar um cluster usando o RBAC do Azure e a integração do Azure AD gerenciado

Crie um cluster do AKS usando os comandos da CLI a seguir.

Criar um grupo de recursos do Azure:

# Create an Azure resource group
az group create --name myResourceGroup --location westus2

Crie o cluster do AKS com a integração do Azure AD gerenciado e o RBAC do Azure para Autorização do Kubernetes.

# Create an AKS-managed Azure AD cluster
az aks create -g MyResourceGroup -n MyManagedCluster --enable-aad --enable-azure-rbac

Uma criação bem-sucedida de um cluster com integração do Azure AD e a RBAC do Azure para Autorização do Kubernetes tem a seguinte seção no corpo da resposta:

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

Integrar o RBAC do Azure a um cluster existente

Observação

Para usar a autorização do Azure RBAC para Kubernetes, a integração do Azure Active Directory deve ser habilitada no cluster. Para obter mais informações, consulte integração de Azure Active Directory.

Para adicionar o RBAC do Azure para autorização de Kubernetes em um cluster existente do AKS, use o comando az aks update com o sinalizador enable-azure-rbac.

az aks update -g myResourceGroup -n myAKSCluster --enable-azure-rbac

Para remover o RBAC do Azure para autorização de Kubernetes de um cluster existente do AKS, use o comando az aks update com o sinalizador disable-azure-rbac.

az aks update -g myResourceGroup -n myAKSCluster --disable-azure-rbac

Criar atribuições de função para usuários acessarem o cluster

O AKS fornece as seguintes quatro funções internas:

Função Descrição
Leitor de 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 de 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 uma ServiceAccount no namespace, de modo que ela pode ser usada para obter os níveis de acesso de API de qualquer conta no namespace.
Administrador do RBAC do Serviço de Kubernetes do Azure Permite o 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 do RBAC do Serviço de Kubernetes do Azure Permite o acesso de superusuário para executar ações em qualquer recurso. Fornece controle total sobre cada recurso no cluster e em todos os namespaces.

Atribuições de função com escopo definido para todo o cluster do AKS podem ser feitas na folha de Controle de Acesso (IAM) do recurso de cluster no portal do Azure ou usando comandos da CLI do Azure, como mostrado abaixo:

# Get your AKS Resource ID
AKS_ID=$(az aks show -g MyResourceGroup -n MyManagedCluster --query id -o tsv)
az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID

em que <AAD-ENTITY-ID> pode ser um nome de usuário (por exemplo, user@contoso.com) ou até a ClientID de uma entidade de serviço.

Você também pode criar atribuições de função com escopo para um namespace específico dentro do cluster:

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

Atualmente, atribuições de função com escopo para namespaces precisam ser configuradas por meio da CLI do Azure.

Criar definições de função personalizadas

Opcionalmente, você pode optar por criar sua definição de função e atribuí-la como descrito acima.

Veja a seguir um exemplo de definição de função que permite que um usuário leia somente implantações e nada mais. Veja a lista completa de ações possíveis aqui.

Copie o JSON abaixo para um arquivo chamado 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>"
    ]
}

Substitua <YOUR SUBSCRIPTION ID> pela ID da assinatura, que você pode obter executando:

az account show --query id -o tsv

Agora, podemos criar a definição de função executando o comando abaixo da pasta em que você salvou deploy-view.json:

az role definition create --role-definition @deploy-view.json 

Agora que você tem a definição de função, pode atribuí-la a um usuário ou a outra identidade executando:

az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID

Usar o RBAC do Azure para Autorização do Kubernetes com kubectl

Observação

Verifique se você tem o último kubectl executando o seguinte comando:

az aks install-cli

Talvez seja necessário executá-lo com privilégios sudo.

Agora que atribuiu a função e as permissões desejadas, você pode começar a chamar a API do Kubernetes, por exemplo, de kubectl.

Para essa finalidade, primeiro vamos obter o kubeconfig do cluster usando o seguinte comando:

az aks get-credentials -g MyResourceGroup -n MyManagedCluster

Importante

Você precisará da função interna de Usuário do cluster do Serviço de Kubernetes do Azure para executar a etapa anterior.

Agora, você pode usar o kubectl para listar os nós no cluster, por exemplo. Na primeira vez que executá-lo, você precisará entrar e os comandos posteriores usarão o respectivo token de acesso.

kubectl get nodes
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

NAME                                STATUS   ROLES   AGE    VERSION
aks-nodepool1-93451573-vmss000000   Ready    agent   3h6m   v1.15.11
aks-nodepool1-93451573-vmss000001   Ready    agent   3h6m   v1.15.11
aks-nodepool1-93451573-vmss000002   Ready    agent   3h6m   v1.15.11

Usar o RBAC do Azure para Autorização do Kubernetes com kubelogin

Para desbloquear cenários adicionais, como logons não interativos, versões de kubectl mais antigas ou aproveitar o SSO em vários clusters sem precisar entrar no novo cluster, desde que o token ainda seja válido, o AKS criou um plug-in exec chamado kubelogin.

Use-o executando:

export KUBECONFIG=/path/to/kubeconfig
kubelogin convert-kubeconfig

Na primeira vez, você precisará entrar de maneira interativa com o kubectl regular, mas depois não precisará mais fazer isso, mesmo para novos clusters do Azure AD (desde que o token ainda seja válido).

kubectl get nodes
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

NAME                                STATUS   ROLES   AGE    VERSION
aks-nodepool1-93451573-vmss000000   Ready    agent   3h6m   v1.15.11
aks-nodepool1-93451573-vmss000001   Ready    agent   3h6m   v1.15.11
aks-nodepool1-93451573-vmss000002   Ready    agent   3h6m   v1.15.11

Limpeza

Limpe a atribuição de função

az role assignment list --scope $AKS_ID --query [].id -o tsv

Copie a ID ou as IDs de todas as atribuições que você fez.

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

Limpe a definição de função

az role definition delete -n "AKS Deployment Reader"

Exclua o cluster e o grupo de recursos

az group delete -n MyResourceGroup

Próximas etapas

  • Leia mais sobre a Autenticação do AKS, a Autorização, o RBAC do Kubernetes e o RBAC do Azure aqui.
  • Leia mais sobre o RBAC do Azure aqui.
  • Leia mais sobre todas as ações que você pode usar para definir de maneira granular funções personalizadas do Azure para autorização do Kubernetes aqui.