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


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

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

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

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

Замечание

Для служб учетной записи хранения рекомендуется использовать Microsoft Entra ID для авторизации запросов. Дополнительную информацию см. в статье Authorize access to BLOB-объектов с помощью 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 env
  • Azure Key Vault.
  • Две учетные записи хранения Azure.

Замечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Замечание

Если возникает сбой, можно выбрать повторное развертывание , чтобы завершить развертывание компонентов.

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

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

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

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 дней до истечения срока действия), а функция обновления будет поочередно чередовать ключ 1 и ключ 2.

Вы можете убедиться, что ключи доступа были повторно созданы, извлекая как ключ учетной записи хранения, так и секрет 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 

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

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

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

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

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

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

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

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

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

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

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

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

  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 vaultrotationstorage 

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

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

Отключить поворот для секрета

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

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

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

Замечание

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

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

В этом руководстве демонстрируется ротация секретов для учетных записей служба хранилища 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 часто задаваемые вопросы.

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