Configurar provedores de identidade externos com autenticação estruturada do AKS (versão prévia)

Este artigo mostra como configurar provedores de identidade externos, como GitHub e Google Identity, para a autenticação do plano de controle do Azure Kubernetes Service (AKS) usando autenticação estruturada. Você aprenderá a criar autenticadores JWT (Token Web JSON), configurar a validação e o mapeamento de declarações e testar o fluxo de autenticação.

Importante

As funcionalidades em versão preliminar do AKS estão disponíveis de forma optativa e por autoatendimento. As versões prévias são fornecidas “no estado em que se encontram” e “conforme disponíveis” e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Pré-requisitos

  • Este artigo requer a versão 2.77.0 ou posterior do Azure CLI. Se você estiver usando Azure Cloud Shell, a versão mais recente já está instalada lá. Para instalar ou atualizar o Azure CLI em seu computador local, consulte Instale o Azure CLI.

  • Você precisa instalar a extensão aks-preview Azure CLI versão 18.0.0b41 ou posterior para usar recursos de autenticação estruturados.

    • Se você ainda não tem a extensão aks-preview, instale-a usando o comando az extension add.

      az extension add --name aks-preview
      
    • Se você já tem a extensão aks-preview, atualize-a para garantir que você tenha a última versão usando o comando az extension update.

      az extension update --name aks-preview
      
    • Verifique se você tem a versão necessária da aks-preview extensão usando o az extension show comando.

      az extension show --name aks-preview --query version
      
  • Um cluster do AKS executando o Kubernetes versão 1.30 ou posterior. Para criar um cluster do AKS, consulte Deploy um cluster Azure Kubernetes Service (AKS) usando Azure CLI.

  • kubectl ferramenta de linha de comando para interagir com o cluster do Kubernetes. kubectl já está instalado se você usar Azure Cloud Shell. Você pode instalar kubectl localmente usando o az aks install-cli comando.

    az aks install-cli
    
  • Um provedor de identidade externo que dá suporte ao OIDC (OpenID Connect).

  • Conectividade de rede dos nós do cluster para o seu provedor de identidade.

  • Se você planeja usar o kubelogin plug-in, instale-o seguindo as instruções no guia de instalação do kubelogin.

Definir variáveis de ambiente

  • Defina as seguintes variáveis de ambiente para o grupo de recursos e o nome do cluster:

    export RESOURCE_GROUP="<your-resource-group-name>"
    export CLUSTER_NAME="<your-cluster-name>"
    

Registrar o JWTAuthenticatorPreview recurso

  1. Registre o JWTAuthenticatorPreview recurso usando o az feature register comando.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Verifique o status de registro do recurso usando o az feature show comando.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Quando o status mostra Registered, atualize o registro do provedor de recursos para Microsoft.ContainerService usando o comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Configurar autenticação OIDC do GitHub Actions

  1. Verifique se os fluxos de trabalho GitHub Actions têm as permissões necessárias.

  2. Configure a permissão de id-token: write nos seus arquivos de workflow. Por exemplo:

    permissions:
      id-token: write
      contents: read
    
  3. Configure as configurações apropriadas do repositório e da organização para acesso ao token OIDC. Defina as configurações do OIDC do repositório e as políticas de segurança da organização para uso de token.

Configurar a autenticação do Google Identity OAuth 2.0

  1. Navegue até o Console do Google Cloud.
  2. Crie ou selecione um projeto.
  3. Crie credenciais do OAuth 2.0.
  4. Observe a ID do cliente e o segredo do cliente para uso posterior.

Criar configuração do autenticador JWT para GitHub Actions OIDC

  • Crie um arquivo nomeado jwt-config.json com a seguinte configuração:

    {
      "issuer": {
          "url": "https://token.actions.githubusercontent.com",
          "audiences": [
              "my-api"
          ]
      },
      "claimValidationRules": [
          {
              "expression": "has(claims.sub)",
              "message": "must have sub claim"
          }
      ],
      "claimMappings": {
          "username": {
              "expression": "'aks:jwt:github:' + claims.sub"
          }
      },
      "userValidationRules": [
          {
              "expression": "has(user.username)",
              "message": "must have username"
          },
          {
              "expression": "!user.username.startsWith('aks:jwt:github:system')",
              "message": "username must not start with 'aks:jwt:github:system'"
          }
      ]
    }
    

