Configuración de proveedores de identidades externos con autenticación estructurada de AKS (versión preliminar)

En este artículo se explica cómo configurar los proveedores de identidades externos de GitHub y Google Identity para la autenticación del plano de control de Azure Kubernetes Service (AKS) mediante la autenticación estructurada. Aprenderá a crear autenticadores JSON Web Token (JWT), configurar la validación y asignación de reclamaciones, y probar el flujo de autenticación.

Importante

Las características en versión preliminar de AKS están disponibles a elección del usuario y en régimen de autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS cuentan con soporte parcial por parte del servicio al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Prerrequisitos

  • En este artículo se requiere la versión 2.77.0 o posterior del Azure CLI. Si usa Azure Cloud Shell, la versión más reciente ya está instalada allí. Para instalar o actualizar el Azure CLI en el equipo local, consulte Install the Azure CLI.

  • Debe instalar la extensión aks-preview Azure CLI versión 18.0.0b41 o posterior para usar características de autenticación estructuradas.

    • Si aún no tienes la extensión aks-preview, instálala usando el comando az extension add.

      az extension add --name aks-preview
      
    • Si ya tienes la extensión aks-preview, actualízala para asegurarte de tener la última versión usando el comando az extension update.

      az extension update --name aks-preview
      
    • Compruebe que tiene la versión necesaria de la aks-preview extensión mediante el az extension show comando .

      az extension show --name aks-preview --query version
      
  • Un clúster de AKS que ejecuta kubernetes versión 1.30 o posterior. Para crear un clúster de AKS, consulte Deploy an Azure Kubernetes Service (AKS) cluster using Azure CLI.

  • kubectl herramienta de línea de comandos para interactuar con el clúster de Kubernetes. kubectl ya está instalado si usa Azure Cloud Shell. Puede instalar kubectl localmente mediante el az aks install-cli comando .

    az aks install-cli
    
  • Proveedor de identidades externo que admite OpenID Connect (OIDC).

  • Conectividad de red desde nodos de clúster a su proveedor de identidad.

  • Si planea usar el kubelogin complemento, instálelo siguiendo las instrucciones de la guía de configuración de kubelogin.

Establecimiento de variables de entorno

  • Establezca las siguientes variables de entorno para el grupo de recursos y el nombre del clúster:

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

Registro de la JWTAuthenticatorPreview característica

  1. Registre la JWTAuthenticatorPreview característica mediante el az feature register comando .

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Compruebe el estado de registro de la característica mediante el az feature show comando .

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Cuando el estado muestre Registered, actualice el registro del proveedor de recursos para Microsoft.ContainerService utilizando el comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Configuración de autenticación OIDC en GitHub Actions

  1. Asegúrese de que los flujos de trabajo de GitHub Actions tienen los permisos necesarios.

  2. Configura el id-token: write permiso en tus archivos de flujo de trabajo. Por ejemplo:

    permissions:
      id-token: write
      contents: read
    
  3. Configure la configuración adecuada del repositorio y la organización para el acceso a tokens de OIDC. Configure la configuración de OIDC del repositorio y las directivas de seguridad de la organización para el uso de tokens.

Configuración de la autenticación de OAuth 2.0 de Google Identity

  1. Vaya a google Cloud Console.
  2. Cree o seleccione un proyecto.
  3. Cree credenciales de OAuth 2.0.
  4. Anote el identificador de cliente y el secreto de cliente para su uso posterior.

Creación de la configuración del autenticador JWT para GitHub Actions OIDC

  • Cree un archivo denominado jwt-config.json con la siguiente configuración:

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

Creación de la configuración del autenticador JWT para Google Identity

  • Cree un archivo denominado jwt-config.json con la siguiente configuración:

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

Elementos de configuración del autenticador JWT

La configuración del autenticador JWT incluye los siguientes elementos clave: issuer, claimValidationRules, claimMappingsy userValidationRules. Cada elemento sirve para un propósito específico para definir cómo AKS valida y procesa tokens JWT desde el proveedor de identidades externo.

Configuración del emisor

En la tabla siguiente se describen los elementos clave de la issuer configuración:

Elemento de configuración del emisor Descripción
url Dirección URL del emisor de OIDC que debe coincidir con la reclamación iss en JWT.
audiences Lista de audiencias para las que se deben emitir JWT (comprobados con la reclamación aud).

Configuración de reglas de validación de reclamaciones

En la tabla siguiente se describen los elementos clave de la claimValidationRules configuración:

Elemento de regla de validación de reclamaciones Descripción
expression Expresión CEL que define la lógica de validación que se va a aplicar a las notificaciones JWT. La expresión debe evaluarse como true para que se acepte el token.
message Mensaje de error devuelto cuando se produce un error en la regla de validación.

Configuración de asignaciones de reclamaciones

En la tabla siguiente se describen los elementos clave de la claimMappings configuración:

Elemento de mapeos de reclamaciones Descripción
username Expresión CEL que define cómo construir el nombre de usuario de Kubernetes a partir de notificaciones JWT. Debe incluir el aks:jwt: prefijo para evitar conflictos con otros métodos de autenticación.
groups Expresión CEL que define cómo construir membresías de grupos de Kubernetes a partir de declaraciones JWT. Debe incluir el aks:jwt: prefijo para evitar conflictos con otros métodos de autenticación.
uid Expresión CEL opcional que define un identificador único para el usuario.
extra Mapa opcional de atributos de usuario adicionales definidos por expresiones CEL.

Configuración de reglas de validación de usuario

En la tabla siguiente se describen los elementos clave de la userValidationRules configuración:

Elemento de regla de validación de usuario Descripción
expression Expresión CEL que define la lógica de validación adicional que se aplicará a la información de usuario final mapeada. La expresión debe evaluarse como verdadera para que el usuario sea aceptado.
message Mensaje de error devuelto cuando se produce un error en la regla de validación del usuario.

Creación del autenticador JWT

  • Agregue el autenticador JWT al clúster de AKS mediante el az aks jwtauthenticator add comando .

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

Administración de autenticadores JWT

Enumerar todos los autenticadores JWT

  • Enumere todos los autenticadores JWT del clúster mediante el az aks jwtauthenticator list comando .

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

Obtener detalles de un autenticador JWT específico

  • Obtenga detalles de un autenticador JWT específico mediante el az aks jwtauthenticator show comando .

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

Configuración de GitHub Actions OIDC para la autenticación

  1. Cree variables de entorno para y establezca los siguientes secretos de repositorio necesarios en el repositorio de GitHub:

    • AKS_SERVER_URL: dirección URL del servidor de API del clúster de AKS.
    • AKS_CA_DATA: datos de entidad de certificación codificados en Base64 para el clúster de AKS.
  2. Cree un flujo de trabajo que obtenga un token de OIDC y lo use para autenticarse con el clúster de AKS. El siguiente flujo de trabajo de ejemplo obtiene todos los pods que se ejecutan en el clúster:

    Nota:

    El valor my-api de audiencia debe coincidir con la audiencia configurada en la configuración del autenticador 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
    

Obtención de información del clúster para la configuración del autenticador JWT

  1. Obtenga la dirección URL del servidor de API para el clúster mediante el az aks show comando .

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Obtenga los datos de la entidad de certificación codificada en base64 para el clúster mediante el 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}'
    

Configuración de Google Identity OAuth 2.0 para la autenticación

Puede configurar la autenticación de Google Identity mediante el kubelogin complemento o directamente mediante un token estático.

  • Agregue un nuevo contexto de usuario al archivo kubeconfig. Por ejemplo:

    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
    

Prueba de la autenticación

  1. Desencadene el flujo de trabajo mediante la inserción en la rama principal o desencadénelo manualmente desde la pestaña Acciones del repositorio.

  2. Supervise la ejecución del flujo de trabajo en la pestaña Acciones para comprobar que la autenticación funciona.

    Salida esperada para la configuración inicial antes de la configuración del Control de Acceso Basado en Rol (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
    

    Este error indica la autenticación correcta pero la falta de autorización.

  • Pruebe la autenticación utilizando el comando kubectl get nodes con la bandera --user para especificar el contexto de usuario que creó para la autenticación de Google Identity. Por ejemplo:

    kubectl get nodes --user external-user
    

    Salida esperada para la configuración inicial antes de la configuración del Control de Acceso Basado en Rol (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
    

    Este error indica la autenticación correcta pero la falta de autorización.

Configuración del Role-Based Access Control de Kubernetes (RBAC)

Cree enlaces RBAC adecuados para los usuarios externos y use las credenciales de administrador del clúster para aplicar estas configuraciones.

  1. Cree un archivo denominado rbac-config.yaml para configurar enlaces RBAC para usuarios externos. Por ejemplo:

    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. Aplique la configuración de RBAC mediante el kubectl apply comando :

    kubectl apply -f rbac-config.yaml
    
  1. Cree un archivo denominado rbac-config.yaml para configurar enlaces RBAC para usuarios externos. Por ejemplo:

    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. Aplique la configuración de RBAC mediante el kubectl apply comando :

    kubectl apply -f rbac-config.yaml
    

Comprobación del acceso con RBAC

  • Compruebe que el usuario externo ahora puede acceder a los recursos según los permisos de RBAC que configuró utilizando los comandos kubectl get nodes y kubectl get pods con la bandera --user. Por ejemplo:

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

Eliminación del autenticador JWT

  • Cuando ya no necesite el autenticador JWT, quítelo del clúster de AKS mediante el az aks jwtauthenticator delete comando .

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