Konfigurera externa identitetsprovidrar med AKS-strukturerad autentisering (förhandsversion)

Den här artikeln visar hur du konfigurerar externa identitetsprovidrar för GitHub och Google Identity för Azure Kubernetes Service (AKS) kontrollplansautentisering med strukturerad autentisering. Du lär dig hur du skapar JSON-webbtokenautentisering (JWT), konfigurerar validering och mappning av anspråk och testar autentiseringsflödet.

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och frivillig registrering. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. AKS-förhandsversioner stöds delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Förutsättningar

  • Den här artikeln kräver version 2.77.0 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad där. Information om hur du installerar eller uppdaterar Azure CLI på den lokala datorn finns i Installera Azure CLI.

  • Du måste installera aks-preview Azure CLI-tillägget version 18.0.0b41 eller senare för att kunna använda strukturerade autentiseringsfunktioner.

    • Om du inte redan har aks-preview tillägget installerar du det med kommandot az extension add .

      az extension add --name aks-preview
      
    • Om du redan har aks-preview tillägget uppdaterar du det så att du har den senaste versionen med kommandot az extension update .

      az extension update --name aks-preview
      
    • Kontrollera att du har den version av aks-preview tillägget som krävs med kommandot az extension show .

      az extension show --name aks-preview --query version
      
  • Ett AKS-kluster som kör Kubernetes version 1.30 eller senare. Information om hur du skapar ett AKS-kluster finns i Distribuera ett Azure Kubernetes Service (AKS) kluster med hjälp av Azure CLI.

  • kubectl kommandoradsverktyg för att interagera med ditt Kubernetes-kluster. kubectl är redan installerat om du använder Azure Cloud Shell. Du kan installera kubectl lokalt med kommandot az aks install-cli .

    az aks install-cli
    
  • En extern identitetsprovider som stöder OpenID Connect (OIDC).

  • Nätverksanslutning från klusternoder till din identitetsprovider.

  • Om du planerar att använda kubelogin plugin-programmet installerar du det genom att följa anvisningarna i installationsguiden för kubelogin.

Ange miljövariabler

  • Ange följande miljövariabler för resursgruppen och klusternamnet:

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

Registrera funktionen JWTAuthenticatorPreview

  1. Registrera funktionen JWTAuthenticatorPreview med kommandot az feature register .

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Kontrollera registreringsstatusen för funktionen med hjälp av az feature show kommandot .

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. När statusen visar Registered, uppdaterar du registreringen av resursprovider för Microsoft.ContainerService med kommandot az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Konfigurera GitHub Actions OIDC-autentisering

  1. Kontrollera att dina GitHub Actions arbetsflöden har nödvändiga behörigheter.

  2. Konfigurera behörigheten id-token: write i arbetsflödesfilerna. Som exempel:

    permissions:
      id-token: write
      contents: read
    
  3. Konfigurera lämpliga inställningar för lagringsplats och organisation för OIDC-tokenåtkomst. Konfigurera OIDC-inställningar för lagringsplats och organisationens säkerhetsprinciper för tokenanvändning.

Konfigurera Google Identity OAuth 2.0-autentisering

  1. Gå till Google Cloud Console.
  2. Skapa eller välj ett projekt.
  3. Skapa OAuth 2.0-autentiseringsuppgifter.
  4. Observera klient-ID och klienthemlighet för senare användning.

Skapa JWT-autentiseringskonfiguration för GitHub Actions OIDC

  • Skapa en fil med namnet jwt-config.json med följande 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'"
          }
      ]
    }
    

Skapa JWT-autentiseringskonfiguration för Google Identity

  • Skapa en fil med namnet jwt-config.json med följande 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-autentiseringskonfigurationselement

JWT-autentiseringskonfigurationen innehåller följande nyckelelement: issuer, claimValidationRules, claimMappingsoch userValidationRules. Varje element har ett specifikt syfte när det gäller att definiera hur AKS validerar och bearbetar JWT-token från den externa identitetsprovidern.

Utfärdarkonfiguration

I följande tabell beskrivs de viktigaste elementen i konfigurationen issuer :

Konfigurationselement för utfärdare Beskrivning
url OIDC-utfärdarens URL måste överensstämma med kravet iss i JWTs.
audiences Lista över målgrupper som JWT:erna måste utfärdas för (kontrolleras mot aud anspråk).

Konfiguration av anspråksverifieringsregler

I följande tabell beskrivs de viktigaste elementen i konfigurationen claimValidationRules :

Element för anspråksverifieringsregel Beskrivning
expression CEL-uttryck som definierar valideringslogik som ska tillämpas på JWT-anspråk. Uttrycket måste utvärderas som sant för att token ska accepteras.
message Felmeddelandet returnerades när verifieringsregeln misslyckas.

Konfiguration av anspråksmappningar

I följande tabell beskrivs de viktigaste elementen i konfigurationen claimMappings :

Element för anspråksmappningar Beskrivning
username CEL-uttryck som definierar hur du konstruerar Kubernetes-användarnamnet från JWT-anspråk. Måste innehålla prefixet aks:jwt: för att förhindra konflikter med andra autentiseringsmetoder.
groups CEL-uttryck som definierar hur du skapar Kubernetes-gruppmedlemskap från JWT-anspråk. Måste innehålla prefixet aks:jwt: för att förhindra konflikter med andra autentiseringsmetoder.
uid Valfritt CEL-uttryck som definierar en unik identifierare för användaren.
extra Valfri karta över ytterligare användarattribut som definierats av CEL-uttryck.

Konfiguration av användarverifieringsregler

I följande tabell beskrivs de viktigaste elementen i konfigurationen userValidationRules :

Element för användarverifieringsregel Beskrivning
expression CEL-uttryck som definierar ytterligare valideringslogik som ska tillämpas på den slutliga mappade användarinformationen. Uttrycket måste utvärderas till sant för att användaren ska accepteras.
message Felmeddelandet returnerades när verifieringsregeln för användaren misslyckas.

Skapa JWT-autentiseringen

  • Lägg till JWT-autentiseringen i AKS-klustret med kommandot az aks jwtauthenticator add .

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

Hantera JWT-autentiseringar

Visa en lista över alla JWT-autentiserare

  • Visa en lista över alla JWT-autentiseringar i klustret med kommandot az aks jwtauthenticator list .

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

Hämta information för en specifik JWT-autentisering

  • Hämta information om en specifik JWT-autentisering med hjälp av az aks jwtauthenticator show kommandot .

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

Konfigurera GitHub Actions OIDC för autentisering

  1. Skapa miljövariabler och ställ in följande nödvändiga hemligheter för repo i ditt GitHub-repo:

    • AKS_SERVER_URL: URL:en för AKS-klustrets API-server.
    • AKS_CA_DATA: Base64-kodade certifikatutfärdardata för ditt AKS-kluster.
  2. Skapa ett arbetsflöde som hämtar en OIDC-token och använder den för att autentisera med ditt AKS-kluster. Följande exempelarbetsflöde hämtar alla poddar som körs i klustret:

    Anmärkning

    Målgruppsvärdet my-api ska matcha målgruppen som konfigurerats i JWT-autentiseringskonfigurationen.

    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
    

Hämta klusterinformation för JWT-autentiseringskonfiguration

  1. Hämta API-server-URL:en för klustret med hjälp av az aks show kommandot .

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Hämta base64-kodade certifikatutfärdardata för klustret med hjälp av az aks get-credentials kommandot .

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

Konfigurera Google Identity OAuth 2.0 för autentisering

Du kan konfigurera Google Identity-autentisering med hjälp av plugin-programmet kubelogin eller genom att direkt använda en statisk token.

  • Lägg till en ny användarkontext i kubeconfig-filen. Som exempel:

    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
    

Testa autentisering

  1. Utlös arbetsflödet antingen genom att pusha till huvudgrenen eller manuellt starta det från fliken Åtgärder i ditt arkiv.

  2. Övervaka arbetsflödeskörningen på fliken Åtgärder för att kontrollera att autentiseringen fungerar.

    Förväntade utdata vid den första inställningen innan konfiguration av 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
    

    Det här felet anger lyckad autentisering men brist på auktorisering.

  • Testa autentiseringen genom att använda kommandot kubectl get nodes med flaggan --user för att ange den användarkontext du skapade för Google Identity-autentisering. Som exempel:

    kubectl get nodes --user external-user
    

    Förväntade utdata vid den första inställningen innan konfiguration av 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
    

    Det här felet anger lyckad autentisering men brist på auktorisering.

Konfigurera Kubernetes Role-Based Access Control (RBAC)

Skapa lämpliga RBAC-bindningar för dina externa användare och använd autentiseringsuppgifterna för klusteradministratören för att tillämpa dessa konfigurationer.

  1. Skapa en fil med namnet rbac-config.yaml för att konfigurera RBAC-bindningar för externa användare. Som exempel:

    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. Använd RBAC-konfigurationen kubectl apply med kommandot :

    kubectl apply -f rbac-config.yaml
    
  1. Skapa en fil med namnet rbac-config.yaml för att konfigurera RBAC-bindningar för externa användare. Som exempel:

    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. Använd RBAC-konfigurationen kubectl apply med kommandot :

    kubectl apply -f rbac-config.yaml
    

Verifiera åtkomst med RBAC

  • Kontrollera att den externa användaren nu kan komma åt resurser enligt de RBAC-behörigheter som du konfigurerade med hjälp av kubectl get nodes kommandona och kubectl get pods med --user flaggan . Som exempel:

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

Ta bort JWT-autentisering

  • När du inte längre behöver JWT-autentiseringen tar du bort den från AKS-klustret med kommandot az aks jwtauthenticator delete .

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