Настройка внешних поставщиков удостоверений с помощью структурированной проверки подлинности AKS (предварительная версия)

В этой статье показано, как настроить GitHub и внешние поставщики удостоверений Google Identity для проверки подлинности уровня управления Azure Kubernetes Service (AKS) с помощью структурированной проверки подлинности. Вы узнаете, как создать средства проверки подлинности веб-маркера JSON (JWT), настроить проверку утверждений и сопоставление, а также проверить поток проверки подлинности.

Это важно

Предварительные версии функций AKS доступны на условиях самообслуживания и добровольного выбора. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:

Предпосылки

  • Используйте среду Bash в Azure Cloud Shell. Для получения дополнительной информации см. Get started with Azure Cloud Shell.

  • Если вы предпочитаете локально запускать справочные команды CLI, установите Azure CLI. Если вы работаете на Windows или macOS, попробуйте запустить Azure CLI в контейнере Docker. Для получения более полной информации см. раздел Как запускать Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, войдите в Azure CLI с помощью команды az login. Чтобы завершить процесс аутентификации, следуйте шагам, отображаемым в вашем терминале. Для других параметров входа см. раздел Аутентификация в Azure с помощью Azure CLI.

    • При появлении запроса установите расширение Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в разделе Использование расширений и управление ими с помощью Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Для этой статьи требуется версия 2.77.0 или более поздняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена там. Чтобы установить или обновить Azure CLI на локальном компьютере, см. статью Install Azure CLI.

  • Чтобы использовать структурированную проверку подлинности, необходимо установить расширение aks-preview Azure CLI версии 18.0.0b41 или более поздней версии.

    • Если у вас еще нет aks-preview расширения, установите его с помощью az extension add команды.

      az extension add --name aks-preview
      
    • Если у вас уже есть aks-preview расширение, обновите его, чтобы убедиться, что у вас установлена последняя версия с помощью az extension update команды.

      az extension update --name aks-preview
      
    • Убедитесь, что у вас есть требуемая версия aks-preview расширения с помощью az extension show команды.

      az extension show --name aks-preview --query version
      
  • Кластер AKS под управлением Kubernetes версии 1.30 или более поздней. Чтобы создать кластер AKS, см. Развертывание кластера Azure Kubernetes Service (AKS) с использованием Azure CLI.

  • kubectl средство командной строки для взаимодействия с кластером Kubernetes. kubectl уже установлен, если вы используете Azure Cloud Shell. Вы можете установить kubectl локально с помощью az aks install-cli команды.

    az aks install-cli
    
  • Внешний поставщик удостоверений, поддерживающий OpenID Connect (OIDC).

  • Сетевое подключение узлов кластера к вашему поставщику удостоверений.

  • Если вы планируете использовать плагин kubelogin, установите его, следуя инструкциям в кубелогин руководстве по настройке.

Настройка переменных среды

  • Задайте следующие переменные среды для группы ресурсов и имени кластера:

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

Регистрация JWTAuthenticatorPreview функции

  1. Зарегистрируйте функцию JWTAuthenticatorPreview с помощью команды az feature register.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Проверьте состояние регистрации функции с помощью az feature show команды.

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Когда отображается Registered состояние, обновите регистрацию поставщика ресурсов для Microsoft.ContainerService с помощью команды az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Настройте аутентификацию OIDC для "GitHub Actions"

  1. Убедитесь, что рабочие процессы GitHub Actions имеют необходимые разрешения.

  2. Настройте id-token: write право доступа в файлах рабочего процесса. Рассмотрим пример.

    permissions:
      id-token: write
      contents: read
    
  3. Настройте адекватные параметры репозитория и организации для доступа к маркеру OIDC. Настройте параметры OIDC репозитория и политики безопасности организации для использования токенов.

Настройка проверки подлинности Google Identity OAuth 2.0

  1. Перейдите в Google Cloud Console.
  2. Создайте или выберите проект.
  3. Создайте учетные данные OAuth 2.0.
  4. Запишите идентификатор клиента и секрет клиента для последующего использования.

Создание конфигурации проверки подлинности JWT для GitHub Actions OIDC

  • Создайте файл с именем jwt-config.json следующей конфигурации:

    {
      "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 для Google Identity

  • Создайте файл с именем jwt-config.json следующей конфигурации:

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

Конфигурация проверки подлинности JWT включает следующие ключевые элементы: issuer, , claimValidationRulesclaimMappingsи userValidationRules. Каждый элемент имеет конкретное назначение в проверке и обработке JWT токенов от внешнего поставщика удостоверений в AKS.

Конфигурация издателя

В следующей issuer таблице описываются ключевые элементы конфигурации:

Элемент конфигурации издателя Описание
url URL-адрес издателя OIDC, который должен соответствовать утверждению iss в JWTs.
audiences Список аудиторий, для которых должны быть выданы JWTs (сверяются с aud утверждением).

Настройка правил проверки утверждений

В следующей claimValidationRules таблице описываются ключевые элементы конфигурации:

Элемент правила проверки утверждений Описание
expression Выражение CEL, определяющее логику проверки для применения к утверждениям JWT. Выражение должно оцениваться как true, чтобы токен был принят.
message Сообщение об ошибке, возвращаемое при сбое правила проверки.

Конфигурация сопоставлений утверждений

В следующей claimMappings таблице описываются ключевые элементы конфигурации:

Элемент сопоставления утверждений Описание
username Выражение CEL, определяющее, как создать имя пользователя Kubernetes из утверждений JWT. Необходимо включить aks:jwt: префикс, чтобы предотвратить конфликты с другими методами проверки подлинности.
groups Выражение CEL, определяющее, как формировать членство в Kubernetes-группах на основе утверждений JWT. Необходимо включить aks:jwt: префикс, чтобы предотвратить конфликты с другими методами проверки подлинности.
uid Необязательное выражение CEL, определяющее уникальный идентификатор пользователя.
extra Необязательная карта дополнительных пользовательских атрибутов, определенных выражениями CEL.

Настройка правил проверки пользователей

В следующей userValidationRules таблице описываются ключевые элементы конфигурации:

Элемент правила проверки пользователей Описание
expression Выражение CEL, определяющее дополнительную логику проверки для применения к окончательной сопоставленной информации пользователя. Выражение должно иметь значение true, чтобы пользователь был принят.
message Сообщение об ошибке, возвращаемое при сбое правила проверки пользователя.

Создание средства проверки подлинности JWT

  • Добавьте средство проверки подлинности JWT в кластер AKS с помощью az aks jwtauthenticator add команды.

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

Управление средствами проверки подлинности JWT

Перечисление всех аутентификаторов JWT

  • Перечислите все средства проверки подлинности JWT в кластере az aks jwtauthenticator list с помощью команды.

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

Получение сведений об определенном аутентификаторе JWT

  • Получите сведения о конкретном механизме проверки подлинности JWT, используя команду az aks jwtauthenticator show.

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

Настройка GitHub Actions OIDC для проверки подлинности

  1. Создайте переменные окружения и задайте следующие обязательные секреты репозитория в своем репозитории GitHub.

    • AKS_SERVER_URL: URL-адрес сервера API кластера AKS.
    • AKS_CA_DATA: данные центра сертификации в кодировке Base64 для кластера AKS.
  2. Создайте рабочий процесс, который получает маркер OIDC и использует его для проверки подлинности в кластере AKS. Следующий пример рабочего процесса получает все модули pod, выполняемые в кластере:

    Замечание

    Значение my-api аудитории должно соответствовать аудитории, настроенной в конфигурации средства проверки подлинности 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
    

Получение сведений о кластере для конфигурации проверки подлинности JWT

  1. Получите URL-адрес сервера API для кластера с помощью az aks show команды.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Получите данные центра сертификации в кодировке Base64 для кластера с помощью az aks get-credentials команды.

    # 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 для проверки подлинности

Вы можете настроить проверку подлинности Google Identity с помощью kubelogin плагина или непосредственно с помощью статического токена.

  • Добавьте новый контекст пользователя в файл kubeconfig. Рассмотрим пример.

    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
    

Проверка подлинности

  1. Активируйте рабочий процесс, нажав на главную ветвь или вручную активировав его на вкладке "Действия " в репозитории.

  2. Отслеживайте выполнение рабочего процесса на вкладке "Действия", чтобы убедиться, что проверка подлинности работает.

    Ожидаемые выходные данные для первой настройки перед настройкой 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
    

    Эта ошибка указывает на успешную проверку подлинности, но отсутствие авторизации.

  • Проверьте аутентификацию с помощью команды kubectl get nodes и флага --user , чтобы указать контекст пользователя, который вы создали для аутентификации Google Identity. Рассмотрим пример.

    kubectl get nodes --user external-user
    

    Ожидаемые выходные данные для первой настройки перед настройкой 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
    

    Эта ошибка указывает на успешную проверку подлинности, но отсутствие авторизации.

Настройка kubernetes Role-Based Access Control (RBAC)

Создайте соответствующие привязки RBAC для внешних пользователей и используйте учетные данные администратора кластера для применения этих конфигураций.

  1. Создайте файл с именем rbac-config.yaml , чтобы настроить привязки RBAC для внешних пользователей. Рассмотрим пример.

    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. Примените конфигурацию RBAC с помощью kubectl apply команды:

    kubectl apply -f rbac-config.yaml
    
  1. Создайте файл с именем rbac-config.yaml , чтобы настроить привязки RBAC для внешних пользователей. Рассмотрим пример.

    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. Примените конфигурацию RBAC с помощью kubectl apply команды:

    kubectl apply -f rbac-config.yaml
    

Проверка доступа с помощью RBAC

  • Убедитесь, что внешний пользователь теперь может получить доступ к ресурсам согласно разрешениям RBAC, настроенным с помощью команд kubectl get nodes и kubectl get pods с флагом --user. Рассмотрим пример.

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

Удаление средства проверки подлинности JWT

  • Если вам больше не нужен средство проверки подлинности JWT, удалите его из кластера AKS с помощью az aks jwtauthenticator delete команды.

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