Configurare provider di identità esterni con l'autenticazione strutturata di AKS (anteprima)

Questo articolo illustra come configurare i provider di identità esterni di GitHub e Google Identity per l'autenticazione del piano di controllo Azure Kubernetes Service (AKS) tramite l'autenticazione strutturata. Si apprenderà come creare autenticatori JWT (JSON Web Token), configurare la convalida e il mapping delle attestazioni e testare il flusso di autenticazione.

Importante

Le funzionalità di anteprima di AKS sono disponibili su base self-service, su scelta. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

Prerequisiti

  • Leggere la panoramica concettuale per l'autenticazione al servizio Azure Kubernetes con il provider di identità esterno.
  • Questo articolo richiede la versione 2.77.0 o successiva del Azure CLI. Se si usa Azure Cloud Shell, la versione più recente è già installata. Per installare o aggiornare il Azure CLI nel computer locale, vedere Installare il Azure CLI.

  • È necessario installare l'estensione aks-preview Azure CLI versione 18.0.0b41 o successiva per usare le funzionalità di autenticazione strutturata.

    • Se l'estensione aks-preview non è già disponibile installarla con il comando az extension add.

      az extension add --name aks-preview
      
    • Se l'estensione aks-preview è disponibile, aggiornarla per assicurarsi di disporre della versione più recente con il comando az extension update command.

      az extension update --name aks-preview
      
    • Verificare di avere la versione necessaria dell'estensione aks-preview usando il az extension show comando .

      az extension show --name aks-preview --query version
      
  • Un cluster AKS che esegue Kubernetes versione 1.30 o successiva. Per creare un cluster del servizio Azure Kubernetes, vedere Distribuire un cluster Azure Kubernetes Service (AKS) usando Azure CLI.

  • kubectl strumento da riga di comando per interagire con il cluster Kubernetes. kubectl è già installato se si usa Azure Cloud Shell. È possibile eseguire l'installazione kubectl in locale usando il az aks install-cli comando .

    az aks install-cli
    
  • Provider di identità esterno che supporta OpenID Connect (OIDC).

  • Connettività di rete dai nodi del cluster al provider di identità.

  • Se si prevede di usare il kubelogin plug-in, installarlo seguendo le istruzioni nella guida alla configurazione di kubelogin.

Impostare le variabili di ambiente

  • Impostare le variabili di ambiente seguenti per il gruppo di risorse e il nome del cluster:

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

Registrare la JWTAuthenticatorPreview funzionalità

  1. Registrare la JWTAuthenticatorPreview funzionalità usando il az feature register comando .

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Controllare lo stato di registrazione della funzionalità usando il az feature show comando .

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Quando lo stato mostra Registered, aggiorna la registrazione del provider di risorse per Microsoft.ContainerService utilizzando il comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Configurare l'autenticazione OIDC di GitHub-Actions

  1. Assicurarsi che i flussi di lavoro GitHub Actions dispongano delle autorizzazioni necessarie.

  2. Configurare l'autorizzazione id-token: write nei file del flusso di lavoro. Per esempio:

    permissions:
      id-token: write
      contents: read
    
  3. Configurare le impostazioni appropriate del repository e dell'organizzazione per l'accesso al token OIDC. Configurare le impostazioni OIDC del repository e i criteri di sicurezza dell'organizzazione per l'utilizzo dei token.

Configurare l'autenticazione OAuth 2.0 di Google Identity

  1. Accedere al Google Cloud Console.
  2. Creare o selezionare un progetto.
  3. Creare credenziali OAuth 2.0.
  4. Prendere nota dell'ID client e del segreto client per un uso successivo.

Creare la configurazione dell'autenticatore JWT per GitHub Actions OIDC

  • Creare un file denominato jwt-config.json con la configurazione seguente:

    {
      "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'"
          }
      ]
    }
    

Creare la configurazione dell'autenticatore JWT per Google Identity

  • Creare un file denominato jwt-config.json con la configurazione seguente:

    {
        "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'"
            }
        ]
    }
    

Elementi di configurazione dell'autenticatore JWT

La configurazione dell'autenticatore JWT include gli elementi chiave seguenti: issuer, claimValidationRules, claimMappingse userValidationRules. Ogni elemento ha uno scopo specifico nel definire come AKS convalida ed elabora i token JWT dal provider di identità esterno.

Configurazione dell'emittente

Nella tabella seguente vengono descritti gli elementi chiave della issuer configurazione:

Elemento di configurazione dell'emittente Descrizione
url URL dell'emittente OIDC che deve corrispondere alla dichiarazione iss in JWT.
audiences Elenco di destinatari per cui devono essere rilasciati i JWT (verificati secondo il claim aud).

Configurazione delle regole di convalida delle attestazioni

Nella tabella seguente vengono descritti gli elementi chiave della claimValidationRules configurazione:

Elemento di regola di convalida delle attestazioni Descrizione
expression Espressione CEL che definisce la logica di convalida da applicare alle attestazioni JWT. L'espressione deve restituire true affinché il token venga accettato.
message Messaggio di errore restituito quando la regola di convalida ha esito negativo.

