Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как авторизовать вызовы API Kubernetes в службе Azure Kubernetes (AKS) с помощью удостоверений идентификаторов Microsoft Entra. Авторизация Entra ID для Kubernetes API использует назначения ролей Azure RBAC для управления доступом к ресурсам Kubernetes. Для встроенных ресурсов Kubernetes назначьте одну из встроенных ролей AKS (например, azure Kubernetes Service RBAC Reader) в области кластера или пространства имен. Для пользовательских ресурсов (CRD) назначьте настраиваемую роль с условиями Azure ABAC, которые указывают, к каким группам или типам CRD назначенный может получить доступ. Два назначения ролей составляют: один предоставляет доступ к стандартным ресурсам Kubernetes, а другой предоставляет условный доступ к определенным пользовательским ресурсам.
Общие сведения о доступных параметрах авторизации API Kubernetes в AKS см. в концепциях авторизации кластера.
Note
При использовании интегрированной проверки подлинности между идентификатором Microsoft Entra и AKS можно использовать пользователей, групп или субъектов-служб Microsoft в качестве субъектов управления доступом на основе ролей Kubernetes (Kubernetes RBAC). При авторизации с помощью Entra ID вам не нужно отдельно управлять удостоверениями пользователей и учетными данными для Kubernetes. Однако вам по-прежнему необходимо настроить и управлять назначениями ролей Entra ID и какими-либо привязками RBAC Kubernetes отдельно.
Перед тем как начать
- Вам потребуется azure CLI версии 2.24.0 или более поздней версии. Чтобы узнать версию, выполните команду
az --version. Если необходимо установить или обновить, см. раздел Install Azure CLI. - Вам нужен
kubectlс минимальной версией 1.18.3. - Для того чтобы добавить авторизацию с использованием Entra ID для API Kubernetes, перед этим на вашем кластере должна быть включена управляемая интеграция Microsoft Entra. Если необходимо включить управляемую интеграцию Microsoft Entra, см. раздел "Использование идентификатора Microsoft Entra в AKS".
- Новые назначения ролей могут занять до пяти минут для распространения и обновления сервером авторизации.
- Авторизация Entra ID для API Kubernetes требует, чтобы тенант Microsoft Entra, настроенный для аутентификации, совпадал с тенантом для подписки, содержащей ваш кластер AKS.
Создайте новый кластер AKS с управляемой интеграцией Microsoft Entra и авторизацией Entra ID
Создайте группу ресурсов Azure с помощью команды
az group create.export RESOURCE_GROUP=<resource-group-name> export LOCATION=<azure-region> az group create --name $RESOURCE_GROUP --location $LOCATIONСоздайте кластер AKS с управляемой интеграцией Microsoft Entra и управляемой авторизацией Entra ID с помощью команды
az aks create.export CLUSTER_NAME=<cluster-name> az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --enable-aad \ --enable-azure-rbac \ --generate-ssh-keysВаш результат должен быть похож на следующий пример результата:
"AADProfile": { "adminGroupObjectIds": null, "clientAppId": null, "enableAzureRbac": true, "managed": true, "serverAppId": null, "serverAppSecret": null, "tenantId": "****-****-****-****-****" }
Включение авторизации Entra ID в существующем кластере AKS
Включите авторизацию Entra ID для API Kubernetes в существующем кластере AKS с помощью команды
az aks updateи флага--enable-azure-rbac.az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac
Встроенные роли AKS
AKS предоставляет следующие встроенные роли:
| Роль | Description |
|---|---|
| Читатель RBAC в службе Azure Kubernetes | Предоставляет доступ только для чтения, позволяя просматривать большинство объектов в пространстве имен. Это не позволяет просматривать роли или привязки ролей. Эта роль не разрешает просмотр Secrets, так как чтение содержимого Secrets обеспечивает доступ к учетным данным ServiceAccount в пространстве имен, что позволит API получить доступ к любому ServiceAccount в пространстве имен (форма эскалации привилегий). |
| Модуль записи RBAC службы Azure Kubernetes | Разрешает доступ на чтение и запись к большинству объектов в пространстве имён. Эта роль не позволяет просматривать или изменять роли или привязки ролей. Однако эта роль позволяет получать доступ к Secrets и запускать Pod от имени любого ServiceAccount в пространстве имен, поэтому её можно использовать для получения уровня доступа к API любого ServiceAccount в пространстве имен. |
| Администратор RBAC службы Azure Kubernetes | Предоставляет административный доступ, который следует предоставлять в пространственном имени. Разрешает доступ для чтения и записи к большинству ресурсов в пространстве имен (или области кластера), включая возможность создания ролей и привязок ролей в пространстве имен. Эта роль не предоставляет права записи ни к квоте ресурса, ни к самому пространству имен. |
| Администратор кластера RBAC службы Azure Kubernetes | Разрешает доступ суперпользователя для выполнения любых действий с любым ресурсом. Он обеспечивает полный контроль над каждым ресурсом в кластере и во всех пространствах имен. |
Создание назначений ролей для доступа к кластеру
Получите идентификатор ресурса AKS с помощью
az aks showкоманды.AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)Создайте назначение роли с помощью
az role assignment createкоманды.<AAD-ENTITY-ID>может быть именем пользователя или идентификатором клиента субъекта-службы. В следующем примере создается назначение ролей для роли администратора RBAC службы Azure Kubernetes .az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_IDNote
Вы можете создать назначения ролей Чтение RBAC для службы Azure Kubernetes и Запись RBAC для службы Azure Kubernetes, задаваемые для определенного пространства имен в кластере, с помощью команды
az role assignment createи установки области действия на нужное пространство имен.az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
Создание определений пользовательских ролей
Для встроенных ресурсов Kubernetes настраиваемые определения ролей ссылались на соответствующее действие группы API в разделе Microsoft.ContainerService/managedClusters/. В следующем примере пользователь может читать только развертывания и ничего другого. Полный список возможных действий см. в разделе "Операции Microsoft.ContainerService". Сведения о фильтрации доступа к определенным группам или типам настраиваемых ресурсов см. в статье "Ограничение доступа к пользовательским ресурсам с помощью условий ABAC " далее в этой статье.
Чтобы создать собственные определения пользовательских ролей, скопируйте следующий файл, заменив
<YOUR SUBSCRIPTION ID>собственный идентификатор подписки, а затем сохраните его какdeploy-view.json.{ "Name": "AKS Deployment Reader", "Description": "Lets you view all deployments in cluster/namespace.", "Actions": [], "NotActions": [], "DataActions": [ "Microsoft.ContainerService/managedClusters/apps/deployments/read" ], "NotDataActions": [], "assignableScopes": [ "/subscriptions/<YOUR SUBSCRIPTION ID>" ] }Создайте определение роли, используя команду
az role definition create, установите--role-definitionна файлdeploy-view.json, который вы создали на предыдущем шаге.az role definition create --role-definition @deploy-view.jsonНазначьте определение роли пользователю или другому удостоверению с помощью
az role assignment createкоманды.az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
Ограничение доступа к пользовательским ресурсам с помощью условий ABAC (предварительная версия)
Important
Предварительные версии функций AKS доступны на условиях самообслуживания и добровольного выбора. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:
Условия ABAC позволяют отбирать назначения ролей Entra ID для определенных групп и типов настраиваемых ресурсов (CRD) — централизованно из системы идентификации Microsoft Entra, без необходимости писать манифесты Role и RoleBinding для Kubernetes RBAC на уровне кластера. Дополнительные сведения о azure ABAC см. в статье "Что такое условия назначения ролей Azure?".
Когда следует использовать условия ABAC
Используйте эту функцию, если вы хотите:
- Ограничьте, какие группы CRD или типы может перечислить или получить назначенный пользователь.
- Централизованно обеспечивайте границы доступа к пользовательским ресурсам с помощью Microsoft Entra ID, без необходимости управления объектами RBAC
RoleиRoleBindingна каждом кластере. - Различать между CRD, публикуемыми различными операторами (например, разрешить
secrets-store.csi.x-k8s.io, блокируяsecurity.istio.io).
Доступные атрибуты условия
При составлении условий для API Kubernetes в кластере AKS доступны следующие атрибуты запроса:
| Атрибут | Description |
|---|---|
Microsoft.ContainerService/managedClusters/customResources:group |
Группа API доступа к пользовательскому ресурсу (например, secrets-store.csi.x-k8s.io). |
Microsoft.ContainerService/managedClusters/customResources:kind |
Тип доступа к пользовательскому ресурсу (например, secretproviderclasses). |
Добавьте условие ABAC к назначению роли
В следующем примере создается пользовательская роль Читатель AKS CRD, которая предоставляет доступ на чтение к пользовательским ресурсам, а затем назначается с условием, которое разрешает доступ secretproviderclasses только в secrets-store.csi.x-k8s.io группе (CRD, используемый поставщиком Azure Key Vault для драйвера CSI Хранилища секретов).
Сохраните следующее определение роли в файл с именем
crd-reader.json, заменив<YOUR SUBSCRIPTION ID>его собственным идентификатором подписки.{ "Name": "AKS CRD Reader", "Description": "Lets you read custom resources in the cluster.", "Actions": [], "NotActions": [], "DataActions": [ "Microsoft.ContainerService/managedClusters/customresources/read" ], "NotDataActions": [], "assignableScopes": [ "/subscriptions/<YOUR SUBSCRIPTION ID>" ] }Создайте определение роли с помощью
az role definition createкоманды.az role definition create --role-definition @crd-reader.jsonСохраните следующее условие в файл с именем
abac-condition.txt. Условие позволяет некастомизированным ресурсам выполнять операции чтения без изменений, а операции чтения пользовательских ресурсов ограничивает определенной группой и типом.( ( !(ActionMatches{'Microsoft.ContainerService/managedClusters/customresources/read'}) ) OR ( @Request[Microsoft.ContainerService/managedClusters/customResources:group] StringEqualsIgnoreCase 'secrets-store.csi.x-k8s.io' AND @Request[Microsoft.ContainerService/managedClusters/customResources:kind] StringEqualsIgnoreCase 'secretproviderclasses' ) )Создайте назначение роли с условием, используя команду
az role assignment create.az role assignment create \ --role "AKS CRD Reader" \ --assignee <AAD-ENTITY-ID> \ --scope $AKS_ID \ --condition "$(cat abac-condition.txt)" \ --condition-version "2.0" \ --description "Allow reads on SecretProviderClass resources only"
Вы также можете добавить условие на портале Azure. На странице "Добавить назначение ролей " выберите вкладку "Условия ", а затем нажмите кнопку "Добавить условие " и используйте визуальный редактор для создания выражения.
Проверьте условие
После распространения назначения роли (до пяти минут) войдите под учетной записью назначенного пользователя и убедитесь, что он может прочитать разрешенный CRD, но не другие CRD.
Получите учетные данные кластера с помощью
az aks get-credentialsкоманды.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAMEСписок
secretproviderclassesизsecrets-store.csi.x-k8s.ioгруппы, в которой разрешено условие. Команда должна успешно выполниться и вернуть либо существующие ресурсы, либо пустой список (или ошибку 'не найдено', если CRD не установлен на кластере).kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespacesСписок
authorizationpoliciesиз группы Istiosecurity.istio.io, который блокирует условие. Команда должна завершиться ошибкойForbiddenиз веб-перехватчика авторизации Entra ID (при условии, что Istio CRD установлен в кластере; в противном случаеkubectlвозвращается ошибка 'не найден' до того, как сервер API достигнет веб-перехватчика авторизации).kubectl get authorizationpolicies.security.istio.io --all-namespaces
Очистите ресурсы
Отключение авторизации Entra ID
Удалите авторизацию Entra ID с помощью команды
az aks updateс флагом--disable-azure-rbac.az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac
Удаление назначения роли
Вывод списка назначений ролей с помощью
az role assignment listкоманды.az role assignment list --scope $AKS_ID --query [].id --output tsvУдалите назначения ролей с помощью
az role assignment deleteкоманды.az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
Удаление определения роли
Удалите определение пользовательской роли с помощью
az role definition deleteкоманды.az role definition delete --name "AKS Deployment Reader"
Удаление группы ресурсов и кластера AKS
Удалите группу ресурсов (и кластер AKS), используя
az group deleteкоманду.az group delete --name $RESOURCE_GROUP --yes --no-wait
Дальнейшие действия
Дополнительные сведения о проверке подлинности AKS, авторизации, Kubernetes RBAC и Azure RBAC см. в следующем разделе: