Поделиться через


Использование управляемых идентификаторов с экземплярами контейнеров Azure

Используйте управляемые удостоверения для ресурсов Azure, чтобы запускать код в экземплярах контейнеров Azure, которые взаимодействуют с другими службами Azure. Вам не нужно хранить секреты или учетные данные в коде. Эта функция предоставляет развертывание экземпляров контейнеров с автоматически управляемым удостоверением в идентификаторе Microsoft Entra.

В этой статье вы узнаете больше об управляемых удостоверениях в экземплярах контейнеров. Вы также:

  • Активируйте назначенную пользователем или системой идентификацию в группе контейнеров.
  • Предоставьте удостоверению доступ к хранилищу ключей Azure.
  • Используйте управляемое удостоверение для доступа к хранилищу ключей из запущенного контейнера.

Адаптируйте примеры для включения и использования удостоверений в экземплярах контейнеров для доступа к другим службам Azure. Это интерактивные примеры. На практике контейнерные образы будут запускать программный код для доступа к службам Azure.

Для чего нужны управляемые удостоверения?

Используйте управляемое удостоверение в работающем контейнере для проверки подлинности в любой службе, которая поддерживает проверку подлинности Microsoft Entra без управления учетными данными в коде контейнера. Для служб, не поддерживающих проверку подлинности Microsoft Entra, можно хранить секреты в хранилище ключей Azure и использовать управляемое удостоверение для доступа к хранилищу ключей для получения учетных данных. Дополнительные сведения об использовании управляемого удостоверения см. в статье "Что такое управляемые удостоверения для ресурсов Azure?".

Активировать управляемую идентификацию

При создании группы контейнеров включите одно или несколько управляемых идентификаций, задав свойство ContainerGroupIdentity. Вы также можете включить или обновить управляемые удостоверения после запуска группы контейнеров. Любое действие приводит к перезапуску группы контейнеров. Чтобы установить идентификаторы в новой или существующей группе контейнеров, используйте Azure CLI, шаблон Azure Resource Manager, файл YAML или другое средство Azure.

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

Используйте управляемое удостоверение

Чтобы использовать управляемое удостоверение, ему необходимо предоставить доступ к одному или нескольким ресурсам служб Azure (веб-приложение, хранилище ключей, учетная запись хранения и т. п.) в подписке. Использование управляемого удостоверения в работающем контейнере аналогично использованию удостоверения в виртуальной машине Azure. Дополнительные сведения см. в руководстве по использованию токена, Azure PowerShell или Azure CLI или пакетов SDK Azure.

Предварительные требования

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

Создание хранилища ключей Azure

В примерах в этой статье используется управляемое удостоверение в Container Instances для получения доступа к секрету в Azure Key Vault.

Для начала создайте группу ресурсов с именем myResourceGroup в регионе eastus с помощью следующей команды az group create:

az group create --name myResourceGroup --location eastus

Используйте команду az keyvault create, чтобы создать хранилище ключей. Обязательно укажите уникальное имя хранилища ключей.

az keyvault create \
  --name mykeyvault \
  --resource-group myResourceGroup \
  --location eastus

Сохраните пример секрета в хранилище ключей с помощью команды az keyvault secret set :

az keyvault secret set \
  --name SampleSecret \
  --value "Hello Container Instances" \
  --description ACIsecret --vault-name mykeyvault

Продолжайте использовать следующие примеры для доступа к хранилищу ключей с помощью управляемого удостоверения, назначаемого пользователем или назначаемого системой, в экземплярах контейнеров.

Пример 1. Использование удостоверения, назначаемого пользователем, для доступа к хранилищу ключей Azure

Создание идентичности

Сначала создайте удостоверение в подписке с помощью команды az identity create . Вы можете использовать ту же группу ресурсов, которая использовалась для создания хранилища ключей. Вы также можете использовать другой.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Чтобы применить это удостоверение на следующих шагах, выполните команду az identity show для сохранения идентификатора субъекта-службы и идентификатора ресурса в переменных.

# Get service principal ID of the user-assigned identity
SP_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
RESOURCE_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query id --output tsv)

