Использование удостоверений, управляемых pod Microsoft Entra, в Служба Azure Kubernetes (предварительная версия)

Управляемые microsoft Entra pod удостоверения используют примитивы Kubernetes для связывания управляемых удостоверений для ресурсов и удостоверений Azure в идентификаторе Microsoft Entra с модулями pod. Администраторы создают удостоверения и привязки в качестве примитивов Kubernetes, которые позволяют pod получать доступ к ресурсам Azure, которые используют идентификатор Microsoft Entra в качестве поставщика удостоверений.

Внимание

Рекомендуется просмотреть Идентификация рабочей нагрузки Microsoft Entra. Этот метод проверки подлинности заменяет управляемое pod удостоверение (предварительная версия), которое интегрируется с собственными возможностями Kubernetes для федерации с любыми внешними поставщиками удостоверений от имени приложения.

Управляемое открытый код управляемое модулем Microsoft Entra pod (предварительная версия) в Служба Azure Kubernetes было устарело 10.24.2022, а проект был архивирован в сентябре 2023 года. Дополнительные сведения см. в уведомлении об отмене. Надстройка AKS Pod Identity Managed будет исправлена и поддерживается до сентября 2025 г., чтобы разрешить клиентам переход на Идентификация рабочей нагрузки Microsoft Entra

Чтобы отключить управляемую надстройку AKS, используйте следующую команду: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Подготовка к работе

Необходимо установить Azure CLI версии 2.20.0 или более поздней.

Ограничения

  • Для кластера разрешено не более 200 удостоверений, управляемых pod.
  • Для кластера разрешено не более 200 исключений управляемых pod удостоверений.
  • Управляемые модулем pod идентификаторы доступны только в пулах узлов Linux.
  • Эта функция поддерживается только для кластеров с поддержкой масштабируемых наборов виртуальных машин.

Установка расширения Azure CLI для aks-preview

Внимание

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

Чтобы установить расширение aks-preview, выполните следующую команду:

az extension add --name aks-preview

Выполните следующую команду, чтобы обновить до последней версии выпущенного расширения:

az extension update --name aks-preview

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

Зарегистрируйте флаг компонента EnablePodIdentityPreview, используя команду az feature register, как показано в указанном ниже примере.

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью команды az provider register:

az provider register --namespace Microsoft.ContainerService

Параметры режима работы

Управляемое удостоверение Microsoft Entra pod поддерживает два режима работы:

  • Стандартный режим: в этом режиме в кластере AKS развертываются следующие два компонента:
    • Контроллер управляемых удостоверений (MIC): контроллер Kubernetes, который следит за изменениями в pod, AzureIdentity и AzureIdentityBinding, через сервер API в Kubernetes. Когда контроллер обнаруживает соответствующее изменение, MIC за необходимости добавляет или удаляет AzureAssignedIdentity. В частности, при планировании модуля pod MIC назначает управляемое удостоверение в Azure базовому масштабируемом набору виртуальных машин, используемому пулом узлов во время этапа создания. При удалении всех модулей pod, использующих удостоверение, он удаляет удостоверение из масштабируемого набора виртуальных машин пула узлов, если только одно и то же управляемое удостоверение не используется другими модулями pod. Контроллер управляемых удостоверений выполняет аналогичные действия при создании или удалении AzureIdentity или AzureIdentityBinding.
    • Node Managed Identity (NMI): это pod, который работает как DaemonSet на каждом узле кластера AKS. NMI перехватывает запросы маркера безопасности службе метаданных экземпляра Azure на каждом узле, перенаправляет их на себя и проверяет, имеет ли модуль pod доступ к идентификатору, запрашивая маркер и извлекает маркер из клиента Microsoft Entra от имени приложения.
  • Управляемый режим: в этом режиме есть только NMI. При установке с помощью надстройки кластера AKS Azure управляет созданием примитивов Kubernetes (AzureIdentity и AzureIdentityBinding) и назначением удостоверений в ответ на выполняемые пользователем команды CLI. В противном случае, если установка выполнена через диаграмму Helm, удостоверение должно назначаться и управляться пользователем вручную. Дополнительные сведения см. в статье Удостоверение pod в управляемом режиме.

