Использование Azure Key Vault для передачи защищенного значения параметра во время развертывания Bicep
Вместо того чтобы поместить безопасное значение (например, пароль) непосредственно в файл Bicep или файл параметров, можно получить значение из Azure Key Vault во время развертывания. Если модуль принимает параметр string
с модификатором secure:true
, для получения секрета хранилища ключей можно использовать функцию getSecret. Это значение никогда не будет раскрыто, так как указывается только его идентификатор в хранилище ключей.
Внимание
В этой статье основное внимание уделяется передаче конфиденциального значения в качестве параметра шаблона. Когда секрет передается в качестве параметра, хранилище ключей и группа ресурсов, в которую выполняется развертывание, могут находиться в разных подписках.
В статье не рассматривается настройка свойства виртуальной машины для URL-адреса сертификата в хранилище ключей. Шаблон быстрого запуска такого сценария описан в статье Установка сертификата на виртуальной машине из хранилища ключей Azure.
Развертывание хранилищ Key Vault и секретов
Чтобы получить доступ к хранилищу ключей во время развертывания Bicep, задайте для enabledForTemplateDeployment
хранилища ключей значение true
.
Если у вас уже есть хранилище ключей, убедитесь, что в нем разрешено развертывание шаблонов.
az keyvault update --name ExampleVault --enabled-for-template-deployment true
Чтобы создать новое хранилище ключей и добавить секрет, используйте следующее.
az group create --name ExampleGroup --location centralus
az keyvault create \
--name ExampleVault \
--resource-group ExampleGroup \
--location centralus \
--enabled-for-template-deployment true
az keyvault secret set --vault-name ExampleVault --name "ExamplePassword" --value "hVFkk965BuUv"
В качестве владельца хранилища ключей вы автоматически имеете возможность создания секретов. Если пользователь, работающий с секретными кодами, не является владельцем хранилища ключей, предоставьте доступ с помощью:
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Дополнительные сведения о создании хранилищ ключей и добавлении секретных кодов представлены в следующих статьях:
- Краткое руководство. Настройка и получение секрета из Azure Key Vault с помощью Azure CLI
- Настройка и получение секретных кодов с помощью PowerShell
- Краткое руководство. Настройка и получение секрета из Azure Key Vault с помощью портала Azure
- Краткое руководство. Настройка и получение секрета из Azure Key Vault с помощью веб-приложения .NET
- Краткое руководство. Настройка и получение секрета из Azure Key Vault с помощью веб-приложения Node
Предоставление доступа к секретам
Пользователь, развертывающий файл Bicep, должен иметь разрешение Microsoft.KeyVault/vaults/deploy/action
для области группы ресурсов и хранилища ключей. Оно имеется у ролей Владелец и Участник. Если вы создали хранилище ключей, вы являетесь владельцем и имеете такое разрешение.
Ниже показано, как создать роль с минимальным разрешением и назначить пользователя
Создание JSON-файла определения пользовательской роли
{ "Name": "Key Vault Bicep deployment operator", "IsCustom": true, "Description": "Lets you deploy a Bicep file with the access to the secrets in the Key Vault.", "Actions": [ "Microsoft.KeyVault/vaults/deploy/action" ], "NotActions": [], "DataActions": [], "NotDataActions": [], "AssignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" ] }
Замените "00000000-0000-0000-0000-000000000000" на идентификатор подписки.
Создание новой роли с помощью JSON-файла:
az role definition create --role-definition "<path-to-role-file>" az role assignment create \ --role "Key Vault Bicep deployment operator" \ --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \ --assignee <user-principal-name>
В этих примерах роль назначается пользователю на уровне группы ресурсов.
При использовании хранилища ключей с файлом Bicep для управляемого приложения необходимо предоставить доступ к субъекту-службе Поставщик ресурсов устройств. Дополнительные сведения см. в статье Доступ к секрету Key Vault при развертывании Управляемых приложений Azure.
Получение секретов в файле Bicep
Функцию getSecret в файлах Bicep можно использовать для получения секрета хранилища ключей. Обратите внимание, что getSecret
функция применяется исключительно к ресурсу Microsoft.KeyVault/vaults
. Кроме того, он ограничен использованием в params
разделе модуля и может использоваться только с параметрами с декоратором @secure()
.
Для получения секретов хранилища ключей можно использовать другую функцию, называемую az.getSecret()
функцией, в файлах параметров Bicep. Дополнительные сведения см. в разделе "Получение секретов" в файле параметров.
getSecret
Так как функция может использоваться только в params
разделе модуля. Создадим sql.bicep в том же каталоге, что и файл main.bicep со следующим содержимым:
param sqlServerName string
param location string = resourceGroup().location
param adminLogin string
@secure()
param adminPassword string
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
Обратите внимание, что в предыдущем Bicep-файле параметр adminPassword
имеет @secure()
декоратор.
Следующий файл Bicep использует sql.bicep в качестве модуля. Файл Bicep ссылается на существующее хранилище ключей и вызывает функцию getSecret
для получения секрета хранилища ключей, а затем передает значение в качестве параметра в модуль.
param sqlServerName string
param adminLogin string
param subscriptionId string
param kvResourceGroup string
param kvName string
resource kv 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
name: kvName
scope: resourceGroup(subscriptionId, kvResourceGroup )
}
module sql './sql.bicep' = {
name: 'deploySQL'
params: {
sqlServerName: sqlServerName
adminLogin: adminLogin
adminPassword: kv.getSecret('vmAdminPassword')
}
}
Получение секретов в файле параметров
Если вы не хотите использовать модуль, вы можете получить секреты хранилища ключей в файле параметров. Однако подход зависит от того, используется ли файл параметров JSON или файл параметров Bicep.
Следующий файл Bicep развертывает сервер SQL, который содержит пароль администратора. В качестве параметра пароля задается защищенная строка. Но Bicep не указывает, откуда берется это значение.
param sqlServerName string
param location string = resourceGroup().location
param adminLogin string
@secure()
param adminPassword string
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
Теперь создайте файл параметров для предыдущего файла Bicep.
Файл параметров Bicep
az.getSecret
функцию можно использовать в .bicepparam
файле для получения значения секрета из хранилища ключей.
using './main.bicep'
param sqlServerName = '<your-server-name>'
param adminLogin = '<your-admin-login>'
param adminPassword = az.getSecret('<subscription-id>', '<rg-name>', '<key-vault-name>', '<secret-name>', '<secret-version>')
ФАЙЛ параметров JSON
В файле параметров JSON укажите параметр, соответствующий имени параметра в Bicep-файле. Для значения параметра используйте ссылку на секрет из хранилища ключей. Для ссылки на секретный код необходимо передать идентификатор ресурса хранилища ключей и имя секрета.
В следующем файле параметров секрет хранилища ключей уже должен существовать, и вы предоставляете статическое значение для его идентификатора ресурса.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminLogin": {
"value": "<your-admin-login>"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>"
},
"secretName": "ExamplePassword"
}
},
"sqlServerName": {
"value": "<your-server-name>"
}
}
}
Если необходимо использовать версию секрета, отличную от текущей, включите свойство secretVersion
.
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Следующие шаги
- Дополнительные сведения о хранилищах ключей см. в статье Что такое хранилище ключей Azure?
- Полные примеры использования ссылок на секреты ключей приведены на этой странице сайта GitHub.
- Описание модуля Microsoft Learn, который охватывает передачу безопасного значения из хранилища ключей, см. Управление сложными облачными развертываниями с помощью расширенных функций шаблонов ARM.