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


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

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

Из этой статьи вы узнаете, как использовать управляемые удостоверения в службе "Экземпляры контейнеров 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 Container Instances для доступа к секрету ключевого хранилища 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 Container Instances.

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

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 ID. Клиенты могут следовать другому шаблону, чтобы получить маркер доступа в контейнерах Windows. Шаблон включает отправку запроса токена на конечную точку идентификации вместе с дополнительной информацией, такой как идентификатор принципала и секрет, как показано ниже. 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;
  • Использование управляемого удостоверения для доступа к хранилищу ключей из работающего контейнера.