Автоматизация смены секретов для ресурсов с двумя наборами учетных данных для аутентификации

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

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

Примечание.

Для служб учетных записей служба хранилища рекомендуется использовать идентификатор Microsoft Entra для авторизации запросов. Дополнительные сведения см. в разделе "Авторизация доступа к BLOB-объектам" с помощью идентификатора Microsoft Entra. Существуют службы, которым требуются строки подключения учетной записи хранения с ключами доступа. Для такого сценария рекомендуется использовать именно это решение.

На следующей схеме показано решение для смены, описанное в этом учебнике:

Diagram that shows the rotation solution.

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

  1. За 30 дней до истечения срока действия секрета Key Vault публикует в Сетке событий соответствующее событие.
  2. Сетка событий проверяет подписки на события и с помощью HTTP-запроса методом POST вызывает конечную точку приложения-функции, подписанную на это событие.
  3. Приложение-функция идентифицирует другой ключ (не назначенный последней версией) и вызывает учетную запись хранения для его повторного создания.
  4. Приложение-функция добавляет повторно созданный ключ в Azure Key Vault в качестве новой версии этого секрета.

Необходимые компоненты

  • Подписка Azure. Создайте ее бесплатно.
  • Azure Cloud Shell. В этом учебнике используется портал Cloud Shell и оболочка PowerShell
  • Azure Key Vault.
  • Две учетные записи хранения Azure.

Примечание.

Смена ключа общей учетной записи хранения отменяет подписанный URL-адрес (SAS), созданный на основе этого ключа. После смены ключа учетной записи хранения необходимо повторно создать маркеры SAS на уровне учетной записи, чтобы избежать сбоев в работе приложений.

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

Link that's labelled Deploy to Azure.

  1. Для параметра Группа ресурсов выберите Создать. Назовите смену хранилища групп и нажмите кнопку "ОК".

  2. Выберите Review + create (Просмотреть и создать).

  3. Выберите Создать.

    Screenshot that shows how to create a resource group.

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

az resource list -o table -g vaultrotation

Должно отобразиться примерно следующее:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

Создание и развертывание функции смены ключей

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

Для функции смены в приложении-функции требуются следующие компоненты и настройки:

  • План службы приложений Azure.
  • учетная запись хранения для управления триггерами приложения-функции;
  • Политика доступа для доступа к секретам в Key Vault.
  • роль службы оператора ключа учетной записи хранения, назначенная приложению-функции, чтобы оно могло обращаться к ключам доступа учетной записи хранения;
  • функция смены ключей с активацией по событию и HTTP-триггеру (смена по запросу);
  • подписка на событие Сетки событий для события SecretNearExpiry.
  1. Щелкните ссылку для развертывания шаблона в Azure:

    Azure template deployment link.

  2. В списке Группа ресурсов выберите vaultrotation.

  3. В поле Группа ресурсов учетной записи хранения введите имя группы ресурсов, в которой расположена ваша учетная запись хранения. Оставьте значение по умолчанию [resourceGroup().name], если ваша учетная запись хранения уже расположена в группе ресурсов, в которой будет развернута функция смены ключа.

  4. В поле Имя учетной записи хранения введите имя учетной записи хранения, которая содержит сменяемые ключи. Сохраните значение по умолчанию [concat(resourceGroup().name, 'storage')], если вы используете учетную запись хранения, созданную в разделе Предварительные требования.

  5. В поле Группа ресурсов Key Vault введите имя группы ресурсов, в которой расположено ваше хранилище ключей. Оставьте значение по умолчанию [resourceGroup().name], если ваше хранилище ключей уже существует в группе ресурсов, в которой будет развернута функция смены ключа.

  6. В поле Имя Key Vault введите имя хранилища ключей. Сохраните значение по умолчанию [concat(resourceGroup().name, '-kv')], если вы используете хранилище ключей, созданное в разделе Предварительные требования.

  7. В поле App Service Plan Type (Тип плана службы приложений) выберите план размещения. План Premium требуется только в том случае, если хранилище ключей находится за брандмауэром.

  8. В поле Имя приложения-функции введите соответствующее имя.

  9. В поле Имя секрета введите имя секрета, в котором будут храниться ключи доступа.

  10. В поле URL-адрес репозитория введите расположение кода функции в GitHub. В этом руководстве вы можете использовать https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git .

  11. Выберите Review + create (Просмотреть и создать).

  12. Выберите Создать.

    Screenshot that shows how to create and deploy function.

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

Screenshot that shows the Your deployment is complete page.

Примечание.

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

Шаблоны развертывания и код функции смены можно найти в Azure Samples.