Configurazione dei mapping di attestazioni

Nella tabella seguente vengono descritti gli elementi chiave della claimMappings configurazione:

Elemento di mapping di attestazioni Descrizione
username Espressione CEL che definisce come costruire il nome utente Kubernetes dalle attestazioni JWT. Deve includere il aks:jwt: prefisso per evitare conflitti con altri metodi di autenticazione.
groups Espressione CEL che definisce come costruire le appartenenze ai gruppi Kubernetes dalle attestazioni JWT. Deve includere il aks:jwt: prefisso per evitare conflitti con altri metodi di autenticazione.
uid Espressione CEL facoltativa che definisce un identificatore univoco per l'utente.
extra Mappa facoltativa di attributi utente aggiuntivi definiti dalle espressioni CEL.

Configurazione delle regole di convalida utente

Nella tabella seguente vengono descritti gli elementi chiave della userValidationRules configurazione:

Elemento della regola di convalida utente Descrizione
expression Espressione CEL che definisce una logica di convalida aggiuntiva da applicare alle informazioni utente mappate finali. L'espressione deve restituire true affinché l'utente venga accettato.
message Messaggio di errore restituito quando la regola di convalida dell'utente ha esito negativo.

Creare l'autenticatore JWT

  • Aggiungi l'autenticatore JWT al cluster AKS usando il comando az aks jwtauthenticator add.

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

Gestire gli autenticatori JWT

Elencare tutti gli autenticatori JWT

  • Elencare tutti gli autenticatori JWT nel cluster usando il az aks jwtauthenticator list comando .

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

Ottenere i dettagli per un autenticatore JWT specifico

  • Ottenere i dettagli per un autenticatore JWT specifico usando il az aks jwtauthenticator show comando .

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

Configurare GitHub Actions OIDC per l'autenticazione

  1. Creare variabili di ambiente e impostare i segreti necessari del repository seguenti nel repository GitHub:

    • AKS_SERVER_URL: URL del server API del cluster AKS.
    • AKS_CA_DATA: dati dell'autorità di certificazione con codifica Base64 per il cluster AKS.
  2. Creare un flusso di lavoro che ottiene un token OIDC e lo usa per l'autenticazione con il cluster AKS. Il flusso di lavoro di esempio seguente recupera tutti i pod in esecuzione nel cluster.

    Annotazioni

    Il valore my-api del gruppo di destinatari deve corrispondere al gruppo di destinatari configurato nella configurazione dell'autenticatore 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
    

Ottenere informazioni sul cluster per la configurazione dell'autenticatore JWT

  1. Ottenere l'URL del server API per il cluster usando il az aks show comando .

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Ottenere i dati dell'autorità di certificazione con codifica Base64 per il cluster usando il 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}'
    

Configurare Google Identity OAuth 2.0 per l'autenticazione

È possibile configurare l'autenticazione di Google Identity usando il kubelogin plug-in o direttamente usando un token statico.

  • Aggiungere un nuovo contesto utente al file kubeconfig. Per esempio:

    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
    

Verifica autenticazione

  1. Attivare il flusso di lavoro eseguendo il push nel ramo principale o attivandolo manualmente dalla scheda Azioni nel repository.

  2. Monitorare l'esecuzione del flusso di lavoro nella scheda Azioni per verificare che l'autenticazione funzioni.

    Output previsto per la prima installazione prima della configurazione 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
    

    Questo errore indica l'autenticazione riuscita ma la mancanza di autorizzazione.

  • Testare l'autenticazione usando il comando kubectl get nodes con il flag --user per specificare il contesto dell'utente che hai creato per l'autenticazione di Google Identity. Per esempio:

    kubectl get nodes --user external-user
    

    Output previsto per la prima installazione prima della configurazione 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
    

    Questo errore indica l'autenticazione riuscita ma la mancanza di autorizzazione.

Configurare Kubernetes Role-Based Access Control (RBAC)

Impostare binding RBAC appropriati per gli utenti esterni e usare le credenziali di amministratore del cluster per applicare queste configurazioni.

  1. Creare un file denominato rbac-config.yaml per configurare le associazioni RBAC per gli utenti esterni. Per esempio:

    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. Applicare la configurazione RBAC utilizzando il comando kubectl apply.

    kubectl apply -f rbac-config.yaml
    
  1. Creare un file denominato rbac-config.yaml per configurare le associazioni RBAC per gli utenti esterni. Per esempio:

    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. Applicare la configurazione RBAC utilizzando il comando kubectl apply.

    kubectl apply -f rbac-config.yaml
    

Verificare l'accesso con RBAC

  • Verificare che l'utente esterno possa ora accedere alle risorse in base alle autorizzazioni basate sul ruolo (RBAC) che hai configurato usando i comandi kubectl get nodes e kubectl get pods, con il flag --user. Per esempio:

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

Rimuovere l'autenticatore JWT

  • Usare il comando az aks jwtauthenticator delete per rimuovere l'autenticatore JWT dal cluster AKS quando non è più necessario.

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