Использование управляемых удостоверений для службы "Экземпляры контейнеров Azure"

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

Из этой статьи вы узнаете, как использовать управляемые удостоверения в службе "Экземпляры контейнеров Azure" и выполнять следующие действия:

  • применение к группе контейнеров удостоверения, назначаемого пользователем или системой;
  • предоставление удостоверению доступа к Azure Key Vault;
  • применение управляемого удостоверения для доступа к хранилищу ключей из запущенного контейнера.

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

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

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

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

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

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

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

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

Необходимые компоненты

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

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

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

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

Для начала создайте группу ресурсов с именем 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

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

Пример 1. Использование назначаемого пользователем удостоверения для доступа к Azure Key Vault

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

Первым делом создайте в подписке удостоверение, используя команду 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 для доступа к другим службам 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 в выходных данных выглядит примерно так, как показано ниже, и подтверждает, что удостоверение настроено в группе контейнеров. userAssignedIdentities Ниже principalID приведен субъект-служба удостоверения, созданного в идентификаторе Microsoft Entra:

[...]
"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 Key Vault

Применение к группе контейнеров удостоверения, назначаемого системой

Выполните команду az container create, чтобы создать экземпляр контейнера на основе образа Microsoft azure-cli. В этом примере создается группа с одним контейнером, которая позволяет интерактивно запустить интерфейс командной строки Azure для доступа к другим службам 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 ID:

[...]
"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. Клиенты могут следовать другому шаблону, чтобы получить маркер доступа в контейнерах 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%

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

identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
 
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.

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

Из этой статьи вы узнали, как использовать управляемые удостоверения в службе "Экземпляры контейнеров Azure" и выполнять следующие действия:

  • применение к группе контейнеров удостоверения, назначаемого пользователем или системой;
  • предоставление удостоверению доступа к Azure Key Vault;
  • применение управляемого удостоверения для доступа к хранилищу ключей из запущенного контейнера.