Управление секретами в шаблоне ARM путем чтения из Azure Key Vault

Завершено

Инфраструктура как код (IaC) — это описание требований к инфраструктуре в виде текстовых файлов, доступных для человека. Шаблоны Azure Resource Manager (ARM) являются формой IaC.

Как и в случае с кодом приложения, вы можете управлять кодом инфраструктуры в системе управления версиями, такой как Git. Это позволяет совместно работать с другими пользователями и отслеживать изменения требований к инфраструктуре по мере их развития.

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

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

Azure Key Vault помогает защитить конфиденциальную информацию

Azure Key Vault — это облачная служба, которая работает как защищенное хранилище секретов. Key Vault позволяет создать несколько безопасных контейнеров, называемых хранилищами. Эти хранилища поддерживают аппаратные модули безопасности (HSM). Хранилища позволяют уменьшить вероятность случайной потери информации о безопасности путем централизации хранения секретов приложений. Хранилища также контролируют и регистрируют доступ ко всему, что в них хранится.

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

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

  • Разрешение пользователей и приложений. Хранилище ключей можно настроить таким образом, чтобы как конкретные пользователи, так и приложения могли получать доступ к хранилищу. Для приложений создается субъект-служба. На самом деле хранилище ключей можно настроить так, чтобы доступ к ней имели только субъекты-службы.

    Примечание.

    Субъект-служба — это удостоверение, созданное для использования с приложениями, размещенными службами и автоматизированными инструментами для доступа к ресурсам Azure. Доступ к ресурсам ограничивается только путем назначения участнику роли или подмножества ролей с ограниченными правами доступа. Такой подход обеспечивает более детализированный контроль над тем, что и как может получать доступ к ресурсам.

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

Настройка разрешений

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

Чтобы во время развертывания можно было прочитать данные, необходимо выполнить несколько действий для настройки Key Vault. Вот что нужно сделать:

  1. Подготовка Key Vault для развертывания. В Key Vault необходимо разрешить чтение данных во время развертывания. Этот параметр можно передать во время создания хранилища или добавить его позже.

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

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

Настройка Key Vault для развертывания

Настройте экземпляр Key Vault таким образом, чтобы во время развертывания шаблона ARM можно было считывать из хранилища учетные данные.

Чтобы активировать Key Vault для развертывания, можно указать параметр, который может быть передан при создании экземпляра Key Vault, или добавить его позже. В PowerShell это переключатель -EnabledForTemplateDeployment. В Azure CLI это аргумент с именем --enabled-for-template-deployment, для которого требуется передать значение true.

Примечание.

Azure CLI дополнительно требуется передать логический параметр со значением true.

Пользователю требуется разрешение на развертывание для Key Vault и группы ресурсов

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

  • Owner: если вы создали хранилище ключей, вы автоматически используете эту роль.
  • Contributor: эта роль предоставляет доступ для управления всеми секретами. Если вы не создавали хранилище ключей, проще всего предоставить роль Contributor.

Другой вариант — создать и назначить настраиваемую роль и убедиться, что роль содержит разрешение Microsoft.KeyVault/vaults/deploy/action.

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

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

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

Примечание.

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

Настройка хранилища ключей и секрета для параметра

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

"myPassword" : {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
      "secretName": "databaseSecret"
    }
  }
}

В приведенном выше коде JSON вы указываете полный идентификатор хранилища ключей, и далее мы перейдем к запросу секрета databaseSecret. Затем значение этого секрета извлекается и назначается параметру myPassword.

Назначение параметру пароля ресурса

Этот шаг не относится к хранилищу ключей. Однако он обеспечивает использование параметра, настроенного для считывания значения секрета из хранилища ключей. Ниже показан сокращенный фрагмент кода в файле шаблона из виртуальной машины, который считывает элемент adminPassword из параметра myPassword. Далее значение секрета будет считано из хранилища ключей во время развертывания и назначено элементу adminPassword.

{
  "osProfile": {
    "adminPassword": "[parameters('myPassword')]"
  }
}