Implantar e configurar a identidade da carga de trabalho (versão prévia) em um cluster Serviço de Kubernetes do Azure (AKS)

O AKS (Serviço de Kubernetes do Azure) é um serviço de Kubernetes gerenciado que permite implantar e gerenciar clusters do Kubernetes rapidamente. Neste artigo, você irá:

  • Implantar um cluster do AKS usando a CLI do Azure que inclui o Emissor do OpenID Connect e uma ID de Carga de Trabalho do Microsoft Entra
  • Conceder acesso ao Azure Key Vault
  • Criar uma ID de Carga de Trabalho do Microsoft Entra e uma conta de serviço do Kubernetes
  • Configurar a identidade gerenciada para federação de token.

Este artigo pressupõe que você tenha uma compreensão básica dos conceitos do Kubernetes. Para obter mais informações, confira Principais conceitos do Kubernetes para o AKS (Serviço de Kubernetes do Azure). Se você não estiver familiarizado com a ID de Carga de Trabalho do Microsoft Entra, consulte o artigo visão geral a seguir.

  • Este artigo requer a versão 2.47.0 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

  • A identidade que você está usando para criar o cluster tem as permissões mínimas apropriadas. Para obter mais informações sobre o acesso e identidade do AKS, confiraOpções de acesso e identidade para o Serviço de Kubernetes do Azure (AKS).

  • Se tiver várias assinaturas do Azure, selecione a ID da assinatura adequada para cobrança dos recursos usando o comando az account.

Observação

Em vez de configurar todas as etapas manualmente, há outra implementação chamada Conector de serviço que ajudará você a configurar algumas etapas automaticamente e obter o mesmo resultado. Veja também: Tutorial: conectar-se à conta de armazenamento do Azure no Serviço de Kubernetes do Azure (AKS) com o conector de serviço usando a identidade da carga de trabalho.

Exportar variáveis de ambiente

Para ajudar a simplificar as etapas de configuração das identidades necessárias, as etapas abaixo definem as variáveis de ambiente para referência no cluster.

Execute os comandos a seguir para criar essas variáveis. Substitua os valores padrão por RESOURCE_GROUP, LOCATION, SERVICE_ACCOUNT_NAME, SUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAME e FEDERATED_IDENTITY_CREDENTIAL_NAME.

export RESOURCE_GROUP="myResourceGroup"
export LOCATION="westcentralus"
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"

Criar cluster AKS

Crie um cluster do AKS usando o comando az aks create com o parâmetro --enable-oidc-issuer para usar o Emissor de OIDC. O exemplo a seguir cria um cluster nomeado myAKSCluster com um nó no myResourceGroup:

az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

Após alguns minutos, o comando será concluído e retornará informações no formato JSON sobre o cluster.

Observação

Quando você cria um cluster do AKS, um segundo grupo de recursos é criado automaticamente para armazenar os recursos do AKS. Para obter mais informações, confira Por que dois grupos de recursos são criados com o AKS?.

Atualizar um cluster de AKS existente

Você pode atualizar um cluster do AKS usando o comando az aks update com os parâmetros --enable-oidc-issuer e --enable-workload-identity para usar o emissor do OIDC e habilitar a identidade da carga de trabalho. O seguinte exemplo atualiza um cluster chamado myAKSCluster:

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

Recuperar a URL do emissor de OIDC

Para obter a URL do Emissor OIDC e salvá-la em uma variável de ambiente, execute o comando a seguir. Substitua o valor padrão para os argumentos -n, que é o nome do cluster:

export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"

A variável deve conter a URL do Emissor semelhante ao exemplo a seguir:

https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/

Por padrão, o Emissor está definido para usar a URL de base https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}, em que o valor de {region} corresponde ao local em que o cluster do AKS está implantado. O valor {uuid} representa a chave OIDC.

Criar uma identidade gerenciada

Use o comando az account set da CLI do Azure para definir uma assinatura específica como a assinatura ativa atual. Em seguida, use o comando az identity create para criar uma identidade gerenciada.

az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"

Em seguida, vamos criar uma variável para a ID de identidade gerenciada.

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"

Criar uma conta de serviço do Kubernetes

Crie uma conta de serviço do Kubernetes e anote-a com a ID do cliente da identidade gerenciada criada na etapa anterior. Use o comando az aks get-credentials e substitua os valores pelo nome do cluster e o nome do grupo de recursos.

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

Copie e cole a entrada de várias linhas a seguir na CLI do Azure.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}"
  name: "${SERVICE_ACCOUNT_NAME}"
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
EOF

A seguinte saída é semelhante à criação bem-sucedida da identidade:

serviceaccount/workload-identity-sa created

Estabelecer uma credencial de identidade federada

Use o comando az identity federated-credential create para criar a credencial de identidade federada entre a identidade gerenciada, o emissor da conta de serviço e o assunto.

az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --issuer "${AKS_OIDC_ISSUER}" --subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" --audience api://AzureADTokenExchange

Observação

Leva alguns segundos para que a credencial de identidade federada seja propagada após ser inicialmente adicionada. Se uma solicitação de token for feita imediatamente após a adição da credencial de identidade federada, isso poderá levar a uma falha por alguns minutos enquanto o cache for preenchido no diretório com os dados antigos. Para evitar esse problema, você pode adicionar um pequeno atraso depois de adicionar a credencial de identidade federada.

Implantar seu aplicativo

Quando você implanta seus pods de aplicativos, o manifesto deve fazer referência à conta de serviço criada na etapa Criar conta de serviço do Kubernetes. O manifesto a seguir mostra como referenciar à conta, especificamente às propriedades metadata\namespace e spec\serviceAccountName:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

Importante

Verifique se os pods do aplicativo que usam a identidade da carga de trabalho adicionaram o rótulo azure.workload.identity/use: "true" à especificação de pod, caso contrário, ocorrerá uma falha nos pods após a reinicialização deles.

Opcional: Conceder permissões para acessar o Azure Key Vault

Essa etapa será necessária se você precisar acessar segredos, chaves e certificados montados no Azure Key Vault de um pod. Execute as etapas a seguir para configurar o acesso com uma identidade gerenciada. Essas etapas pressupõem que você tenha um Azure Key Vault já criado e configurado em sua assinatura. Se você não tiver um, consulte Criar um Azure Key Vault usando a CLI do Azure.

Antes de prosseguir, você precisa das seguintes informações:

  • Nome do Key Vault
  • Grupo de recursos que mantém o Key Vault

Recupere essas informações usando o comando da CLI do Azure: az keyvault list.

  1. Defina uma política de acesso para que a identidade gerenciada acesse segredos em seu Key Vault executando os seguintes comandos:

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. Crie um segredo no Key Vault:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. Exporte a URL do Key Vault:

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. Implante um pod que faça referência à conta de serviço e à URL do Key Vault acima:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: quick-start
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
      labels:
        azure.workload.identity/use: "true"
    spec:
      serviceAccountName: ${SERVICE_ACCOUNT_NAME}
      containers:
        - image: ghcr.io/azure/azure-workload-identity/msal-go
          name: oidc
          env:
          - name: KEYVAULT_URL
            value: ${KEYVAULT_URL}
          - name: SECRET_NAME
            value: ${KEYVAULT_SECRET_NAME}
      nodeSelector:
        kubernetes.io/os: linux
    EOF
    

Para verificar se todas as propriedades são injetadas corretamente pelo webhook, use o comando kubectl describe:

kubectl describe pod quick-start | grep "SECRET_NAME:"

Se for bem-sucedido, a saída deverá ser semelhante à seguinte:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Para verificar se o POD consegue obter um token e acessar o recurso, utilize o comando kubectl logs:

kubectl logs quick-start

Se for bem-sucedido, a saída deverá ser semelhante à seguinte:

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

Desabilitar a identidade da carga de trabalho

Para desabilitar a ID de Carga de Trabalho do Microsoft Entra no cluster do AKS em que ela foi habilitada e configurada, execute o seguinte comando:

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

Próximas etapas

Neste artigo, você implantou um cluster do Kubernetes e configurou-o para usar uma identidade de carga de trabalho em preparação para cargas de trabalho de aplicativo a serem autenticadas com essa credencial. Agora você está pronto para implantar seu aplicativo e configurá-lo para usar a identidade da carga de trabalho com a versão mais recente da biblioteca de clientes do Azure Identity. Se você não conseguir reescrever seu aplicativo para usar a versão mais recente da biblioteca de clientes, poderá configurar o pod do aplicativo para autenticar usando a identidade gerenciada com identidade de carga de trabalho como uma solução de migração de curto prazo.