При установке управляемого удостоверений Microsoft Entra pod с помощью диаграммы Helm или манифеста YAML, как показано в руководстве по установке, можно выбрать между режимом и managed режимомstandard. Если вы решили установить управляемое модулем Microsoft Entra pod с помощью надстройки кластера AKS, как показано в этой статье, программа установки будет использовать managed режим.

Создание кластера Службы Azure Kubernetes с помощью Azure CNI

Примечание.

Это рекомендуемая конфигурация по умолчанию

Создание кластера AKS с включенными Azure CNI и управляемым модулем pod идентификатором. Ниже команда az group create используется для создания группы ресурсов с именем myResourceGroup и команда az aks create для создания кластера AKS с именем myAKSCluster в группе ресурсов myResourceGroup.

az group create --name myResourceGroup --location eastus
az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-pod-identity \
    --network-plugin azure \
    --generate-ssh-keys

Для входа в кластер AKS используйте команду az-aks-get-credentials. Эта команда также загружает и настраивает сертификат клиента kubectl на компьютере разработки.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Примечание.

При включении идентификатора, управляемого модулем pod, в кластере AKS в пространство имен kube-system добавляется AzurePodIdentityException с именем aks-added-exception. AzurePodIdentityException позволяет модулям pod с определенными метками получить доступ к конечной точке Службы метаданных экземпляров Azure (IMDS) без перехвата сервером NMI. Исключение aks-addon-exception позволяет сторонним надстройкам AKS, таким как управляемое удостоверением Microsoft Entra pod, работать без необходимости вручную настраивать AzurePodIdentityException. При необходимости можно добавлять, удалять и обновлять AzurePodIdentityException с помощью az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update или kubectl.

Обновление имеющегося кластера AKS с помощью Azure CNI

Обновите существующий кластер AKS с помощью Azure CNI, чтобы добавить идентификатор, управляемый модулем pod.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity

Использование подключаемого модуля сети Kubenet с удостоверениями, управляемыми microsoft Entra pod

Внимание

Запуск управляемого модулем Pod Microsoft Entra в кластере с Kubenet не является рекомендуемой конфигурацией из-за проблем безопасности. Конфигурация Kubenet по умолчанию не позволяет предотвратить ARP-спуфинг, который модуль pod может использовать, чтобы выдать себя за другой pod и получить доступ к удостоверению, которое ему не предназначено. Следуйте инструкциям по устранению рисков и настройте политики, прежде чем включить управляемое модулем Microsoft Entra pod в кластере с Kubenet.

Исправление

Чтобы снизить уязвимость на уровне кластера, можно использовать встроенную политику Azure "Контейнеры в кластере Kubernetes должны использовать только разрешенные возможности" для ограничения возможностей атаки CAP_NET_RAW.

Добавление NET_RAW в требуемые возможности удаления

  Изображение

Если вы не используете Политику Azure, можно использовать контроллер допуска OpenPolicyAgent, а также веб-перехватчик с проверкой Gatekeeper. Если Gatekeeper в кластере у вас уже установлен, добавьте ConstraintTemplate типа K8sPSPCapabilities:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

Добавьте шаблон, чтобы ограничить порождение модулей pod с помощью функции NET_RAW:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Создание кластера AKS с подключаемым модулем сети Kubenet

Создайте кластер AKS с включенными подключаемым модулем сети Kubenet и идентификатором, управляемым модулем pod.

az aks create \
    --resource-group $MY_RESOURCE_GROUP \
    --name $MY_CLUSTER \
    --enable-pod-identity \
    --enable-pod-identity-with-kubenet \
    --generate-ssh-keys

