Контейнеры приложений Azure позволяет приложению безопасно хранить конфиденциальные значения конфигурации. После определения секретов на уровне приложения защищенные значения доступны для редакций в приложениях контейнеров. Кроме того, можно ссылаться на защищенные значения внутри правил масштабирования. Сведения об использовании секретов с Dapr см. в статье об интеграции Dapr.
- Секреты принадлежат приложению вне зависимости от конкретной версии приложения.
- Новые редакции не создаются путем добавления, удаления или изменения секретов.
- Каждая редакция приложения может ссылаться на один или несколько секретов.
- Несколько редакций могут ссылаться на одни и те же секреты.
Обновленный или удаленный секрет не влияет на существующие редакции в приложении. При обновлении или удалении секрета можно ответить на изменения одним из двух способов:
- Разверните новую ревизию.
- Перезапуск существующей редакции.
Перед удалением секрета разверните новую редакцию, которая больше не ссылается на старый секрет. Затем деактивируйте все редакции, ссылающиеся на секрет.
Определение секретов
Секреты определяются как набор пар имя/значение. Значение каждого секрета указывается непосредственно или в качестве ссылки на секрет, хранящийся в Azure Key Vault.
Замечание
Избегайте указания значения секрета непосредственно в рабочей среде. Вместо этого используйте ссылку на секрет, хранящийся в Azure Key Vault, как описано в разделе Store secret value in Container Apps.
Сохранение секретного значения в приложениях с контейнерами
При определении секретов на портале или с помощью различных параметров командной строки используется следующее.
Перейдите к приложению-контейнеру на портале Azure.
В разделе "Безопасность" выберите "Секреты".
Нажмите кнопку "Добавить".
В панели "Добавление секрета" введите следующие сведения:
-
Наименование: наименование секрета.
-
Тип: выберите секреты контейнерных приложений.
-
Значение: значение секретного ключа.
Нажмите кнопку "Добавить".
Секреты определяются на уровне приложения в resources.properties.configuration.secrets разделе.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
Здесь строка подключения к учетной записи хранилища очередей объявляется в массиве secrets. В этом примере вы замените <MY-CONNECTION-STRING-VALUE> значением вашей строки подключения.
При создании приложения-контейнера секреты определяются с помощью --secrets параметра.
- Параметр принимает разделенный пробелом набор пар name/value.
- Знак равенства (
=) разделяет каждую пару.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--secrets "queue-connection-string=<CONNECTION_STRING>"
Здесь в параметре --secrets объявляется строка подключения к учетной записи хранилища очередей. Замените <CONNECTION_STRING> значением вашей строки подключения.
При создании приложения-контейнера секреты определяются как один или несколько объектов Secret, передаваемых через ConfigurationSecrets параметр.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$TemplateObj = New-AzContainerAppTemplateObject -Name queuereader -Image demos/queuereader:v1
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$ContainerAppArgs = @{
Name = 'my-resource-group'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Здесь объявляется строка подключения к учетной записи хранилища очереди. Значение для queue-connection-string берётся из переменной среды с именем $QueueConnectionString.
Справочный секрет из Key Vault
При определении секрета создается ссылка на секрет, хранящийся в Azure Key Vault. Приложения-контейнеры автоматически извлекают значение секрета из Key Vault и делает его доступным в качестве секрета в приложении контейнера.
Чтобы ссылаться на секрет из Key Vault, сначала необходимо включить управляемое удостоверение (managed identity) в вашем приложении-контейнере и предоставить этому удостоверению доступ к секретам Key Vault.
Чтобы включить управляемое удостоверение в приложении-контейнере, см. раздел Управляемые удостоверения.
Чтобы предоставить доступ к секретам Key Vault, назначьте управляемому удостоверению роль Azure RBAC пользователь секретов Key Vault.
Перейдите к приложению-контейнеру на портале Azure.
В разделе "Безопасность " выберите "Удостоверение".
На вкладке "Назначено системой" установите Состояние в положение Вкл..
Замечание
Вы также можете использовать управляемое удостоверение, назначаемое пользователем, которое можно повторно использовать в нескольких ресурсах и сохраняется независимо от жизненного цикла приложения. Чтобы использовать его, выберите вкладку "Назначено пользователем" и выберите существующее удостоверение.
Нажмите кнопку "Сохранить", чтобы включить управляемое удостоверение, назначенное системой.
Появится всплывающее окно для подтверждения, что вы хотите включить управляемое удостоверение, назначенное системой, и зарегистрировать ваше контейнерное приложение в Microsoft Entra ID. Выберите Да.
В разделе "Безопасность" выберите "Секреты".
Нажмите кнопку "Добавить".
В панели "Добавление секрета" введите следующие сведения:
-
Наименование: наименование секрета.
-
Type: выберите ссылку на Key Vault.
-
URL секрета в Key Vault: URI вашего секрета в Key Vault. Этот универсальный код ресурса (URI) имеет следующую форму:
https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_ID>
-
Идентификатор: выберите системно назначенный.
Нажмите кнопку "Добавить".
Секреты определяются на уровне приложения в resources.properties.configuration.secrets разделе.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY_VAULT_SECRET_URI>",
"identity": "system"
}],
}
}
}
Здесь строка подключения к учетной записи хранилища очередей объявляется в массиве secrets. Его значение автоматически извлекается из Key Vault с помощью указанного удостоверения. Чтобы использовать управляемое удостоверение пользователя, замените system его идентификатором ресурса.
Замените <KEY_VAULT_SECRET_URI> на URI вашего секрета в Key Vault.
При создании приложения-контейнера секреты определяются с помощью --secrets параметра.
- Параметр принимает разделенный пробелом набор пар name/value.
- Знак равенства (
=) разделяет каждую пару.
- Чтобы указать ссылку Key Vault, используйте формат
<SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>. Например, queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourcegroups/my-resource-group/providers/Майкрософт.ManagedIdentity/userAssignedIdentities/my-identity.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>"
Здесь в параметре --secrets объявляется строка подключения к учетной записи хранилища очередей. Замените <KEY_VAULT_SECRET_URI> на URI вашего секрета в Key Vault. Замените <USER_ASSIGNED_IDENTITY_ID> идентификатором ресурса для удостоверения, назначенного пользователем.
Замечание
Назначенная пользователем идентичность должна иметь доступ к чтению секрета в Key Vault. Нельзя использовать назначенное системой удостоверение с командой create, так как оно недоступно до тех пор, пока не будет создано приложение контейнера.
Ссылки на секреты Key Vault не поддерживаются в PowerShell.
Key Vault URI секрета и смена секретов
URI секрета Key Vault должен находиться в одном из следующих форматов:
-
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931: ссылка на определенную версию секрета.
-
https://myvault.vault.azure.net/secrets/mysecret: ссылка на последнюю версию секрета.
Если версия не указана в URI, приложение использует последнюю версию, которая существует в хранилище ключей. Когда новые версии становятся доступными, приложение автоматически извлекает последнюю версию в течение 30 минут. Все активные ревизии, ссылающиеся на секрет в переменной среды, автоматически перезапускаются для получения нового значения.
Для полного управления версией секрета укажите версию в URI.
Ссылка на секреты в переменных среды
После объявления секретов на уровне приложения, как описано в разделе определения секретов , вы можете ссылаться на них в переменных среды при создании новой редакции в приложении контейнера. Если переменная среды ссылается на секрет, его значение заполняется значением, определенным в секрете.
Пример
В следующем примере показано приложение, которое объявляет строку подключения на уровне приложения. Это подключение упоминается в переменной среды в контейнере и используется в правиле масштабирования.
После определения секрета в приложении-контейнере вы можете ссылаться на него в переменной среды при создании новой редакции.
Перейдите к приложению-контейнеру на портале Azure.
В разделе "Приложение" выберите "Редакции" и "реплики".
На странице "Редакции и реплики" выберите "Создать новую редакцию".
На странице "Создание и развертывание новой редакции " на вкладке "Контейнер " в разделе "Образ контейнера " выберите контейнер.
Выберите Изменить.
В области редактирования контейнера выберите вкладку переменных среды.
Нажмите кнопку "Добавить".
Введите следующие сведения:
-
Имя: имя переменной среды.
-
Источник: выберите ссылку на секрет.
-
Значение. Выберите секрет, определенный ранее.
Нажмите кнопку "Сохранить".
На странице "Создание и развертывание новой редакции " выберите "Создать ", чтобы создать новую редакцию.
В этом примере строка подключения приложения объявляется как queue-connection-string и становится доступной в других секциях конфигурации.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": { ⬅️
"type": "String" ⬅️
} ⬅️
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-03-01",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [ ⬅️
{ ⬅️
"name": "queue-connection-string", ⬅️
"keyVaultUrl": "[parameters('key_vault_secret_uri')", ⬅️
"identity": "system" ⬅️
}] ⬅️
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"env": [
{
"name": "QueueName",
"value": "myqueue"
},
{
"name": "ConnectionString", ⬅️
"secretRef": "queue-connection-string" ⬅️
}
]
}
],
"scale": {
"minReplicas": 0,
"maxReplicas": 10,
"rules": [
{
"name": "myqueuerule",
"azureQueue": {
"queueName": "demoqueue",
"queueLength": 100,
"auth": [
{
"secretRef": "queue-connection-string", ⬅️
"triggerParameter": "connection" ⬅️
}
]
}
}
]
}
}
}
}]
}
Здесь переменная среды с именем connection-string получает значение из секрета уровня queue-connection-string приложения. Конфигурация проверки подлинности правила масштабирования Хранилище очередей Azure использует секрет queue-connection-string в качестве определения подключения.
Чтобы избежать сохранения секретных значений в системе управления исходным кодом при использовании шаблона ARM, передайте секретные значения в качестве параметров шаблона ARM.
В этом примере вы создадите приложение-контейнер с помощью Azure CLI с секретом, на который ссылается переменная среды. Чтобы ссылаться на секрет в переменной среды в Azure CLI, задайте для нее значение secretref:, а затем имя секрета.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
Здесь переменная среды с именем connection-string получает значение из секрета уровня queue-connection-string приложения.
Ссылки на секреты Key Vault не поддерживаются в PowerShell.
В этом примере вы создадите контейнер с помощью Azure PowerShell с секретом, на который ссылается переменная среды. Чтобы ссылаться на секрет в переменной среды в PowerShell, задайте для нее значение secretref:, за которым следует имя секрета.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$EnvVarObjQueue = New-AzContainerAppEnvironmentVarObject -Name QueueName -Value myqueue
$EnvVarObjConn = New-AzContainerAppEnvironmentVarObject -Name ConnectionString -SecretRef queue-connection-string -Value secretref
$TemplateObj = New-AzContainerAppTemplateObject -Name myQueueApp -Image demos/myQueueApp:v1 -Env $EnvVarObjQueue, $EnvVarObjConn
$ContainerAppArgs = @{
Name = 'myQueueApp'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Здесь переменная среды с именем ConnectionString получает значение из секрета уровня $QueueConnectionString приложения.
Монтирование секретов в томе
После объявления секретов на уровне приложения, как описано в разделе определения секретов , вы можете ссылаться на них в подключениях томов при создании новой редакции в приложении контейнера. При монтировании секретов в том каждый секрет монтируется в виде файла. Имя файла — это имя секрета, а содержимое файла — значение секрета. Вы можете загрузить все секреты в точку монтирования тома или загрузить определенные секреты.
Пример
После того как вы определили секрет в приложении-контейнере, вы можете ссылаться на него в точке монтирования тома при создании новой ревизии.
Перейдите к приложению-контейнеру на портале Azure.
В разделе "Приложение" выберите "Редакции" и "реплики".
На странице "Редакции и реплики" выберите "Создать новую редакцию".
На странице "Создание и развертывание новой редакции " на вкладке "Контейнер " в разделе "Образ контейнера " выберите контейнер.
Выберите Изменить.
В области редактирования контейнера выберите вкладку Точки монтирования.
Выберите "Создать новый том".
В контекстной панели Добавить том введите следующие сведения:
-
Тип тома: выберите
Secret.
-
Имя:
mysecrets
-
Монтирование всех секретов: включено
Замечание
Если вы хотите загрузить определенные секреты, отключите опцию Монтировать все секреты и выберите секреты, которые вы хотите загрузить.
Нажмите кнопку "Добавить".
В контекстной панели Редактировать контейнер, в разделе Имя тома, выберите mysecrets.
В разделе Точка монтирования введите /mnt/secrets.
Нажмите кнопку "Сохранить".
На странице "Создание и развертывание новой ревизии" выберите "Создать", чтобы создать новую ревизию с монтированием тома.
В этом примере два секрета объявляются на уровне приложения. Эти секреты размещены в томе с именем mysecrets, типа Secret. Том монтируется по пути /mnt/secrets. Затем приложение может ссылаться на секреты в точке монтирования тома.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": {
"type": "Securestring"
},
"api-key": {
"type": "Securestring"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-11-01-preview",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret"
}
]
}
}
}]
}
Чтобы загрузить определенные секреты и указать их пути в смонтированном томе, укажите секреты в secrets массиве объекта volume. В следующем примере показано, как загрузить только queue-connection-string секрет в монтаже тома mysecrets с именем файла connection-string.txt.
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret",
"secrets": [
{
"secretRef": "queue-connection-string",
"path": "connection-string.txt"
}
]
}
]
}
...
}
...
}
В приложении вы можете прочитать секрет из файла, расположенного по адресу /mnt/secrets/connection-string.txt.
В этом примере два секрета объявляются на уровне приложения. Эти секреты размещены в томе с именем mysecrets, типа Secret. Том монтируется по пути /mnt/secrets. Затем приложение может считывать секреты в виде файлов при монтировании тома.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
Чтобы загрузить определенные секреты и указать их пути в подключенном томе, определите приложение, используя YAML.
Подключение секретов в качестве тома не поддерживается в PowerShell.
Устранение неполадок ссылок на Key Vault
При обращении к секретам из Azure Key Vault могут возникнуть проблемы во время извлечения секрета или синхронизации. Ниже приведены распространенные ошибки и их решения:
| Error |
Причина |
Резолюция |
| Управляемое удостоверение не активировано |
Приложение-контейнер не назначает управляемое удостоверение. |
Включите управляемое удостоверение, назначаемое системой или назначаемое пользователем, в приложении контейнера. См. Управляемые удостоверения. |
| Идентификатор не найден |
Указанное управляемое удостоверение не существует или не назначено контейнерному приложению. |
Убедитесь, что удостоверение создано и назначено контейнерному приложению в разделе Identity. |
| Секрет отключен в Key Vault |
Секрет отключен в ресурсе Key Vault. |
Перейдите к Key Vault на портале Azure и включите секрет. |
| Сбой проверки подлинности |
Управляемое удостоверение не имеет необходимых разрешений для чтения секрета. |
Предоставьте роль Key Vault Secrets User управляемому удостоверению в вашем Key Vault. См. Key Vault Secrets User. |
| В разрешении RBAC отказано |
Управляемое удостоверение не имеет достаточных разрешений для доступа к хранилищу ключей. |
Проверьте назначение роли RBAC в Key Vault и убедитесь, что она включает разрешения на чтение секретов. |
Дальнейшие шаги