Configurar provedores de identidade externos com autenticação estruturada no AKS (versão preliminar)

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

Importante

Os recursos de pré-visualização do AKS estão disponíveis numa base de autosserviço e adesão voluntária. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões de teste do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Assim sendo, estas funcionalidades não se destinam ao uso em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Pré-requisitos

  • Leia o resumo conceptual para autenticação no AKS com fornecedor de identidade externo.
  • Este artigo requer a versão 2.77.0 ou posterior da Azure CLI. Se estiveres a usar o Azure Cloud Shell, a versão mais recente já está instalada lá. Para instalar ou atualizar o Azure CLI na sua máquina local, consulte Instale o Azure CLI.

  • Precisa de instalar a extensão aks-preview Azure CLI versão 18.0.0b41 ou posterior para usar funcionalidades de autenticação estruturada.

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

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

      az extension update --name aks-preview
      
    • Verifica se tens 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 AKS executando o Kubernetes versão 1.30 ou posterior. Para criar um cluster AKS, veja Deploye um cluster Azure Kubernetes Service (AKS) usando Azure CLI.

  • kubectl ferramenta de linha de comando para interagir com seu cluster Kubernetes. kubectl já está instalado se usares Azure Cloud Shell. Podes instalar kubectl localmente usando o az aks install-cli comando.

    az aks install-cli
    
  • Um provedor de identidade externo que suporta OpenID Connect (OIDC).

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

  • Se planeias usar o kubelogin plugin, instala-o seguindo as instruções do guia de configuraçã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>"
    

Registe a JWTAuthenticatorPreview funcionalidade

  1. Registe a JWTAuthenticatorPreview funcionalidade usando o az feature register comando.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Verifique o estado de registo da funcionalidade usando o az feature show comando.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Quando o estado aparecer Registered, atualize o registo do fornecedor de recursos no Microsoft.ContainerService usando o comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Configurar autenticação OIDC do GitHub Actions

  1. Garante que os teus fluxos de trabalho do GitHub Actions têm as permissões necessárias.

  2. Configurar a permissão id-token: write nos ficheiros de fluxo de trabalho. 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. Configurar definições OIDC do repositório e políticas de segurança da organização para o uso de tokens.

Configurar autenticação Google Identity OAuth 2.0

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

Criar configuração de 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 de 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-chave: issuer, claimValidationRules, claimMappings, e userValidationRules. Cada elemento serve um propósito específico ao definir como o AKS valida e processa tokens JWT do fornecedor externo de identidade.

Configuração do emissor

A tabela seguinte descreve os elementos-chave da issuer configuração:

Elemento de configuração do emissor Descrição
url A URL do emissor do OIDC que deve corresponder à iss reivindicação nos JWTs.
audiences Lista de destinatários para os quais os JWTs devem ser emitidos (verificado contra a declaração aud).

Configuração das regras de validação de reivindicações

A tabela seguinte descreve os elementos-chave da claimValidationRules configuração:

Elemento da regra de validação de reivindicações Descrição
expression Expressão CEL que define a lógica de validação a aplicar às reivindicações JWT. A expressão deve ser avaliada como verdadeira para que o token seja aceite.
message Mensagem de erro devolveda quando a regra de validação falha.

Configuração de mapeamentos de reivindicações

A tabela seguinte descreve os elementos-chave da claimMappings configuração:

Elemento de mapeamento de reivindicações Descrição
username Expressão CEL que define como construir o nome de utilizador Kubernetes a partir das reivindicaçõ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 as pertenças a grupos Kubernetes a partir de reivindicaçõ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 único para o utilizador.
extra Mapa opcional de atributos adicionais do utilizador definidos por expressões CEL.

Configuração das regras de validação do utilizador

A tabela seguinte descreve os elementos-chave da userValidationRules configuração:

Elemento da regra de validação do utilizador Descrição
expression Expressão CEL que define lógica adicional de validação para aplicar à informação final do utilizador mapeada. A expressão deve ser avaliada como verdadeira para que o utilizador seja aceite.
message Mensagem de erro devolveda quando a regra de validação do utilizador falha.

Criar o autenticador JWT

  • Adiciona o autenticador JWT ao teu cluster 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
    

Gerir autenticadores JWT

Liste todos os autenticadores JWT

  • Liste todos os autenticadores JWT no teu cluster usando o az aks jwtauthenticator list comando.

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

Obtenha detalhes de 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 o GitHub Actions OIDC para autenticação

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

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

    Observação

    O valor my-api do público deve corresponder ao público 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
    

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

  1. Obtenha a URL do servidor API do seu 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 certificadora codificados em base64 para o seu 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

Pode configurar a autenticação do Google Identity usando o kubelogin plugin ou usando diretamente um token estático.

  • Adiciona um novo contexto de utilizador ao teu ficheiro 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. Desencadeia o fluxo de trabalho ou enviando para o ramo principal ou ativando-o manualmente a partir do separador Ações no teu repositório.

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

    Saída esperada para a configuração inicial antes da configuração do 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
    

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

  • Teste a autenticação usando o kubectl get nodes comando com a --user flag para especificar o contexto de utilizador que criou para a autenticação do Google Identity. Por exemplo:

    kubectl get nodes --user external-user
    

    Saída esperada para a configuração inicial antes da configuração do 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
    

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

Configurar Kubernetes Role-Based Access Control (RBAC)

Crie ligações RBAC apropriadas para os seus utilizadores externos e use as credenciais do administrador do cluster para aplicar estas configurações.

  1. Crie um ficheiro nomeado rbac-config.yaml para configurar bindings RBAC para utilizadores 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 RBAC usando o kubectl apply comando:

    kubectl apply -f rbac-config.yaml
    
  1. Crie um ficheiro nomeado rbac-config.yaml para configurar bindings RBAC para utilizadores 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 RBAC usando o kubectl apply comando:

    kubectl apply -f rbac-config.yaml
    

Verifique o acesso com RBAC

  • Verifique se o utilizador externo pode agora aceder a recursos de acordo com as permissões RBAC que configurou usando os comandos kubectl get nodes e kubectl get pods com a opção --user. Por exemplo:

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

Remover autenticador JWT

  • Quando já não precisares do autenticador JWT, remove-o do teu cluster AKS usando o az aks jwtauthenticator delete comando.

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