Предоставьте назначенному пользователем удостоверению доступ к хранилищу ключей

Выполните команду az keyvault set-policy для настройки политики доступа к хранилищу ключей. В следующем примере пользовательское удостоверение может получать секреты из хранилища ключей.

 az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $SP_ID \
    --secret-permissions get

Включите пользовательское удостоверение для группы контейнеров

Выполните команду az container create, чтобы создать экземпляр контейнера на основе образа Microsoft azure-cli. В этом примере представлена одна группа контейнеров, которую можно использовать в интерактивном режиме для запуска Azure CLI для доступа к другим службам Azure. В этом разделе используется только базовая операционная система. Чтобы ознакомиться с примером использования интерфейса командной строки Azure в контейнере, см. раздел Применение к группе контейнеров удостоверения, назначаемого системой.

Параметр --assign-identity передает группе пользовательскую управляемую идентификацию. Команда длительного выполнения обеспечивает работу контейнера. В этом примере используется та же группа ресурсов, которая использовалась для создания хранилища ключей, но можно указать другую.

az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity $RESOURCE_ID \
  --command-line "tail -f /dev/null"

Через несколько секунд вы получите ответ из Azure CLI, указывающий, что развертывание завершено. Проверьте состояние с помощью команды az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

Раздел identity в выходных данных выглядит примерно так, как в следующем примере, который показывает, что идентификатор задан в группе контейнеров. principalID под userAssignedIdentities представляет собой служебный принципал созданной вами в Microsoft Entra ID сущности.

[...]
"identity": {
    "principalId": "null",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
      }
    }
  },
[...]

Использование назначаемого пользователем удостоверения для получения секрета из хранилища ключей

Теперь вы можете применить управляемое удостоверение в запущенном экземпляре контейнера для доступа к хранилищу ключей. Сначала откройте оболочку Bash в контейнере:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Выполните следующие команды в оболочке Bash в контейнере. Чтобы получить маркер доступа для использования идентификатора Microsoft Entra для проверки подлинности в хранилище ключей, выполните следующую команду:

client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s

Выходные данные:

{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}

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

TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')

