Externe id-providers configureren met gestructureerde AKS-verificatie (preview)

In dit artikel wordt beschreven hoe u externe id-providers voor GitHub en Google Identity configureert voor Azure Kubernetes Service (AKS) verificatie van het besturingsvlak met behulp van gestructureerde verificatie. Je leert hoe je JSON Web Token (JWT) authenticators maakt, claimvalidatie en toewijzing configureert, en de authenticatiestroom test.

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals het is' en 'voor zover beschikbaar' en zijn uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning naar best vermogen. Zodoende zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

Vereiste voorwaarden

  • Voor dit artikel is versie 2.77.0 of hoger van de Azure CLI vereist. Als u Azure Cloud Shell gebruikt, is de nieuwste versie daar al geïnstalleerd. Zie De Azure CLI0 installeren als u de Azure CLI op uw lokale computer wilt installeren of bijwerken.

  • U moet de extensie aks-preview Azure CLI-extensie 18.0.0b41 of hoger installeren om gestructureerde verificatiefuncties te kunnen gebruiken.

    • Als u de aks-preview extensie nog niet hebt, installeert u deze met behulp van de az extension add opdracht.

      az extension add --name aks-preview
      
    • Als u de aks-preview extensie al hebt, werkt u deze bij om ervoor te zorgen dat u de nieuwste versie hebt met behulp van de az extension update opdracht.

      az extension update --name aks-preview
      
    • Controleer of u de vereiste versie van de aks-preview extensie hebt met behulp van de az extension show opdracht.

      az extension show --name aks-preview --query version
      
  • Een AKS-cluster met Kubernetes versie 1.30 of hoger. Zie Deploy an Azure Kubernetes Service (AKS) cluster using Azure CLI als u een AKS-cluster wilt maken.

  • kubectl opdrachtregelprogramma voor interactie met uw Kubernetes-cluster. kubectl is al geïnstalleerd als u Azure Cloud Shell gebruikt. U kunt lokaal installeren kubectl met behulp van de az aks install-cli opdracht.

    az aks install-cli
    
  • Een externe id-provider die OpenID Connect (OIDC) ondersteunt.

  • Netwerkconnectiviteit van clusterknooppunten naar uw id-provider.

  • Als u van plan bent om de invoegtoepassing te gebruiken, installeert u deze kubelogin door de instructies in de installatiehandleiding voor kubelogin te volgen.

Omgevingsvariabelen instellen

  • Stel de volgende omgevingsvariabelen in voor uw resourcegroep en clusternaam:

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

JWTAuthenticatorPreview De functie registreren

  1. Registreer de JWTAuthenticatorPreview functie met behulp van de az feature register opdracht.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Controleer de registratiestatus van de functie met behulp van de az feature show opdracht.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Wanneer de status Registered wordt weergegeven, registreert u de resourceprovider opnieuw voor Microsoft.ContainerService met behulp van de az provider register opdracht.

    az provider register --namespace Microsoft.ContainerService
    

GitHub Actions OIDC-authenticatie instellen

  1. Zorg ervoor dat uw GitHub Actions werkstromen over de benodigde machtigingen beschikken.

  2. Configureer de id-token: write machtiging in uw workflow-bestanden. Voorbeeld:

    permissions:
      id-token: write
      contents: read
    
  3. Stel de juiste opslagplaats- en organisatie-instellingen in voor OIDC-tokentoegang. Configureer de OIDC-instellingen van de opslagplaats en het beveiligingsbeleid van de organisatie voor tokengebruik.

Google Identity OAuth 2.0-verificatie instellen

  1. Navigeer naar de Google Cloud Console.
  2. Een project maken of selecteren.
  3. OAuth 2.0-referenties maken.
  4. Noteer uw client-id en clientgeheim voor later gebruik.

JWT Authenticator-configuratie maken voor GitHub Actions OIDC

  • Maak een bestand met de naam jwt-config.json met de volgende configuratie:

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

JWT Authenticator-configuratie maken voor Google Identity

  • Maak een bestand met de naam jwt-config.json met de volgende configuratie:

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

JWT Authenticator-configuratie-elementen

De JWT Authenticator-configuratie bevat de volgende belangrijke elementen: issuer, claimValidationRules, claimMappingsen userValidationRules. Elk element dient een specifiek doel bij het definiëren van hoe AKS JWT-tokens van de externe id-provider valideert en verwerkt.

Configuratie van uitgever

In de volgende tabel worden de belangrijkste elementen van de issuer configuratie beschreven:

Verlenerconfiguratie-element Beschrijving
url De URL van de OIDC-uitgever, die moet overeenkomen met de iss claim in JWTs.
audiences Lijst met doelgroepen waarvoor JWT's moeten worden uitgegeven (gecontroleerd op aud claim).

Configuratie van claimvalidatieregels

In de volgende tabel worden de belangrijkste elementen van de claimValidationRules configuratie beschreven:

Element van de claimvalidatieregel Beschrijving
expression CEL-expressie die de validatielogica definieert die moet worden toegepast op JWT-claims. De expressie moet resulteren in true zodat het token geaccepteerd wordt.
message Foutbericht geretourneerd wanneer de validatieregel mislukt.

Configuratie van claimtoewijzingen

In de volgende tabel worden de belangrijkste elementen van de claimMappings configuratie beschreven:

Het element Claimtoewijzingen Beschrijving
username CEL-expressie waarmee wordt gedefinieerd hoe u de Kubernetes-gebruikersnaam maakt op basis van JWT-claims. Moet het aks:jwt: voorvoegsel bevatten om conflicten met andere verificatiemethoden te voorkomen.
groups CEL-expressie waarmee wordt gedefinieerd hoe kubernetes-groepslidmaatschappen worden samengesteld op basis van JWT-claims. Moet het aks:jwt: voorvoegsel bevatten om conflicten met andere verificatiemethoden te voorkomen.
uid Optionele CEL-expressie waarmee een unieke id voor de gebruiker wordt gedefinieerd.
extra Optionele map van aanvullende gebruikerskenmerken, gedefinieerd met CEL-expressies.

Configuratie van gebruikersvalidatieregels

In de volgende tabel worden de belangrijkste elementen van de userValidationRules configuratie beschreven:

Element van gebruikersvalidatieregel Beschrijving
expression CEL-expressie die aanvullende validatielogica definieert die moet worden toegepast op de uiteindelijke toegewezen gebruikersgegevens. De expressie moet kloppen opdat de gebruiker wordt geaccepteerd.
message Foutbericht geretourneerd wanneer de gebruikersvalidatieregel mislukt.

De JWT-verificator maken

  • Voeg de JWT-verificator toe aan uw AKS-cluster met behulp van de az aks jwtauthenticator add opdracht.

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

JWT-authenticators beheren

Alle JWT-authenticatoren weergeven

  • Vermeld alle JWT-verificators in uw cluster met behulp van de az aks jwtauthenticator list opdracht.

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

Details ophalen voor een specifieke JWT-verificator

  • Details ophalen voor een specifieke JWT-verificator met behulp van de az aks jwtauthenticator show opdracht.

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

GitHub Actions OIDC instellen voor verificatie

  1. Maak omgevingsvariabelen voor en stel de volgende vereiste opslagplaatsgeheimen in uw GitHub-opslagplaats in:

    • AKS_SERVER_URL: de API-server-URL van uw AKS-cluster.
    • AKS_CA_DATA: Base64-gecodeerde certificeringsinstantiegegevens voor uw AKS-cluster.
  2. Maak een werkstroom die een OIDC-token verkrijgt en deze gebruikt om te verifiëren bij uw AKS-cluster. Met de volgende voorbeeldwerkstroom worden alle pods op het cluster uitgevoerd:

    Opmerking

    De doelgroepwaarde my-api moet overeenkomen met de doelgroep die is geconfigureerd in de JWT Authenticator-configuratie.

    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
    

Clustergegevens ophalen voor JWT Authenticator-configuratie

  1. Haal de URL van de API-server voor uw cluster op met behulp van de az aks show opdracht.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Haal de base64-gecodeerde certificeringsinstantiegegevens voor uw cluster op met behulp van de az aks get-credentials opdracht.

    # 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}'
    

Google Identity OAuth 2.0 instellen voor verificatie

U kunt Google Identity Authentication instellen met behulp van de kubelogin invoegtoepassing of rechtstreeks met behulp van een statisch token.

  • Voeg een nieuwe gebruikerscontext toe aan uw kubeconfig-bestand. Voorbeeld:

    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
    

Authenticatie testen

  1. Activeer de werkstroom door naar de hoofdbranch te pushen of handmatig te activeren vanaf het tabblad Acties in je repository.

  2. Controleer de uitvoering van de werkstroom op het tabblad Acties om te controleren of de verificatie werkt.

    Verwachte uitvoer voor de eerste installatie vóór Role-Based Access Control (RBAC)-configuratie:

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

    Deze fout geeft aan dat de verificatie is geslaagd, maar dat er geen autorisatie is.

  • Test de verificatie met behulp van de kubectl get nodes opdracht met de --user vlag om de gebruikerscontext op te geven die u hebt gemaakt voor Google Identity-verificatie. Voorbeeld:

    kubectl get nodes --user external-user
    

    Verwachte uitvoer voor de eerste installatie vóór Role-Based Access Control (RBAC)-configuratie:

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

    Deze fout geeft aan dat de verificatie is geslaagd, maar dat er geen autorisatie is.

Kubernetes-Role-Based Access Control (RBAC) configureren

Maak de juiste RBAC-bindingen voor uw externe gebruikers en gebruik de referenties van de clusterbeheerder om deze configuraties toe te passen.

  1. Maak een bestand met de naam rbac-config.yaml RBAC-bindingen voor externe gebruikers te configureren. Voorbeeld:

    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. Pas de RBAC-configuratie toe met behulp van de kubectl apply opdracht:

    kubectl apply -f rbac-config.yaml
    
  1. Maak een bestand met de naam rbac-config.yaml RBAC-bindingen voor externe gebruikers te configureren. Voorbeeld:

    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. Pas de RBAC-configuratie toe met behulp van de kubectl apply opdracht:

    kubectl apply -f rbac-config.yaml
    

Toegang verifiëren met RBAC

  • Controleer of de externe gebruiker nu toegang heeft tot resources volgens de RBAC-machtigingen die u hebt geconfigureerd met behulp van de kubectl get nodes en kubectl get pods opdrachten met de --user vlag. Voorbeeld:

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

JWT-verificator verwijderen

  • Wanneer u de JWT-verificator niet meer nodig hebt, verwijdert u deze uit uw AKS-cluster met behulp van de az aks jwtauthenticator delete opdracht.

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