Konfigurieren externer Identitätsanbieter mit strukturierter AKS-Authentifizierung (Vorschau)

In diesem Artikel erfahren Sie, wie Sie die externen Identitätsanbieter GitHub und Google Identity für die Steuerebenenauthentifizierung des Azure Kubernetes Service (AKS) mithilfe der strukturierten Authentifizierung konfigurieren. Sie erfahren, wie Sie JSON Web Token (JWT)-Authentifikatoren erstellen, Anspruchsüberprüfung und -zuordnung konfigurieren und den Authentifizierungsfluss testen.

Von Bedeutung

AKS-Vorschaufunktionen sind auf Selbstbedienungsbasis und freiwillig verfügbar. Vorschauversionen werden „im Istzustand“ und „wie verfügbar“ bereitgestellt und sind von den Service Level Agreements und der eingeschränkten Garantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

Voraussetzungen

  • Dieser Artikel erfordert Version 2.77.0 oder höher des Azure CLI. Wenn Sie Azure Cloud Shell verwenden, ist die neueste Version bereits dort installiert. Informationen zum Installieren oder Aktualisieren des Azure CLI auf Ihrem lokalen Computer finden Sie unter Installieren sie den Azure CLI.

  • Sie müssen die erweiterung aks-preview Azure CLI Version 18.0.0b41 oder höher installieren, um strukturierte Authentifizierungsfeatures zu verwenden.

    • Wenn Sie noch nicht über die Erweiterung aks-preview verfügen, installieren Sie sie mit dem Befehl az extension add.

      az extension add --name aks-preview
      
    • Wenn Sie bereits über die Erweiterung aks-preview verfügen, aktualisieren Sie sie über den Befehl az extension update, um sicherzustellen, dass Sie über die neueste Version verfügen.

      az extension update --name aks-preview
      
    • Stellen Sie sicher, dass Sie über die erforderliche Version der aks-preview Erweiterung verfügen, indem Sie den az extension show Befehl verwenden.

      az extension show --name aks-preview --query version
      
  • Ein AKS-Cluster mit Kubernetes Version 1.30 oder höher. Informationen zum Erstellen eines AKS-Clusters finden Sie unter Deploy an Azure Kubernetes Service (AKS) cluster using Azure CLI.

  • kubectl Befehlszeilentool für die Interaktion mit Ihrem Kubernetes-Cluster. kubectl ist bereits installiert, wenn Sie Azure Cloud Shell verwenden. Sie können kubectl lokal installieren, indem Sie den Befehl az aks install-cli verwenden.

    az aks install-cli
    
  • Ein externer Identitätsanbieter, der OpenID Connect (OIDC) unterstützt.

  • Netzwerkkonnektivität von Clusterknoten zu Ihrem Identitätsanbieter.

  • Wenn Sie das kubelogin Plug-In verwenden möchten, installieren Sie es, indem Sie die Anweisungen im Kubelogin-Setuphandbuch befolgen.

Festlegen von Umgebungsvariablen

  • Legen Sie die folgenden Umgebungsvariablen für die Ressourcengruppe und den Clusternamen fest:

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

Registrieren des JWTAuthenticatorPreview Features

  1. Registrieren Sie das JWTAuthenticatorPreview Feature mithilfe des az feature register Befehls.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Überprüfen Sie den Registrierungsstatus des Features mithilfe des az feature show Befehls.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Wenn der Status Registered anzeigt, aktualisieren Sie die Registrierung des Ressourcenanbieters für Microsoft.ContainerService, indem Sie den az provider register-Befehl verwenden.

    az provider register --namespace Microsoft.ContainerService
    

Einrichtung der GitHub Actions OIDC-Authentifizierung

  1. Stellen Sie sicher, dass Ihre GitHub Actions Workflows über die erforderlichen Berechtigungen verfügen.

  2. Konfigurieren Sie die id-token: write Berechtigung in Ihren Workflowdateien. Beispiel:

    permissions:
      id-token: write
      contents: read
    
  3. Richten Sie geeignete Repository- und Organisationseinstellungen für den OIDC-Tokenzugriff ein. Konfigurieren Sie Repository-OIDC-Einstellungen und Organisationssicherheitsrichtlinien für die Tokenverwendung.

