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

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

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

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

Important

Для служба хранилища Azure предпочтительнее использовать авторизацию через Microsoft Entra ID с управляемой идентичностью вместо общих ключей учетной записи. Если это допускается требованиями соответствия, отключите авторизацию с помощью общего ключа для учетной записи хранения и полностью устраните необходимость в ротации ключей. Используйте шаблон в этом руководстве только в том случае, если для рабочей нагрузки требуется ключ учетной записи хранения или строка подключения.

Вот решение для вращения, описанное в этом руководстве:

Схема, показывющая решение поворота.

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

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

Предпосылки

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

Замечание

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

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

Link, помеченный как Deploy to Azure.

  1. Для параметра Группа ресурсов выберите Создать. Назовите группу vault rotation и нажмите OK.

  2. Выберите Review + create.

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

    Снимок экрана: создание группы ресурсов.

Теперь у вас есть хранилище ключей и две учетные записи хранения. Проверьте эту настройку в 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.
  • Учетная запись хранения для управления триггерами приложения-функции.
  • Назначение ролей Azure, позволяющее приложению-функции получать доступ к секретам в хранилище ключей.
  • Роль службы оператора ключей учетной записи хранения, назначенная приложению функции, чтобы оно могло получать доступ к ключам доступа учетной записи хранения.
  • Функция поворота ключей с триггером сетки событий и триггером HTTP (для поворота по запросу).
  • Подписка на событие Event Grid для события SecretNearExpiry.
  1. Выберите ссылку развертывания шаблона Azure:

    Ссылка на развертывание шаблона Azure.

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

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

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

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

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

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

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

  9. В поле "Имя секрета" введите имя секрета, включающее ключи доступа.

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

  11. Выберите Review + create.

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

    Снимок экрана: создание и развертывание функции.

После завершения развертывания у вас есть учетная запись хранения, ферма серверов, приложение-функция и ресурс Application Insights:

Снимок экрана, на котором показана страница «Развертывание завершено».

Замечание

Этот шаблон ARM использует развертывание системы управления версиями службы приложений (Kudu) для извлечения кода функции из GitHub. Для производственной среды вместо этого рекомендуется развертывание из пакета, например с помощью func azure functionapp publish или zip-развертывания с WEBSITE_RUN_FROM_PACKAGE Если развертывание завершается сбоем, выберите повторное развертывание , чтобы повторить попытку.

Шаблоны развертывания и код для функции поворота находятся в Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

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

Сначала назначьте себе роль Key Vault Secrets Officer, чтобы управлять секретами в хранилище ключей:

az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/vaultrotation-kv

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

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

az storage account show -n vaultrotationstorage

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

az storage account keys list -n vaultrotationstorage

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

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1-value> --tags "CredentialId=key1" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

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

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

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

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

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

Снимок экрана, показывающий вывод команды az keyvault secret show для первого аккаунта хранения.

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

az storage account keys list -n vaultrotationstorage

Обратите внимание, что значение ключа соответствует секрету в хранилище ключей:

Снимок экрана: выходные данные команды списка ключей учетной записи хранения A Z для первой учетной записи хранения.

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

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

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

  • Роль службы оператора ключей учетной записи хранения, назначенная приложению функции, чтобы оно могло получать доступ к ключам доступа учетной записи хранения.
  • Подписка на событие Event Grid для события SecretNearExpiry.
  1. Выберите ссылку развертывания шаблона Azure:

    Ссылка на развертывание шаблона Azure.

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

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

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

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

  6. В поле "Имя Key Vault" введите имя key vault.

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

  8. В поле "Имя секрета" введите имя секрета, включающее ключи доступа.

  9. Выберите Review + create.

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

    Снимок экрана: создание дополнительной учетной записи хранения.

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

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

az storage account show -n vaultrotationstorage2

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

az storage account keys list -n vaultrotationstorage2

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

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2-value> --tags "CredentialId=key2" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

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

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

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

Снимок экрана, показывающий результат выполнения команды A Z keyvault secret show для второй учетной записи хранения.

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

az storage account keys list -n vaultrotationstorage2

Обратите внимание, что значение ключа соответствует секрету в хранилище ключей:

Снимок экрана: выходные данные команды списка ключей учетной записи хранения A Z для второй учетной записи хранения.

Отключить ротацию секрета

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

Использование ИИ для настройки функции поворота для других служб

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

I'm using the Azure Key Vault dual-credential secret rotation tutorial for Storage accounts. Help me modify the PowerShell rotation function to work with Azure Cosmos DB instead. The function should:
1. Connect to Cosmos DB and regenerate the secondary key
2. Store the new key in Key Vault as a new secret version
3. Alternate between primary and secondary keys on each rotation
Show me the changes needed to the PowerShell function code, including the correct Cosmos DB PowerShell cmdlets.

GitHub Copilot работает на ИИ, поэтому возможны как неожиданные результаты, так и ошибки. Дополнительные сведения см. в разделе Copilot часто задаваемые вопросы.

Дальнейшие шаги