Использование управляемых модулями pod идентификаторов Azure Active Directory в Службе Azure Kubernetes (предварительная версия)

Удостоверения Azure Active Directory (Azure AD), управляемые модулем pod, используют примитивы Kubernetes для связывания управляемых удостоверений для ресурсов Azure и удостоверений в Azure AD с модулями pod. Администраторы создают удостоверения и привязки в виде примитивов Kubernetes, которые позволяют модулям pod получать доступ к ресурсам Azure, использующим Azure AD в качестве поставщика удостоверений.

Примечание

Функция, описанная в этом документе — удостоверения, управляемые объектом pod (предварительная версия), — будет заменена на удостоверения рабочих нагрузок Azure AD.

Важно!

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

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

Нужно установить следующие ресурсы:

  • Azure CLI 2.20.0 или более поздней версии.
  • Расширение aks-preview версии 0.5.5 или более поздней.

Ограничения

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

Зарегистрируйте EnablePodIdentityPreview.

Зарегистрируйте компонент EnablePodIdentityPreview:

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

Установите Azure CLI aks-preview.

Вам также понадобиться расширение Azure CLI aks-preview версии 0.5.5 или более поздней. Установите расширение aks-preview для Azure CLI, используя команду az extension add. Или установите все доступные обновления с помощью команды az extension update.

# Install the aks-preview extension
az extension add --name aks-preview

# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

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

Удостоверение pod Azure AD поддерживает два режима работы:

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

При установке удостоверения pod Azure AD с помощью диаграммы Helm или манифеста YAML, как показано в руководстве по установке, вы можете выбирать между режимами standard и managed. Если вместо этого вы решите установить удостоверение модуля pod Azure AD с помощью надстройки кластера 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 -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

Для входа в кластер 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-add-exception позволяет выполнять основные надстройки AKS, такие как идентификатор, управляемый Azure AD, без необходимости ручной настройки 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 -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

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

Важно!

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

Меры по снижению риска

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

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

image

Если вы не используете Политику 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 -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

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

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

az aks update -g $MY_RESOURCE_GROUP -n $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 -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

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

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

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

NODE_GROUP=$(az aks show -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)
NODES_RESOURCE_ID=$(az group show -n $NODE_GROUP -o tsv --query "id")
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 add, интерфейс командной строки пытается предоставить удостоверению кластера роль "Оператор управляемых удостоверений" через удостоверение pod (IDENTITY_RESOURCE_ID).

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

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

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

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

Чтобы запустить пример приложения с помощью идентификатора, управляемого AAD, создайте файл 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
...

Очистка

Чтобы удалить удостоверение Azure AD, управляемое 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 -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}

Дальнейшие шаги

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