Configurer des fournisseurs d’identité externes avec l’authentification structurée AKS (préversion)

Cet article explique comment configurer GitHub et les fournisseurs d’identité externes Google Identity pour l’authentification de plan de contrôle Azure Kubernetes Service (AKS) à l’aide de l’authentification structurée. Vous découvrez comment créer des authentificateurs JSON Web Token (JWT), configurer la validation et le mappage des revendications et tester le flux d’authentification.

Important

Les fonctionnalités d’évaluation AKS sont disponibles en libre-service et font l’objet d’un abonnement. Les versions d'essai sont fournies « en l’état » et « selon disponibilité », et elles sont exclues des contrats de niveau de service et de la garantie limitée. Les versions préliminaires AKS sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Par conséquent, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

Prerequisites

  • Cet article nécessite la version 2.77.0 ou ultérieure du Azure CLI. Si vous utilisez Azure Cloud Shell, la dernière version est déjà installée. Pour installer ou mettre à jour le Azure CLI sur votre ordinateur local, consultez Installer le Azure CLI.

  • Vous devez installer l’extension aks-preview Azure CLI version 18.0.0b41 ou ultérieure pour utiliser des fonctionnalités d’authentification structurée.

    • Si vous n’avez pas encore l’extension aks-preview, installez-la en utilisant la commande az extension add.

      az extension add --name aks-preview
      
    • Si vous disposez déjà de l’extension aks-preview, mettez-la à jour pour vous assurer que vous disposez de la dernière version en utilisant la commande az extension update.

      az extension update --name aks-preview
      
    • Vérifiez que vous disposez de la version requise de l’extension aks-preview à l’aide de la commande az extension show.

      az extension show --name aks-preview --query version
      
  • Un cluster AKS exécutant Kubernetes version 1.30 ou ultérieure. Pour créer un cluster AKS, consultez Deploy an Azure Kubernetes Service (AKS) cluster using Azure CLI.

  • kubectl outil en ligne de commande pour interagir avec votre cluster Kubernetes. kubectl est déjà installé si vous utilisez Azure Cloud Shell. Vous pouvez installer kubectl localement à l’aide de la az aks install-cli commande.

    az aks install-cli
    
  • Fournisseur d’identité externe qui prend en charge OpenID Connect (OIDC).

  • Connectivité réseau entre les nœuds de cluster et votre fournisseur d’identité.

  • Si vous envisagez d’utiliser le kubelogin plug-in, installez-le en suivant les instructions du guide de configuration kubelogin.

Définir des variables d’environnement

  • Définissez les variables d’environnement suivantes pour votre groupe de ressources et le nom du cluster :

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

Inscrire la JWTAuthenticatorPreview fonctionnalité

  1. Enregistrez la JWTAuthenticatorPreview fonctionnalité à l'aide de la az feature register commande.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Vérifiez l’état d’inscription de la fonctionnalité à l’aide de la az feature show commande.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Lorsque l'état s'affiche Registered, mettez à jour l'inscription du fournisseur de ressources pour Microsoft.ContainerService à l'aide de la commande az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Configurer l’authentification OIDC pour GitHub Actions

  1. Vérifiez que vos flux de travail GitHub Actions disposent des autorisations nécessaires.

  2. Configurez l’autorisation id-token: write dans vos fichiers de flux de travail. Par exemple:

    permissions:
      id-token: write
      contents: read
    
  3. Configurez les paramètres de référentiel et d’organisation appropriés pour l’accès aux jetons OIDC. Configurez les paramètres OIDC du référentiel et les stratégies de sécurité de l’organisation pour l’utilisation des jetons.

Configurer l’authentification OAuth 2.0 d’identité Google

  1. Accédez à la console Google Cloud.
  2. Créez ou sélectionnez un projet.
  3. Créez des informations d’identification OAuth 2.0.
  4. Notez votre ID client et votre clé secrète client pour une utilisation ultérieure.

Créer une configuration d’authentificateur JWT pour GitHub Actions OIDC

  • Créez un fichier nommé jwt-config.json avec la configuration suivante :

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

Créer une configuration d’authentificateur JWT pour Google Identity

  • Créez un fichier nommé jwt-config.json avec la configuration suivante :

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

Éléments de configuration d’authentificateur JWT

La configuration de l’authentificateur JWT inclut les éléments clés suivants : issuer, , claimValidationRules, claimMappingset userValidationRules. Chaque élément sert à définir la façon dont AKS valide et traite les jetons JWT du fournisseur d’identité externe.

Configuration de l’émetteur

Le tableau suivant décrit les éléments clés de la issuer configuration :

Élément de configuration de l’émetteur Description
url L’URL de l’émetteur OIDC qui doit correspondre à la réclamation issdans les JWT.
audiences Liste des audiences auxquelles les JWT doivent être émis (vérifiés par rapport à la revendication aud).

Configuration des règles de validation de revendication

Le tableau suivant décrit les éléments clés de la claimValidationRules configuration :

Élément de règle de validation de revendication Description
expression Expression CEL qui définit la logique de validation à appliquer aux revendications JWT. L'expression doit être évaluée comme vraie pour que le jeton soit accepté.
message Message d’erreur retourné lorsque la règle de validation échoue.

Configuration des mappages de réclamations

Le tableau suivant décrit les éléments clés de la claimMappings configuration :

Élément de mappages de revendications Description
username Expression CEL qui définit comment construire le nom d’utilisateur Kubernetes à partir de revendications JWT. Doit inclure le aks:jwt: préfixe pour éviter les conflits avec d’autres méthodes d’authentification.
groups Expression CEL qui définit comment construire les adhésions de groupe Kubernetes à partir des revendications JWT. Doit inclure le aks:jwt: préfixe pour éviter les conflits avec d’autres méthodes d’authentification.
uid Expression CEL facultative qui définit un identificateur unique pour l’utilisateur.
extra Mappage facultatif d’attributs utilisateur supplémentaires définis par les expressions CEL.

Configuration des règles de validation des utilisateurs

Le tableau suivant décrit les éléments clés de la userValidationRules configuration :

Élément de règle de validation utilisateur Description
expression Expression CEL qui définit une logique de validation supplémentaire à appliquer aux informations utilisateur mappées finales. L’expression doit s’évaluer à vrai pour que l’utilisateur soit accepté.
message Message d’erreur retourné lorsque la règle de validation de l’utilisateur échoue.

Créer l’authentificateur JWT

  • Ajoutez l’authentificateur JWT à votre cluster AKS à l’aide de la az aks jwtauthenticator add commande.

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

Gérer les authentificateurs JWT

Répertorier tous les authentificateurs JWT

  • Répertoriez tous les authentificateurs JWT sur votre cluster à l’aide de la az aks jwtauthenticator list commande.

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

Obtenir des détails pour un authentificateur JWT spécifique

  • Obtenez des détails pour un authentificateur JWT spécifique à l’aide de la az aks jwtauthenticator show commande.

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

Configurer GitHub Actions OIDC pour l’authentification

  1. Créez des variables d’environnement pour et définissez les secrets de référentiel requis suivants dans votre dépôt GitHub :

    • AKS_SERVER_URL: URL du serveur d’API de votre cluster AKS.
    • AKS_CA_DATA: Données d’autorité de certification codées en base64 pour votre cluster AKS.
  2. Créez un flux de travail qui obtient un jeton OIDC et l’utilise pour s’authentifier auprès de votre cluster AKS. L’exemple de workflow suivant récupère tous les pods en cours d’exécution sur le cluster :

    Note

    La valeur my-api de l’audience doit correspondre à l’audience configurée dans votre configuration d’authentificateur 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
    

Obtenir des informations sur le cluster pour la configuration de l’authentificateur JWT

  1. Obtenez l’URL du serveur d’API pour votre cluster à l’aide de la az aks show commande.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Obtenez les données d’autorité de certification encodées en base64 pour votre cluster à l’aide de la az aks get-credentials commande.

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

Configurer Google Identity OAuth 2.0 pour l’authentification

Vous pouvez configurer l’authentification Google Identity à l’aide du kubelogin plug-in ou directement à l’aide d’un jeton statique.

  • Ajoutez un nouveau contexte utilisateur à votre fichier kubeconfig. Par exemple:

    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
    

Tester l’authentification

  1. Déclenchez le flux de travail en envoyant (push) vers la branche principale ou en le déclenchant manuellement à partir de l’onglet Actions de votre référentiel.

  2. Surveillez l’exécution du flux de travail sous l’onglet Actions pour vérifier que l’authentification fonctionne.

    Sortie attendue pour la première installation avant la configuration 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
    

    Cette erreur indique la réussite de l’authentification, mais le manque d’autorisation.

  • Testez l’authentification à l’aide de la kubectl get nodes commande avec l’indicateur --user pour spécifier le contexte utilisateur que vous avez créé pour l’authentification Google Identity. Par exemple:

    kubectl get nodes --user external-user
    

    Sortie attendue pour la première installation avant la configuration 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
    

    Cette erreur indique la réussite de l’authentification, mais le manque d’autorisation.

Configurer Kubernetes Role-Based Access Control (RBAC)

Créez des liaisons RBAC appropriées pour vos utilisateurs externes et utilisez les informations d’identification de l’administrateur de cluster pour appliquer ces configurations.

  1. Créez un fichier nommé rbac-config.yaml pour configurer des liaisons RBAC pour les utilisateurs externes. Par exemple:

    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. Appliquez la configuration RBAC à l’aide de la kubectl apply commande :

    kubectl apply -f rbac-config.yaml
    
  1. Créez un fichier nommé rbac-config.yaml pour configurer des liaisons RBAC pour les utilisateurs externes. Par exemple:

    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. Appliquez la configuration RBAC à l’aide de la kubectl apply commande :

    kubectl apply -f rbac-config.yaml
    

Vérifier l’accès avec RBAC

  • Vérifiez que l’utilisateur externe peut désormais accéder aux ressources en fonction des autorisations RBAC que vous avez configurées à l’aide des commandes kubectl get nodes et kubectl get pods, ainsi que du paramètre --user. Par exemple:

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

Supprimer l’authentificateur JWT

  • Lorsque vous n’avez plus besoin de l’authentificateur JWT, supprimez-le de votre cluster AKS à l’aide de la az aks jwtauthenticator delete commande.

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