Теперь используйте токен доступа для аутентификации в хранилище ключей и для чтения секрета. Не забудьте подставить имя хранилища ключей в URL-адрес (https://mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"

Ответ выглядит примерно так, как показано в следующем примере, где показан секрет. В коде вы анализируете эти выходные данные, чтобы получить секрет. Далее этот секрет применяется в последующих операциях для доступа к другому ресурсу Azure.

{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}

Пример 2. Использование назначаемого системой удостоверения для доступа к хранилищу ключей Azure

Включение системы назначенной идентичности для группы контейнеров

Выполните команду az container create, чтобы создать экземпляр контейнера на основе образа Microsoft azure-cli. В этом примере представлена одна группа контейнеров, которую можно использовать в интерактивном режиме для запуска Azure CLI для доступа к другим службам Azure.

Параметр --assign-identity без другого значения включает управляемое удостоверение, назначаемое системой, в группе. Область действия удостоверения ограничена группой ресурсов группы контейнеров. Команда длительного выполнения обеспечивает работу контейнера. В этом примере используется та же группа ресурсов, которая использовалась для создания хранилища ключей, которое находится в области идентичности.

# Get the resource ID of the resource group
RG_ID=$(az group show --name myResourceGroup --query id --output tsv)

# Create container group with system-managed identity
az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity --scope $RG_ID \
  --command-line "tail -f /dev/null"

Через несколько секунд вы получите ответ из Azure CLI, указывающий, что развертывание завершено. Проверьте состояние с помощью команды az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

Раздел identity в выходных данных выглядит примерно так, как показано в следующем примере, в котором показано, что удостоверение, назначаемое системой, создается в идентификаторе Microsoft Entra:

[...]
"identity": {
    "principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

Задайте для переменной значение principalId (идентификатор основного объекта службы) удостоверения, которое используется на следующих шагах.

SP_ID=$(az container show \
  --resource-group myResourceGroup \
  --name mycontainer \
  --query identity.principalId --out tsv)

Предоставление группе контейнеров доступа к хранилищу ключей

Выполните команду az keyvault set-policy для настройки политики доступа к хранилищу ключей. В следующем примере управляемому системой удостоверению предоставляется доступ для получения секретов из хранилища ключей:

 az keyvault set-policy \
   --name mykeyvault \
   --resource-group myResourceGroup \
   --object-id $SP_ID \
   --secret-permissions get

Используйте удостоверение группы контейнеров для получения секрета из хранилища ключей

Теперь вы можете применить управляемое удостоверение для доступа к хранилищу ключей из запущенного экземпляра контейнера. Сначала откройте оболочку Bash в контейнере:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Выполните следующие команды в оболочке Bash в контейнере. Сначала войдите в Azure CLI с помощью управляемого удостоверения:

az login --identity

В работающем контейнере извлеките секрет из хранилища ключей:

az keyvault secret show \
  --name SampleSecret \
  --vault-name mykeyvault --query value

Полученное значение секрета:

"Hello Container Instances"

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

Чтобы включить управляемое удостоверение в группе контейнеров с помощью шаблона Resource Manager, установите свойство identity объекта Microsoft.ContainerInstance/containerGroups с помощью объекта ContainerGroupIdentity. В следующих фрагментах кода показана настройка свойства identity для разных сценариев. Дополнительные сведения см. в справочнике по шаблону Resource Manager. Укажите минимум apiVersion из 2018-10-01.

Назначенное пользователем удостоверение

Назначаемая пользователем идентичность – это идентификатор ресурса следующей формы:

"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"

Вы можете указать одно или несколько назначаемых пользователем удостоверений.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }

Назначаемый системой идентификатор

"identity": {
    "type": "SystemAssigned"
    }

Удостоверения, назначаемые системой и пользователем

В группе контейнеров вы можете включить как системное удостоверение, так и одно или несколько пользовательских удостоверений.

"identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }
...

Включите управляемое удостоверение с помощью YAML-файла

Чтобы включить управляемое удостоверение в группе контейнеров, развернутой с помощью YAML-файла, используйте следующий YAML. Укажите минимум apiVersion из 2018-10-01.

Назначенное пользователем удостоверение

Учетная запись, назначаемая пользователем, — это идентификатор ресурса следующей формы:

'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'

Вы можете указать одно или несколько назначаемых пользователем удостоверений.

identity:
  type: UserAssigned
  userAssignedIdentities:
    {'myResourceID1':{}}

Назначаемый системой идентификатор

identity:
  type: SystemAssigned

Системные и пользовательские идентичности

В группе контейнеров вы можете включить как системное удостоверение, так и одно или несколько пользовательских удостоверений.

identity:
  type: SystemAssigned, UserAssigned
  userAssignedIdentities:
   {'myResourceID1':{}}

Управляемая идентификация в контейнерах Windows

Управляемое удостоверение в группах контейнеров Windows функционирует по-другому, чем в группах контейнеров Linux. Для контейнеров Windows сервер метаданных (169.254.169.254) недоступен для получения токена Microsoft Entra ID. Клиенты могут следовать другому шаблону, чтобы получить маркер доступа в контейнерах Windows. Шаблон включает отправку запроса маркера IDENTITY_ENDPOINT наряду с другими сведениями, такими как идентификатор субъекта и секретный код. Переменные IDENTITY_ENDPOINT и IDENTITY_HEADER внедряются в качестве переменных среды в контейнере.

curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%

Пример скрипта Azure PowerShell:

identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "aaaaaaaa-bbbb-cccc-1111-222222222222"
 
Invoke-RestMethod -Uri "$identityEndpoint" `
    -Method Get `
    -Headers @{secret = $identityHeader} `
    -Body @{resource = $resource; principalId = $principalId} `
    -ContentType "application/x-www-form-urlencoded"

Модуль az login и другие клиентские библиотеки, зависящие от сервера метаданных (169.254.169.254), не работают в контейнере Windows. Контейнеры Windows в виртуальной сети не могут подключаться к конечной точке. В результате токен управляемой идентичности невозможно создать в контейнере виртуальной сети Windows.