Usar o RBAC do Azure em clusters Kubernetes habilitados para Azure Arc
Os tipos de objeto Kubernetes ClusterRoleBinding e RoleBinding ajudam a definir a autorização no Kubernetes nativamente. Usando esse recurso, você pode usar a ID do Microsoft Entra e as atribuições de função no Azure para controlar as verificações de autorização no cluster. As atribuições de função do Azure permitem controlar granularmente quais usuários podem ler, gravar e excluir objetos do Kubernetes, como implantação, pod e serviço.
Para obter uma visão geral conceitual desse recurso, consulte Azure RBAC no Kubernetes habilitado para Azure Arc.
Pré-requisitos
Instale ou atualize a CLI do Azure para a versão mais recente.
Instale a versão mais recente da extensão CLI do
connectedk8s
Azure:az extension add --name connectedk8s
Se a
connectedk8s
extensão já estiver instalada, você poderá atualizá-la para a versão mais recente usando o seguinte comando:az extension update --name connectedk8s
Ligue um cluster do Kubernetes compatível com o Azure Arc:
- Se ainda não associou um cluster, utilize o nosso início rápido.
- Atualize seus agentes para a versão mais recente.
Nota
O Azure RBAC não está disponível para ofertas do Red Hat OpenShift ou do Kubernetes gerenciado em que o acesso do usuário ao servidor de API é restrito (por exemplo, Amazon Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE)).
Atualmente, o RBAC do Azure não oferece suporte a clusters Kubernetes que operam na arquitetura ARM64. Use o RBAC do Kubernetes para gerenciar o controle de acesso para clusters Kubernetes baseados em ARM64.
Para clusters do Serviço Kubernetes do Azure (AKS), esse recurso está disponível nativamente e não exige que o cluster AKS esteja conectado ao Azure Arc.
Para clusters do Serviço Kubernetes do Azure (AKS) habilitados pelo Azure Arc no Azure Stack HCI 23H2, a habilitação do RBAC do Azure atualmente só é suportada durante a criação do cluster do Kubernetes. Para criar um cluster AKS habilitado pelo Azure Arc com o Azure RBAC habilitado, siga o guia de autorização Usar o RBAC do Azure para Kubernetes. Observe que o RBAC do Azure não tem suporte para o Azure Stack HCI, versão 22H2.
Ativar o RBAC do Azure no cluster
Obtenha a identidade MSI do cluster executando o seguinte comando:
az connectedk8s show -g <resource-group> -n <connected-cluster-name>
Obtenha a ID (
identity.principalId
) da saída e execute o seguinte comando para atribuir a função Leitor de CheckAccess de Identidade Gerenciado de Cluster Conectado ao MSI do cluster:az role assignment create --role "Connected Cluster Managed Identity CheckAccess Reader" --assignee "<Cluster MSI ID>" --scope <cluster ARM ID>
Habilite o RBAC (controle de acesso baseado em função) do Azure em seu cluster Kubernetes habilitado para Azure Arc executando o seguinte comando:
az connectedk8s enable-features -n <clusterName> -g <resourceGroupName> --features azure-rbac
Nota
Antes de executar o comando anterior, verifique se o
kubeconfig
arquivo na máquina está apontando para o cluster no qual você habilitará o recurso RBAC do Azure.Use
--skip-azure-rbac-list
com o comando anterior para uma lista separada por vírgulas de nomes de usuário, emails e conexões OpenID que passam por verificações de autorização usando objetos e nativos do Kubernetes emClusterRoleBinding
RoleBinding
vez do RBAC do Azure.
Cluster genérico onde nenhum reconciliador está sendo executado na apiserver
especificação
SSH em cada nó mestre do cluster e execute as seguintes etapas:
Se o seu
kube-apiserver
é um pod estático:O
azure-arc-guard-manifests
segredo nokube-system
namespace contém dois arquivos:guard-authn-webhook.yaml
eguard-authz-webhook.yaml
. Copie esses arquivos para o/etc/guard
diretório do nó.sudo mkdir -p /etc/guard kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authn-webhook.yaml"' | base64 -d > /etc/guard/guard-authn-webhook.yaml kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authz-webhook.yaml"' | base64 -d > /etc/guard/guard-authz-webhook.yaml
Abra o manifesto
apiserver
no modo de edição:sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
Adicione a seguinte especificação em
volumes
:- hostPath path: /etc/guard type: Directory name: azure-rbac
Adicione a seguinte especificação em
volumeMounts
:- mountPath: /etc/guard name: azure-rbac readOnly: true
Se o seu
kube-apiserver
não é um pod estático:Abra o manifesto
apiserver
no modo de edição:sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
Adicione a seguinte especificação em
volumes
:- name: azure-rbac secret: secretName: azure-arc-guard-manifests
Adicione a seguinte especificação em
volumeMounts
:- mountPath: /etc/guard name: azure-rbac readOnly: true
Adicione os seguintes
apiserver
argumentos:- --authentication-token-webhook-config-file=/etc/guard/guard-authn-webhook.yaml - --authentication-token-webhook-cache-ttl=5m0s - --authorization-webhook-cache-authorized-ttl=5m0s - --authorization-webhook-config-file=/etc/guard/guard-authz-webhook.yaml - --authorization-webhook-version=v1 - --authorization-mode=Node,RBAC,Webhook
Se o cluster do Kubernetes for a versão 1.19.0 ou posterior, você também precisará definir o seguinte
apiserver
argumento:- --authentication-token-webhook-version=v1
Salve e feche o editor para atualizar o
apiserver
pod.
Cluster criado usando a API de Cluster
Copie o segredo de proteção que contém arquivos de configuração de webhook de autenticação e autorização do cluster de carga de trabalho para sua máquina:
kubectl get secret azure-arc-guard-manifests -n kube-system -o yaml > azure-arc-guard-manifests.yaml
Altere o
namespace
campo no arquivo azure-arc-guard-manifests.yaml para o namespace dentro do cluster de gerenciamento onde você está aplicando os recursos personalizados para a criação de clusters de carga de trabalho.Aplique este manifesto:
kubectl apply -f azure-arc-guard-manifests.yaml
Edite o
KubeadmControlPlane
objeto executandokubectl edit kcp <clustername>-control-plane
:Adicione o seguinte trecho em
files
:- contentFrom: secret: key: guard-authn-webhook.yaml name: azure-arc-guard-manifests owner: root:root path: /etc/kubernetes/guard-authn-webhook.yaml permissions: "0644" - contentFrom: secret: key: guard-authz-webhook.yaml name: azure-arc-guard-manifests owner: root:root path: /etc/kubernetes/guard-authz-webhook.yaml permissions: "0644"
Adicione o seguinte trecho em
apiServer
>extraVolumes
:- hostPath: /etc/kubernetes/guard-authn-webhook.yaml mountPath: /etc/guard/guard-authn-webhook.yaml name: guard-authn readOnly: true - hostPath: /etc/kubernetes/guard-authz-webhook.yaml mountPath: /etc/guard/guard-authz-webhook.yaml name: guard-authz readOnly: true
Adicione o seguinte trecho em
apiServer
>extraArgs
:authentication-token-webhook-cache-ttl: 5m0s authentication-token-webhook-config-file: /etc/guard/guard-authn-webhook.yaml authentication-token-webhook-version: v1 authorization-mode: Node,RBAC,Webhook authorization-webhook-cache-authorized-ttl: 5m0s authorization-webhook-config-file: /etc/guard/guard-authz-webhook.yaml authorization-webhook-version: v1
Salve e feche para atualizar o
KubeadmControlPlane
objeto. Aguarde até que essas alterações apareçam no cluster de carga de trabalho.
Criar atribuições de funções para os utilizadores acederem ao cluster
Os proprietários do recurso Kubernetes habilitado para Azure Arc podem usar funções internas ou funções personalizadas para conceder a outros usuários acesso ao cluster do Kubernetes.
Funções incorporadas
Função | Description |
---|---|
Azure Arc Kubernetes Viewer | Permite acesso somente leitura para ver a maioria dos objetos em um namespace. Essa função não permite a exibição de segredos, porque read a permissão em segredos permitiria o acesso a ServiceAccount credenciais no namespace. Essas credenciais, por sua vez, permitiriam o acesso à API por meio desse ServiceAccount valor (uma forma de escalonamento de privilégios). |
Azure Arc Kubernetes Writer | 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, essa função permite acessar segredos e executar pods como qualquer ServiceAccount valor no namespace, para que possa ser usada para obter os níveis de acesso à API de qualquer ServiceAccount valor no namespace. |
Azure Arc Kubernetes Admin | Permite acesso de administrador. Destina-se a ser concedido dentro de um namespace por meio RoleBinding do . Se você usá-lo no RoleBinding , ele permitirá acesso de leitura/gravação à maioria dos recursos em um namespace, incluindo a capacidade de criar funções e associações de função dentro do namespace. Essa função não permite acesso de gravação à cota de recursos ou ao namespace em si. |
Azure Arc Kubernetes Cluster Admin | Permite o acesso de superusuário para executar qualquer ação em qualquer recurso. Quando você o usa no ClusterRoleBinding , ele dá controle total sobre todos os recursos no cluster e em todos os namespaces. Quando você o usa no RoleBinding , ele dá controle total sobre todos os recursos no namespace da associação de função, incluindo o namespace em si. |
Você pode criar atribuições de função com escopo para o cluster Kubernetes habilitado para Azure Arc no portal do Azure no painel Controle de Acesso (IAM) do recurso de cluster. Você também pode usar os seguintes comandos da CLI do Azure:
az role assignment create --role "Azure Arc Kubernetes Cluster Admin" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID
Nesses comandos, AZURE-AD-ENTITY-ID
pode ser um nome de usuário (por exemplo, testuser@mytenant.onmicrosoft.com
) ou até mesmo o appId
valor de uma entidade de serviço.
Aqui está outro exemplo de criação de uma atribuição de função com escopo para um namespace específico dentro do cluster:
az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
Nota
Você pode criar atribuições de função com escopo para o cluster usando o portal do Azure ou a CLI do Azure. No entanto, somente a CLI do Azure pode ser usada para criar atribuições de função com escopo para namespaces.
Funções personalizadas
Você pode optar por criar sua própria definição de função para uso em atribuições de função.
Percorra o exemplo a seguir de uma definição de função que permite que um usuário leia apenas implantações. Para obter mais informações, consulte a lista completa de ações de dados que você pode usar para construir uma definição de função.
Copie o seguinte objeto JSON em um arquivo chamado custom-role.json. Substitua o espaço reservado <subscription-id>
pela ID de assinatura real. A função personalizada usa uma das ações de dados e permite exibir todas as implantações no escopo (cluster ou namespace) onde a atribuição de função é criada.
{
"Name": "Arc Deployment Viewer",
"Description": "Lets you view all deployments in cluster/namespace.",
"Actions": [],
"NotActions": [],
"DataActions": [
"Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
],
"NotDataActions": [],
"assignableScopes": [
"/subscriptions/<subscription-id>"
]
}
Crie a definição de função executando o seguinte comando da pasta onde você salvou custom-role.json:
az role definition create --role-definition @custom-role.json
Crie uma atribuição de função usando esta definição de função personalizada:
az role assignment create --role "Arc Deployment Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
Configurar kubectl com credenciais de usuário
Há duas maneiras de obter o arquivo kubeconfig necessário para acessar o cluster:
- Use o recurso cluster Connect (
az connectedk8s proxy
) do cluster Kubernetes habilitado para Azure Arc. - O administrador do cluster compartilha o arquivo kubeconfig com todos os outros usuários.
Usar conexão de cluster
Execute o seguinte comando para iniciar o processo de proxy:
az connectedk8s proxy -n <clusterName> -g <resourceGroupName>
Depois que o processo de proxy estiver em execução, você poderá abrir outra guia no console para começar a enviar suas solicitações para o cluster.
Usar um arquivo kubeconfig compartilhado
Usar um kubeconfig compartilhado requer etapas ligeiramente diferentes, dependendo da sua versão do Kubernetes.
Execute o seguinte comando para definir as credenciais para o usuário. Especificar
serverApplicationId
como6256c85f-0aad-4d50-b960-e6e9b21efe35
eclientApplicationId
como3f4439ff-e698-4d6d-84fe-09c9d574f06b
:kubectl config set-credentials <testuser>@<mytenant.onmicrosoft.com> \ --auth-provider=azure \ --auth-provider-arg=environment=AzurePublicCloud \ --auth-provider-arg=client-id=<clientApplicationId> \ --auth-provider-arg=tenant-id=<tenantId> \ --auth-provider-arg=apiserver-id=<serverApplicationId>
Abra o arquivo kubeconfig que você criou anteriormente. Em
contexts
, verifique se o contexto associado ao cluster aponta para as credenciais de usuário que você criou na etapa anterior. Para definir o contexto atual para essas credenciais de usuário, execute o seguinte comando:kubectl config set-context --current=true --user=<testuser>@<mytenant.onmicrosoft.com>
Adicione a configuração do modo de configuração em
user
>config
:name: testuser@mytenant.onmicrosoft.com user: auth-provider: config: apiserver-id: $SERVER_APP_ID client-id: $CLIENT_APP_ID environment: AzurePublicCloud tenant-id: $TENANT_ID config-mode: "1" name: azure
Nota
Exec plugin é uma estratégia de autenticação Kubernetes que permite
kubectl
executar um comando externo para receber credenciais de usuário para enviar paraapiserver
. A partir do Kubernetes versão 1.26, o plug-in de autorização padrão do Azure não está mais incluído noclient-go
ekubectl
. Com versões posteriores, para usar o plug-in exec para receber credenciais de usuário, você deve usar o Azure Kubelogin, umclient-go
plug-in de credencial (exec) que implementa a autenticação do Azure.Instale o Azure Kubelogin:
Para Windows ou Mac, siga as instruções de instalação do Kubelogin do Azure.
Para Linux ou Ubuntu, baixe a versão mais recente do kubelogin e execute os seguintes comandos:
curl -LO https://github.com/Azure/kubelogin/releases/download/"$KUBELOGIN_VERSION"/kubelogin-linux-amd64.zip unzip kubelogin-linux-amd64.zip sudo mv bin/linux_amd64/kubelogin /usr/local/bin/ sudo chmod +x /usr/local/bin/kubelogin
O Kubelogin pode ser usado para autenticar com clusters habilitados para Azure Arc solicitando um token de prova de posse (PoP). Converta o kubeconfig usando kubelogin para usar o modo de login apropriado. Por exemplo, para login de código de dispositivo com um usuário do Microsoft Entra, os comandos seriam os seguintes:
export KUBECONFIG=/path/to/kubeconfig kubelogin convert-kubeconfig --pop-enabled --pop-claims 'u=<ARM ID of cluster>"
Enviar solicitações para o cluster
Execute qualquer
kubectl
comando. Por exemplo:kubectl get nodes
kubectl get pods
Depois que for solicitada a autenticação baseada em navegador, copie o URL de login do dispositivo (
https://microsoft.com/devicelogin
) e abra-o no navegador da Web.Introduza o código impresso na consola. Copie e cole o código no seu terminal no prompt de entrada de autenticação do dispositivo.
Introduza o nome de utilizador (
testuser@mytenant.onmicrosoft.com
) e a palavra-passe associada.Se vir uma mensagem de erro como esta, significa que não está autorizado a aceder ao recurso solicitado:
Error from server (Forbidden): nodes is forbidden: User "testuser@mytenant.onmicrosoft.com" cannot list resource "nodes" in API group "" at the cluster scope: User doesn't have access to the resource in Azure. Update role assignment to allow access.
Um administrador precisa criar uma nova atribuição de função que autorize esse usuário a ter acesso ao recurso.
Usar o Acesso Condicional com o ID do Microsoft Entra
Ao integrar a ID do Microsoft Entra com seu cluster Kubernetes habilitado para Azure Arc, você também pode usar o Acesso Condicional para controlar o acesso ao cluster.
Nota
O Acesso Condicional do Microsoft Entra é um recurso P2 do Microsoft Entra ID.
Para criar um exemplo de política de Acesso Condicional para usar com o cluster:
Na parte superior do portal do Azure, procure e selecione Microsoft Entra ID.
No menu do Microsoft Entra ID no lado esquerdo, selecione Aplicativos corporativos.
No menu para aplicações empresariais no lado esquerdo, selecione Acesso Condicional.
No menu Acesso Condicional, no lado esquerdo, selecione Políticas>Nova política.
Insira um nome para a política, como arc-k8s-policy.
Selecionar Utilizadores e grupos. Em Incluir, escolha Selecionar usuários e grupos. Em seguida, escolha os usuários e grupos onde deseja aplicar a política. Para este exemplo, escolha o mesmo grupo do Microsoft Entra que tem acesso administrativo ao cluster.
Selecione Aplicações na cloud ou ações. Em Incluir, escolha Selecionar aplicativos. Em seguida, procure e selecione o aplicativo de servidor que você criou anteriormente.
Em Controles de acesso, selecione Conceder. Selecione Conceder acesso Exigir que>o dispositivo seja marcado como compatível.
Em Ativar política, selecione Ao>criar.
Acesse o cluster novamente. Por exemplo, execute o kubectl get nodes
comando para exibir nós no cluster:
kubectl get nodes
Siga as instruções para iniciar sessão novamente. Uma mensagem de erro indica que você está conectado com êxito, mas o administrador exige que o dispositivo que está solicitando acesso seja gerenciado pela ID do Microsoft Entra para acessar o recurso. Siga estes passos:
No portal do Azure, vá para Microsoft Entra ID.
Selecione Aplicações empresariais. Em seguida, em Atividade, selecione Entrar.
Uma entrada na parte superior mostra Falha para Status e Sucesso para Acesso Condicional. Selecione a entrada e, em seguida, selecione Acesso condicional em Detalhes. Observe que sua política de Acesso Condicional está listada.
Configurar o acesso ao cluster just-in-time com o Microsoft Entra ID
Outra opção para o controle de acesso ao cluster é usar o Privileged Identity Management (PIM) para solicitações just-in-time.
Nota
O Microsoft Entra PIM é um recurso do Microsoft Entra ID P2. Para obter mais informações sobre as SKUs do Microsoft Entra ID, consulte o guia de preços.
Para configurar solicitações de acesso just-in-time para seu cluster, conclua as seguintes etapas:
Na parte superior do portal do Azure, procure e selecione Microsoft Entra ID.
Anote o ID do inquilino. Para o restante dessas instruções, nos referiremos a essa ID como
<tenant-id>
.No menu do Microsoft Entra ID no lado esquerdo, em Gerenciar, selecione Novo grupo de grupos>.
Certifique-se de que Segurança está selecionada para Tipo de grupo. Insira um nome de grupo, como myJITGroup. Em Microsoft Entra funções podem ser atribuídas a este grupo (Pré-visualização), selecione Sim. Por fim, selecione Criar.
Você será levado de volta à página Grupos . Selecione o grupo recém-criado e anote o ID do objeto. Para o resto destas instruções, referir-nos-emos a este ID como
<object-id>
.De volta ao portal do Azure, no menu Atividade do lado esquerdo, selecione Acesso privilegiado (visualização). Em seguida, selecione Ativar acesso privilegiado.
Selecione Adicionar atribuições para começar a conceder acesso.
Selecione uma função de Membro e selecione os usuários e grupos aos quais você deseja conceder acesso ao cluster. Um administrador de grupo pode modificar essas atribuições a qualquer momento. Quando estiver pronto para seguir em frente, selecione Avançar.
Escolha um tipo de atribuição de Ativo, escolha a duração desejada e forneça uma justificação. Quando estiver pronto para continuar, selecione Atribuir. Para obter mais informações sobre tipos de atribuição, consulte Atribuir elegibilidade para um grupo de acesso privilegiado (visualização) no Privileged Identity Management.
Depois de fazer as atribuições, verifique se o acesso just-in-time está funcionando acessando o cluster. Por exemplo, use o kubectl get nodes
comando para exibir nós no cluster:
kubectl get nodes
Observe o requisito de autenticação e siga as etapas para autenticar. Se a autenticação for bem-sucedida, você verá uma saída semelhante a esta:
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
node-1 Ready agent 6m36s v1.18.14
node-2 Ready agent 6m42s v1.18.14
node-3 Ready agent 6m33s v1.18.14
Próximos passos
- Conecte-se com segurança ao cluster usando o Cluster Connect.
- Leia sobre a arquitetura do Azure RBAC no Kubernetes habilitado para Arc.