Criar configuração do autenticador JWT para o Google Identity

  • Crie um arquivo nomeado jwt-config.json com a seguinte configuração:

    {
        "issuer": {
            "url": "https://accounts.google.com",
            "audiences": [
                "your-client-id.apps.googleusercontent.com"
            ]
        },
        "claimValidationRules": [
            {
                "expression": "has(claims.sub)",
                "message": "must have sub claim"
            }
        ],
        "claimMappings": {
            "username": {
                "expression": "'aks:jwt:google:' + claims.sub"
            },
            "groups": {
                "expression": "has(claims.groups) ? claims.groups.split(',').map(g, 'aks:jwt:' + g) : []"
            }
        },
        "userValidationRules": [
            {
                "expression": "has(user.username)",
                "message": "must have username"
            },
            {
                "expression": "!user.username.startsWith('aks:jwt:google:system')",
                "message": "username must not start with 'aks:jwt:google:system'"
            }
        ]
    }
    

Elementos de configuração do autenticador JWT

A configuração do autenticador JWT inclui os seguintes elementos principais: issuer, claimValidationRules, e claimMappingsuserValidationRules. Cada elemento serve a uma finalidade específica na definição de como o AKS valida e processa tokens JWT do provedor de identidade externo.

Configuração do emissor

A tabela a seguir descreve os principais elementos da issuer configuração:

Elemento de configuração do emissor Descrição
url O URL do emissor OIDC que deve corresponder à declaração iss nos JWTs.
audiences Lista de públicos-alvo para os quais os JWTs devem ser emitidos (verificados em relação à declaração de aud).

Configuração de regras de validação de reclamação

A tabela a seguir descreve os principais elementos da claimValidationRules configuração:

Elemento da regra de validação de declaração Descrição
expression Expressão CEL que define a lógica de validação a ser aplicada a declarações JWT. A expressão deve ser avaliada como true para que o token seja aceito.
message Mensagem de erro retornada quando a regra de validação falha.

Configuração de mapeamentos de reivindicação

A tabela a seguir descreve os principais elementos da claimMappings configuração:

Elemento de mapeamentos de declarações Descrição
username Expressão CEL que define como construir o nome de usuário do Kubernetes a partir de declarações JWT. Deve incluir o aks:jwt: prefixo para evitar conflitos com outros métodos de autenticação.
groups Expressão CEL que define como construir associações de grupo do Kubernetes a partir de declarações JWT. Deve incluir o aks:jwt: prefixo para evitar conflitos com outros métodos de autenticação.
uid Expressão CEL opcional que define um identificador exclusivo para o usuário.
extra Mapa opcional de atributos de usuário adicionais definidos por expressões CEL.

Configuração de regras de validação do usuário

A tabela a seguir descreve os principais elementos da userValidationRules configuração:

Elemento de regra de validação do usuário Descrição
expression Expressão CEL que define lógica de validação adicional a ser aplicada às informações finais do usuário mapeada. A expressão deve ser avaliada como true para que o usuário seja aceito.
message Mensagem de erro retornada quando a regra de validação do usuário falha.

Criar o autenticador JWT

  • Adicione o autenticador JWT ao cluster do AKS usando o az aks jwtauthenticator add comando.

    az aks jwtauthenticator add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth \
        --config-file jwt-config.json
    

Gerenciar autenticadores JWT

Listar todos os autenticadores JWT

  • Liste todos os autenticadores JWT em seu cluster usando o az aks jwtauthenticator list comando.

    az aks jwtauthenticator list \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME
    

Obter detalhes para um autenticador JWT específico

  • Obtenha detalhes de um autenticador JWT específico usando o az aks jwtauthenticator show comando.

    az aks jwtauthenticator show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth
    

Configurar GitHub Actions OIDC para autenticação

  1. Crie variáveis de ambiente para e defina os seguintes segredos de repositório necessários no repositório GitHub:

    • AKS_SERVER_URL: URL do servidor API do cluster AKS.
    • AKS_CA_DATA: dados de autoridade de certificação codificados em Base64 para o cluster do AKS.
  2. Crie um fluxo de trabalho que obtenha um token OIDC e o use para autenticar com o cluster do AKS. O seguinte exemplo de workflow coloca todos os pods em execução no cluster:

    Observação

    O valor my-api de audiência deve corresponder ao público-alvo configurado na configuração do autenticador JWT.

    name: AKS Access with GitHub OIDC
    on:
      workflow_dispatch:
      push:
        branches: [main]
    
    permissions:
      id-token: write
      contents: read
    
    jobs:
      aks-access:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v4
    
          - name: Install kubectl
            uses: azure/setup-kubectl@v3
            with:
              version: 'latest'
    
          - name: Get GitHub OIDC token
            id: get_token
            run: |
              TOKEN=$(curl -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
                "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=my-api" | \
                jq -r '.value')
              echo "::add-mask::$TOKEN"
              echo "oidc_token=$TOKEN" >> $GITHUB_OUTPUT
    
          - name: Create kubeconfig with OIDC token
            run: |
              cat <<EOF > kubeconfig
              apiVersion: v1
              kind: Config
              clusters:
              - cluster:
                  certificate-authority-data: ${{ secrets.AKS_CA_DATA }}
                  server: ${{ secrets.AKS_SERVER_URL }}
                name: aks-cluster
              contexts:
              - context:
                  cluster: aks-cluster
                  user: github-oidc-user
                name: aks-context
              current-context: aks-context
              users:
              - name: github-oidc-user
                user:
                  token: ${{ steps.get_token.outputs.oidc_token }}
              EOF
    
          - name: List all pods in the cluster
            run: |
              export KUBECONFIG=./kubeconfig
              kubectl get pods --all-namespaces
    

