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

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

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

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

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

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

Управляемое удостоверение в запущенном контейнере можно использовать для проверки подлинности в любой службе, которая поддерживает проверку подлинности Azure AD, без необходимости управлять учетными данными в коде. Для служб, которые не поддерживают проверку подлинности 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
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
resourceID=$(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 $spID \
    --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 $resourceID \
  --command-line "tail -f /dev/null"

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

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

Раздел identity в выходных данных выглядит примерно так, как показано ниже, и подтверждает, что удостоверение настроено в группе контейнеров. Параметр principalID под userAssignedIdentities обозначает субъект-службу удостоверения, которое вы создали в Azure Active Directory:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/xxxxxxxx-0903-4b79-a55a-xxxxxxxxxxxx/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx",
        "principalId": "xxxxxxxx-f25b-4895-b828-xxxxxxxxxxxx"
      }
    }
  },
[...]

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

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

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

Выполните приведенные ниже команды в этой оболочке bash в контейнере. Чтобы получить маркер доступа, позволяющий использовать Azure Active Directory для проверки подлинности в хранилище ключей, выполните следующую команду:

client_id="xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx"
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=2016-10-01 -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
rgID=$(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 $rgID \
  --command-line "tail -f /dev/null"

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

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

Раздел identity в выходных данных выглядит примерно так, как показано ниже, и подтверждает создание назначаемого системой удостоверения в Azure Active Directory:

[...]
"identity": {
    "principalId": "xxxxxxxx-528d-7083-b74c-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

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

spID=$(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 $spID \
   --secret-permissions get

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

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

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

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

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": "System Assigned, 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':{}}

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

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

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