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


Использование Azure Key Vault для передачи секрета в качестве параметра во время развертывания Bicep

В этой статье объясняется, как использовать Azure Key Vault для передачи секрета в качестве параметра во время развертывания Bicep. Вместо ввода безопасного значения, например пароля непосредственно в файл Bicep или файл параметров, можно получить значение из Azure Key Vault во время развертывания.

Когда модуль ожидает, что строковый параметр с примененным модификатором secure:true можно использовать getSecret функцию для получения секрета хранилища ключей. Вы не предоставляете значение, так как ссылаетесь только на его идентификатор хранилища ключей.

Внимание

В этой статье основное внимание уделяется передаче конфиденциального значения в качестве параметра шаблона. При передаче секрета в качестве параметра хранилище ключей может существовать в другой подписке, отличной от группы ресурсов, в которой выполняется развертывание.

В этой статье не описывается, как задать свойство виртуальной машины URL-адрес сертификата в хранилище ключей. Шаблон краткого руководства по данному сценарию см. в статье WinRM на виртуальной машине Windows.

Развертывание хранилищ 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

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

Предоставление доступа к секретам

Пользователь, развертывающий файл Bicep, должен иметь разрешение Microsoft.KeyVault/vaults/deploy/action для области группы ресурсов и хранилища ключей. Оно имеется у ролей Владелец и Участник. Если вы создали хранилище ключей, вы являетесь владельцем и имеете такое разрешение.

В следующей процедуре показано, как создать роль с минимальным разрешением и как назначить пользователя:

  1. Создайте пользовательский 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" на идентификатор подписки.

  2. Используйте 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'
  }
}

Параметр 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"