Einrichten der Google Identity OAuth 2.0-Authentifizierung

  1. Navigieren Sie zur Google Cloud Console.
  2. Erstellen oder Auswählen eines Projekts.
  3. Erstellen Sie OAuth 2.0-Anmeldeinformationen.
  4. Notieren Sie sich Ihre Client-ID und den geheimen Clientschlüssel für die spätere Verwendung.

Erstellen der JWT-Authentifikatorkonfiguration für GitHub Actions OIDC

  • Erstellen Sie eine Datei jwt-config.json mit der folgenden Konfiguration:

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

Erstellen der JWT-Authentifikatorkonfiguration für Google Identity

  • Erstellen Sie eine Datei jwt-config.json mit der folgenden Konfiguration:

    {
        "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-Authentifikator-Konfigurationselemente

Die JWT-Authentifikatorkonfiguration umfasst die folgenden Schlüsselelemente: issuer, , claimValidationRules, claimMappingsund userValidationRules. Jedes Element dient einem bestimmten Zweck, um zu definieren, wie AKS JWT-Token vom externen Identitätsanbieter überprüft und verarbeitet.

Ausstellerkonfiguration

In der folgenden Tabelle werden die wichtigsten Elemente der issuer Konfiguration beschrieben:

Ausstellerkonfigurationselement Beschreibung
url Die OIDC-Issuer-URL, die mit dem iss Claim in JWTs übereinstimmen muss.
audiences Liste der Zielgruppen, für die JWTs ausgestellt werden müssen (überprüft gegen den Anspruch aud).

Konfiguration von Anspruchsprüfungsregeln

In der folgenden Tabelle werden die wichtigsten Elemente der claimValidationRules Konfiguration beschrieben:

Anspruchsüberprüfungsregelelement Beschreibung
expression CEL-Ausdruck, der die Überprüfungslogik definiert, die auf JWT-Ansprüche angewendet werden soll. Der Ausdruck muss als "true" ausgewertet werden, damit das Token akzeptiert wird.
message Fehlermeldung, die zurückgegeben wird, wenn die Gültigkeitsprüfungsregel fehlschlägt.

Konfiguration von Anspruchszuordnungen

In der folgenden Tabelle werden die wichtigsten Elemente der claimMappings Konfiguration beschrieben:

Element für die Zuordnung von Ansprüchen Beschreibung
username CEL-Ausdruck, der definiert, wie der Kubernetes-Benutzername aus JWT-Ansprüchen erstellt wird. Muss das aks:jwt: Präfix enthalten, um Konflikte mit anderen Authentifizierungsmethoden zu verhindern.
groups CEL-Ausdruck, der definiert, wie Kubernetes-Gruppenmitgliedschaften aus JWT-Ansprüchen erstellt werden. Muss das aks:jwt: Präfix enthalten, um Konflikte mit anderen Authentifizierungsmethoden zu verhindern.
uid Optionaler CEL-Ausdruck, der einen eindeutigen Bezeichner für den Benutzer definiert.
extra Optionale Zuordnung zusätzlicher Benutzerattribute, die durch CEL-Ausdrücke definiert sind.

Konfiguration von Benutzerüberprüfungsregeln

In der folgenden Tabelle werden die wichtigsten Elemente der userValidationRules Konfiguration beschrieben:

Benutzerüberprüfungsregelelement Beschreibung
expression CEL-Ausdruck, der zusätzliche Überprüfungslogik definiert, die auf die endgültig zugeordneten Benutzerinformationen angewendet werden soll. Der Ausdruck muss als "true" ausgewertet werden, damit der Benutzer akzeptiert wird.
message Fehlermeldung, die zurückgegeben wird, wenn die Benutzerüberprüfungsregel fehlschlägt.

Erstellen des JWT-Authentifikators

  • Fügen Sie den JWT-Authentifikator mithilfe des az aks jwtauthenticator add Befehls zu Ihrem AKS-Cluster hinzu.

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

Verwalten von JWT-Authentifikatoren

Auflisten aller JWT-Authentifikatoren

  • Auflisten aller JWT-Authentifikatoren auf Ihrem Cluster mithilfe des az aks jwtauthenticator list Befehls.

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

Abrufen von Details zu einem bestimmten JWT-Authentifikator

  • Rufen Sie Details zu einem bestimmten JWT-Authentifikator mithilfe des az aks jwtauthenticator show Befehls ab.

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

Einrichten von GitHub Actions OIDC für die Authentifizierung

  1. Erstellen Sie Umgebungsvariablen, und legen Sie die folgenden erforderlichen Repositoryschlüssel in Ihrem GitHub Repository fest:

    • AKS_SERVER_URL: Die API-Server-URL Ihres AKS-Clusters.
    • AKS_CA_DATA: Base64-codierte Zertifizierungsstellendaten für Ihren AKS-Cluster.
  2. Erstellen Sie einen Workflow, der ein OIDC-Token abruft, und verwendet ihn zum Authentifizieren mit Ihrem AKS-Cluster. Der folgende Beispiel-Workflow holt alle Pods, die auf dem Cluster ausgeführt werden:

    Hinweis

    Der Benutzergruppenwert my-api sollte mit der in Ihrer JWT-Authentifikatorkonfiguration konfigurierten Zielgruppe übereinstimmen.

    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
    

Abrufen von Clusterinformationen für die JWT-Authentifikatorkonfiguration

  1. Rufen Sie die API-Server-URL für Ihren Cluster mithilfe des az aks show Befehls ab.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Rufen Sie die base64-codierten Zertifizierungsstellendaten für Ihren Cluster mithilfe des az aks get-credentials Befehls ab.

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

Einrichten von Google Identity OAuth 2.0 für die Authentifizierung

Sie können die Google Identity-Authentifizierung entweder über das kubelogin Plug-In oder über ein statisches Token einrichten.

  • Fügen Sie ihrer Kubeconfig-Datei einen neuen Benutzerkontext hinzu. Beispiel:

    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
    

Testen der Authentifizierung

  1. Triggern Sie den Workflow entweder durch Pushen auf den Main Branch oder manuelles Triggern über die Registerkarte Aktionen in Ihrem Repository.

  2. Überwachen Sie die Workflowausführung auf der Registerkarte "Aktionen", um zu überprüfen, ob die Authentifizierung funktioniert.

    Erwartete Ausgabe für die Erstkonfiguration vor der Konfiguration der rollenbasierten Zugriffssteuerung (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
    

    Dieser Fehler zeigt eine erfolgreiche Authentifizierung an, aber keine Autorisierung.

  • Testen Sie die Authentifizierung mithilfe des kubectl get nodes Befehls mit der --user Kennzeichnung, um den Benutzerkontext anzugeben, den Sie für die Google Identity-Authentifizierung erstellt haben. Beispiel:

    kubectl get nodes --user external-user
    

    Erwartete Ausgabe für die Erstkonfiguration vor der Konfiguration der rollenbasierten Zugriffssteuerung (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
    

    Dieser Fehler zeigt eine erfolgreiche Authentifizierung an, aber keine Autorisierung.

Konfiguration der Kubernetes-rollenbasierten Zugriffskontrolle (RBAC)

Erstellen Sie geeignete RBAC-Bindungen für Ihre externen Benutzer, und verwenden Sie die Clusteradministratoranmeldeinformationen, um diese Konfigurationen anzuwenden.

  1. Erstellen Sie eine Datei namens rbac-config.yaml zum Konfigurieren von RBAC-Bindungen für externe Benutzer. Beispiel:

    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. Wenden Sie die RBAC-Konfiguration mithilfe des kubectl apply Befehls an:

    kubectl apply -f rbac-config.yaml
    
  1. Erstellen Sie eine Datei namens rbac-config.yaml zum Konfigurieren von RBAC-Bindungen für externe Benutzer. Beispiel:

    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. Wenden Sie die RBAC-Konfiguration mithilfe des kubectl apply Befehls an:

    kubectl apply -f rbac-config.yaml
    

Überprüfen des Zugriffs mit RBAC

  • Überprüfen Sie, ob der externe Benutzer jetzt auf Ressourcen gemäß den RBAC-Berechtigungen zugreifen kann, die Sie mit den kubectl get nodes Und-Befehlen kubectl get pods mit der --user Kennzeichnung konfiguriert haben. Beispiel:

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

Entfernen des JWT-Authentifikators

  • Wenn Sie den JWT-Authentifikator nicht mehr benötigen, entfernen Sie ihn mithilfe des az aks jwtauthenticator delete Befehls aus Ihrem AKS-Cluster.

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