Защита параметров

Завершено

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

Совет

Лучше всего вовсе не использовать учетные данные. Управляемые удостоверения для ресурсов Azure позволяют компонентам вашего решения безопасно обмениваться данными друг с другом без учетных данных. Управляемые удостоверения доступны не для всех ресурсов, но мы рекомендуем использовать их везде, где это возможно. В противном случае вы можете использовать подходы, описанные здесь.

Примечание.

Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.

Определение безопасных параметров

Вы можете применить декоратор @secure к параметрам объектов или строк, которые могут содержать секретные значения. Когда вы определяете параметр как @secure, в Azure такие значения параметров не будут доступны в журналах развертывания. Кроме того, когда вы создаете развертывание в интерактивном режиме с помощью Azure CLI или Azure PowerShell и вам нужно ввести значения во время развертывания, терминал не будет отображать текст на экране.

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

@secure()
param sqlServerAdministratorLogin string

@secure()
param sqlServerAdministratorPassword string

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

Совет

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

Старайтесь не использовать файлы параметров для секретов

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

Интеграция с Azure Key Vault

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

Эту возможность можно использовать, создав в файле параметров ссылку на хранилище ключей и секрет. Таким образом можно избежать разглашения значения, поскольку вы ссылаетесь только на его идентификатор, который сам по себе не является каким-либо секретом. При развертывании шаблона Azure Resource Manager обратится к хранилищу ключей и извлечет данные.

Совет

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

Diagram that shows a parameter file reference Azure Key Vault and pass secret to Bicep template to deploy Azure resources.

Ниже приведен файл параметров, в котором для поиска имени для входа и пароля администратора логического сервера SQL используются ссылки Key Vault:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "sqlServerAdministratorLogin": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLogin"
      }
    },
    "sqlServerAdministratorPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLoginPassword"
      }
    }
  }
}

Обратите внимание, что вместо указания объекта value для каждого из параметров этот файл предоставляет объект reference, содержащий сведения о хранилище ключей и секрете.

Важно!

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

Использование Key Vault с модулями

Модули позволяют создавать многократно используемые файлы Bicep, которые инкапсулируют набор ресурсов. Обычно модули используются для развертывания частей решения. Они могут иметь параметры, которые позволяют принимать секретные значения, поэтому вы можете использовать интеграцию Key Vault Bicep для безопасного предоставления этих значений. Ниже приведен пример файла Bicep, который развертывает модуль и предоставляет значение параметра секрета ApiKey, принимая его непосредственно из Key Vault:

resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = {
  name: keyVaultName
}

module applicationModule 'application.bicep' = {
  name: 'application-module'
  params: {
    apiKey: keyVault.getSecret('ApiKey')
  }
}

Обратите внимание, что в этом файле Bicep ресурс Key Vault ссылается с помощью existing ключевое слово. Ключевое слово сообщает Bicep, что Key Vault уже существует, и этот код является ссылкой на это хранилище. Следовательно, Bicep не будет повторно развертывать его. Кроме того, обратите внимание, что код модуля использует getSecret() функцию в значении параметра модуля apiKey . Это специальная функция Bicep, которую можно использовать только с безопасными параметрами модуля. Внутри этого выражения Bicep преобразуется в ту же ссылку Key Vault, о чем вы узнали ранее.