Obter informações de cluster para a configuração do autenticador JWT

  1. Obtenha a URL do servidor de API para o cluster usando o az aks show comando.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Obtenha os dados de autoridade de certificação codificados em base64 para o cluster usando o az aks get-credentials comando.

    # Get CA data (base64 encoded)
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --file - --format exec | \
      grep certificate-authority-data | awk '{print $2}'
    

Configurar o Google Identity OAuth 2.0 para autenticação

Você pode configurar a autenticação do Google Identity usando o kubelogin plug-in ou usando diretamente um token estático.

  • Adicione um novo contexto de usuário ao arquivo kubeconfig. Por exemplo:

    users:
    - name: external-user
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1beta1
          command: kubectl
          args:
          - oidc-login
          - get-token
          - --oidc-issuer-url=https://accounts.google.com
          - --oidc-client-id=your-client-id.apps.googleusercontent.com
          - --oidc-client-secret=your-client-secret
    

Testar autenticação

  1. Inicie o workflow realizando um push para a ramificação principal ou acionando manualmente na aba Ações em seu repositório.

  2. Monitore a execução do fluxo de trabalho na guia Ações para verificar se a autenticação está funcionando.

    Resultado esperado para a configuração inicial antes da configuração de Role-Based Access Control (RBAC):

    Error from server (Forbidden): nodes is forbidden: User "aks:jwt:github:your-sub" cannot list resource "nodes" in API group "" at the cluster scope
    

    Esse erro indica autenticação bem-sucedida, mas falta de autorização.

  • Teste a autenticação usando o comando kubectl get nodes com a opção --user para especificar o contexto de usuário que você criou para a autenticação do Google Identity. Por exemplo:

    kubectl get nodes --user external-user
    

    Resultado esperado para a configuração inicial antes da configuração de Role-Based Access Control (RBAC):

    Error from server (Forbidden): nodes is forbidden: User "aks:jwt:google:your-subject" cannot list resource "nodes" in API group "" at the cluster scope
    

    Esse erro indica autenticação bem-sucedida, mas falta de autorização.

Configurar o RBAC (Role-Based Access Control do Kubernetes)

Crie associações RBAC apropriadas para seus usuários externos e use as credenciais de administrador do cluster para aplicar essas configurações.

  1. Crie um arquivo nomeado rbac-config.yaml para configurar associações RBAC para usuários externos. Por exemplo:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: external-user-role
    rules:
    - apiGroups: [""]
      resources: ["pods", "services", "nodes"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments", "replicasets"]
      verbs: ["get", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: external-user-binding
    subjects:
    - kind: User
      # This matches the username expression in claim mappings for GitHub; example of GitHub subject is "repo:<organization-name>/<repository-name>:ref:refs/heads/main"
      name: aks:jwt:github:your-github-sub
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: external-user-role
      apiGroup: rbac.authorization.k8s.io
    
  2. Aplique a configuração do RBAC usando o kubectl apply comando:

    kubectl apply -f rbac-config.yaml
    
  1. Crie um arquivo nomeado rbac-config.yaml para configurar associações RBAC para usuários externos. Por exemplo:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: external-user-role
    rules:
    - apiGroups: [""]
      resources: ["pods", "services", "nodes"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments", "replicasets"]
      verbs: ["get", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: external-user-binding
    subjects:
    - kind: User
      # This matches the username expression in claim mappings for Google
      name: aks:jwt:google:your-subject-claim
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: external-user-role
      apiGroup: rbac.authorization.k8s.io
    
  2. Aplique a configuração do RBAC usando o kubectl apply comando:

    kubectl apply -f rbac-config.yaml
    

Verificar o acesso com RBAC

  • Verifique se o usuário externo agora pode acessar recursos de acordo com as permissões RBAC configuradas usando os comandos kubectl get nodes e kubectl get pods com o sinalizador --user. Por exemplo:

    kubectl get nodes --user external-user
    kubectl get pods --user external-user
    

Remover o autenticador JWT

  • Quando você não precisar mais do autenticador JWT, remova-o do cluster do AKS usando o az aks jwtauthenticator delete comando.

    az aks jwtauthenticator delete \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth