Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как настроить GitHub и внешние поставщики удостоверений Google Identity для проверки подлинности уровня управления Azure Kubernetes Service (AKS) с помощью структурированной проверки подлинности. Вы узнаете, как создать средства проверки подлинности веб-маркера JSON (JWT), настроить проверку утверждений и сопоставление, а также проверить поток проверки подлинности.
Это важно
Предварительные версии функций AKS доступны на условиях самообслуживания и добровольного выбора. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии 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-previewAzure 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 функции
Зарегистрируйте функцию
JWTAuthenticatorPreviewс помощью командыaz feature register.az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerServiceПроверьте состояние регистрации функции с помощью
az feature showкоманды.az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerServiceКогда отображается
Registeredсостояние, обновите регистрацию поставщика ресурсов дляMicrosoft.ContainerServiceс помощью командыaz provider register.az provider register --namespace Microsoft.ContainerService
Настройте аутентификацию OIDC для "GitHub Actions"
Убедитесь, что рабочие процессы GitHub Actions имеют необходимые разрешения.
Настройте
id-token: writeправо доступа в файлах рабочего процесса. Рассмотрим пример.permissions: id-token: write contents: readНастройте адекватные параметры репозитория и организации для доступа к маркеру OIDC. Настройте параметры OIDC репозитория и политики безопасности организации для использования токенов.
Настройка проверки подлинности Google Identity OAuth 2.0
- Перейдите в Google Cloud Console.
- Создайте или выберите проект.
- Создайте учетные данные OAuth 2.0.
- Запишите идентификатор клиента и секрет клиента для последующего использования.
Создание конфигурации проверки подлинности 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 для проверки подлинности
Создайте переменные окружения и задайте следующие обязательные секреты репозитория в своем репозитории GitHub.
-
AKS_SERVER_URL: URL-адрес сервера API кластера AKS. -
AKS_CA_DATA: данные центра сертификации в кодировке Base64 для кластера AKS.
-
Создайте рабочий процесс, который получает маркер 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
Получите URL-адрес сервера API для кластера с помощью
az aks showкоманды.az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \ awk '{print "https://" $0 ":443"}'Получите данные центра сертификации в кодировке 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
Проверка подлинности
Активируйте рабочий процесс, нажав на главную ветвь или вручную активировав его на вкладке "Действия " в репозитории.
Отслеживайте выполнение рабочего процесса на вкладке "Действия", чтобы убедиться, что проверка подлинности работает.
Ожидаемые выходные данные для первой настройки перед настройкой 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 для внешних пользователей и используйте учетные данные администратора кластера для применения этих конфигураций.
Создайте файл с именем
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Примените конфигурацию RBAC с помощью
kubectl applyкоманды:kubectl apply -f rbac-config.yaml
Создайте файл с именем
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Примените конфигурацию 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