Обновление имеющегося кластера AKS с подключаемым модулем сети Kubenet

Обновите имеющийся кластер AKS с сетевым подключаемым модулем Kubenet, чтобы включить удостоверение, управляемое объектом pod.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Создание удостоверения

Внимание

У вас должны быть соответствующие разрешения (например, владелец) в вашей подписке, чтобы создать удостоверение.

Создайте удостоверение, которое будет использоваться демонстрационным модулем pod, с помощью команды az identity create и задайте переменные IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_ID.

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"

Назначьте разрешения для управляемого идентификатора

Управляемому удостоверению, которое будет назначено модулю pod, должны быть предоставлены разрешения, соответствующие действиям, которые он будет выполнять.

Чтобы запустить демонстрацию, у управляемого удостоверения IDENTITY_CLIENT_ID должны быть разрешения участника виртуальной машины в группе ресурсов, содержащей масштабируемый набор виртуальных машин кластера AKS.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Создание идентификатора Pod

Создайте управляемое pod удостоверение для кластера с помощью az aks pod-identity add.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

Примечание.

Значение POD_IDENTITY_NAME должно быть допустимым именем субдомена DNS по стандарту RFC 1123.

Примечание.

При назначении управляемого pod удостоверения с помощью pod-identity addAzure CLI пытается предоставить роль оператора управляемых удостоверений через управляемое pod удостоверение (IDENTITY_RESOURCE_ID) удостоверению кластера.

Azure создаст в кластере ресурс AzureIdentity, представляющий удостоверение в Azure, и ресурс AzureIdentityBinding, связывающий AzureIdentity с селектором. Эти ресурсы можно просмотреть с помощью следующих команд:

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

Запуск примера приложения

Для использования управляемого модулем pod Microsoft Entra необходимо метка aadpodidbinding со значением, соответствующим селектору из AzureIdentityBinding. По умолчанию селектор будет соответствовать имени управляемого pod удостоверения, но его также можно задать с помощью --binding-selector параметра при вызове az aks pod-identity add.

Чтобы запустить пример приложения с помощью управляемого модулем pod Microsoft Entra, создайте demo.yaml файл со следующим содержимым. Замените POD_IDENTITY_NAME, IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_GROUP значениями из предыдущих шагов. Замените SUBSCRIPTION-ID идентификатором своей подписки.

Примечание.

На предыдущих шагах вы создали переменные POD_IDENTITY_NAME, IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_GROUP. Можно использовать, например, команду echo, чтобы отобразить значение, например, заданное для переменных echo $POD_IDENTITY_NAME.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Обратите внимание, что определение pod имеет метку aadpodidbinding со значением, которое соответствует имени управляемого модуля pod удостоверения, запущенного az aks pod-identity add на предыдущем шаге.

Развертывание demo.yaml в том же пространстве имен, что и управляемое модулем pod с помощью kubectl apply:

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

С помощью kubectl logs убедитесь, что пример приложения успешно запущен.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Убедитесь, что в журналах показано, что маркер успешно получен, а операция GET выполнена.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

Запуск приложения с несколькими удостоверениями

Чтобы приложение использовало несколько удостоверений, укажите для --binding-selector тот же селектор, который использовался при создании удостоверений pod.

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

Затем задайте в поле aadpodidbinding манифеста YAML для модуля pod указанный селектор привязки.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

Отключение управляемого pod удостоверения в существующем кластере

Чтобы отключить управляемое pod удостоверение в существующем кластере, удалите удостоверения, управляемые pod, из кластера. Затем отключите функцию в кластере.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

Очистка

Чтобы удалить управляемое кластером удостоверение Microsoft Entra pod, удалите пример приложения и управляемое pod удостоверение из кластера. Затем удалите удостоверение и назначение ролей удостоверения кластера.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Следующие шаги

Дополнительные сведения об управляемых удостоверениях для ресурсов Azure см. в этой статье.