Добавление ключей доступа учетной записи хранения к секретам Key Vault

Для начала настройте политику доступа, которая будет предоставлять субъекту-пользователю разрешение на управление секретами:

az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list

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

Определите идентификатор ресурса учетной записи хранения. Это значение можно найти в свойстве id.

az storage account show -n vaultrotationstorage

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

az storage account keys list -n vaultrotationstorage

Добавьте секрет в хранилище ключей с сроком действия в течение 60 дней, идентификатор ресурса учетной записи хранения и для демонстрации для активации смены немедленно установить дату окончания срока действия завтра. Выполните эту команду, используя полученные значения для key1Value и storageAccountResourceId:

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddTHH:mm:ssZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Этот секрет активирует SecretNearExpiry событие в течение нескольких минут. Это событие, в свою очередь, активирует функцию для смены секрета с истечением срока действия через 60 дней. В этой конфигурации событие SecretNearExpiry будет запускаться каждые 30 дней (30 дней до истечения срока действия), а функция поворота будет альтернативным поворотом между ключом 1 и key2.

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

Используйте следующую команду, чтобы получить данные о секрете:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

Обратите внимание, что CredentialId получает значение другого keyName, а value создается повторно:

Screenshot that shows the output of the A Z keyvault secret show command for the first storage account.

Получите ключи доступа для сравнения значений:

az storage account keys list -n vaultrotationstorage 

Обратите внимание, что value ключа совпадает с секретом в хранилище ключей.

Screenshot that shows the output of the A Z storage account keys list command for the first storage account.

Использование существующей функции смены учетных данных для нескольких учетных записей хранения

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

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

  • роль службы оператора ключа учетной записи хранения, назначенная приложению-функции, чтобы оно могло обращаться к ключам доступа учетной записи хранения;
  • подписка на событие Сетки событий для события SecretNearExpiry.
  1. Щелкните ссылку для развертывания шаблона в Azure:

    Azure template deployment link.

  2. В списке Группа ресурсов выберите vaultrotation.

  3. В поле Группа ресурсов учетной записи хранения введите имя группы ресурсов, в которой расположена ваша учетная запись хранения. Оставьте значение по умолчанию [resourceGroup().name], если ваша учетная запись хранения уже расположена в группе ресурсов, в которой будет развернута функция смены ключа.

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

  5. В поле Группа ресурсов Key Vault введите имя группы ресурсов, в которой расположено ваше хранилище ключей. Оставьте значение по умолчанию [resourceGroup().name], если ваше хранилище ключей уже существует в группе ресурсов, в которой будет развернута функция смены ключа.

  6. В поле Имя Key Vault введите имя хранилища ключей.

  7. В поле Имя приложения-функции введите соответствующее имя.

  8. В поле Имя секрета введите имя секрета, в котором будут храниться ключи доступа.

  9. Выберите Review + create (Просмотреть и создать).

  10. Выберите Создать.

    Screenshot that shows how to create an additional storage account.

Добавление ключа доступа к учетной записи хранения к секретам Key Vault

Определите идентификатор ресурса учетной записи хранения. Это значение можно найти в свойстве id.

az storage account show -n vaultrotationstorage2

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

az storage account keys list -n vaultrotationstorage2

Добавьте секрет в хранилище ключей с сроком действия в течение 60 дней, идентификатор ресурса учетной записи хранения и для демонстрации для активации смены немедленно установить дату окончания срока действия завтра. Выполните эту команду, используя полученные значения для key2Value и storageAccountResourceId:

$tomorrowDate = (Get-Date).AddDays(+1).ToString('yyyy-MM-ddTHH:mm:ssZ')
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Используйте следующую команду, чтобы получить данные о секрете:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

Обратите внимание, что CredentialId получает значение другого keyName, а value создается повторно:

Screenshot that shows the output of the A Z keyvault secret show command for the second storage account.

Получите ключи доступа для сравнения значений:

az storage account keys list -n vaultrotationstorage 

Обратите внимание, что value ключа совпадает с секретом в хранилище ключей.

Screenshot that shows the output of the A Z storage account keys list command for the second storage account.

Отключение смены секрета

Вы можете отключить смену секрета, просто удалив подписку сетки событий для этого секрета. Используйте командлет Azure PowerShell Remove-AzEventGridSubscription или команду Azure CLI az event grid event--subscription delete.

Функции ротации хранилища ключей для двух наборов учетных данных

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

Примечание.

Эти функции поворота создаются членом сообщества, а не корпорацией Майкрософт. Функции сообщества не поддерживаются в рамках любой программы поддержки майкрософт или службы, и предоставляются КАК IS без каких-либо гарантий.

Следующие шаги