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