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


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

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

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

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

Схема решения поворота

  1. Тридцать дней до истечения срока действия секрета, Key Vault публикует событие "почти истекает" в Сетке событий.
  2. Сетка событий проверяет подписки на события и использует HTTP POST для вызова конечной точки приложения-функции, подписанной на событие.
  3. Приложение-функция получает секретную информацию, создает новый случайный пароль и создает новую версию секрета с новым паролем в Key Vault.
  4. Приложение-функция обновляет SQL Server с новым паролем.

Примечание.

Между шагами 3 и 4 может возникнуть задержка. В течение этого времени секрет в Key Vault не сможет пройти проверку подлинности в SQL Server. В случае сбоя на любом из шагов Event Grid будет попытаться повторить процесс в течение двух часов.

Предпосылки

Если у вас нет Key Vault и SQL Server, можно использовать эту ссылку развертывания:

Изображение с кнопкой с надписью "Развернуть в Azure".

  1. Для параметра Группа ресурсов выберите Создать. Присвойте группе имя, используйте akvrotation в этом руководстве.
  2. В разделе "Имя входа администратора SQL" введите имя входа администратора SQL.
  3. Выберите Review + create.
  4. Нажмите кнопку Создать

Создание группы ресурсов

Теперь у вас будет Key Vault и экземпляр SQL Server. Эту настройку можно проверить в Azure CLI, выполнив следующую команду:

az resource list -o table -g akvrotation

Результат будет выглядеть примерно так:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation      eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation      eastus      Microsoft.Sql/servers/databases
akvrotation-sql2         akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql2/master  akvrotation      eastus      Microsoft.Sql/servers/databases

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

Это важно

Этот шаблон требует, чтобы хранилище ключей, SQL Server и функция Azure были в одной группе ресурсов.

Затем создайте приложение функции с управляемым системой удостоверением, а также другие необходимые компоненты, и разверните функции ротации паролей для SQL Server.

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

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

    Изображение кнопки с надписью

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

  3. Введите в поле SQL Server Name имя сервера SQL и пароль для выполнения ротации.

  4. В поле Key Vault Name введите имя key vault

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

  6. В имени секрета введите имя секрета, под которым пароль будет сохранён.

  7. В Repo Url введите код функции расположения на GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

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

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

Выберите Проверка и создание

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

az resource list -o table -g akvrotation

Результат будет выглядеть примерно так:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation       eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation       eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation       eastus      Microsoft.Sql/servers/databases
cfogyydrufs5wazfunctions akvrotation       eastus      Microsoft.Storage/storageAccounts
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/serverFarms
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/sites
akvrotation-fnapp        akvrotation       eastus      Microsoft.insights/components

Сведения о создании функционального приложения и использовании управляемого удостоверения для доступа к Key Vault см. разделы Создайте функциональное приложение на портале Azure, Как использовать управляемое удостоверение для службы приложений и Функции Azure и Обеспечьте доступ к Key Vault с Azure RBAC.

Функция поворота

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

Событие триггера функции

Эта функция считывает данные события и выполняет логику поворота:

public static class SimpleRotationEventHandler
{
   [FunctionName("AKVSQLRotation")]
   public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
   {
      log.LogInformation("C# Event trigger function processed a request.");
      var secretName = eventGridEvent.Subject;
      var secretVersion = Regex.Match(eventGridEvent.Data.ToString(), "Version\":\"([a-z0-9]*)").Groups[1].ToString();
      var keyVaultName = Regex.Match(eventGridEvent.Topic, ".vaults.(.*)").Groups[1].ToString();
      log.LogInformation($"Key Vault Name: {keyVaultName}");
      log.LogInformation($"Secret Name: {secretName}");
      log.LogInformation($"Secret Version: {secretVersion}");

      SecretRotator.RotateSecret(log, secretName, keyVaultName);
   }
}

Логика поворота секретов

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

    public class SecretRotator
    {
		private const string CredentialIdTag = "CredentialId";
		private const string ProviderAddressTag = "ProviderAddress";
		private const string ValidityPeriodDaysTag = "ValidityPeriodDays";

		public static void RotateSecret(ILogger log, string secretName, string keyVaultName)
        {
            //Retrieve Current Secret
            var kvUri = "https://" + keyVaultName + ".vault.azure.net";
            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
            KeyVaultSecret secret = client.GetSecret(secretName);
            log.LogInformation("Secret Info Retrieved");

            //Retrieve Secret Info
            var credentialId = secret.Properties.Tags.ContainsKey(CredentialIdTag) ? secret.Properties.Tags[CredentialIdTag] : "";
            var providerAddress = secret.Properties.Tags.ContainsKey(ProviderAddressTag) ? secret.Properties.Tags[ProviderAddressTag] : "";
            var validityPeriodDays = secret.Properties.Tags.ContainsKey(ValidityPeriodDaysTag) ? secret.Properties.Tags[ValidityPeriodDaysTag] : "";
            log.LogInformation($"Provider Address: {providerAddress}");
            log.LogInformation($"Credential Id: {credentialId}");

            //Check Service Provider connection
            CheckServiceConnection(secret);
            log.LogInformation("Service Connection Validated");
            
            //Create new password
            var randomPassword = CreateRandomPassword();
            log.LogInformation("New Password Generated");

            //Add secret version with new password to Key Vault
            CreateNewSecretVersion(client, secret, randomPassword);
            log.LogInformation("New Secret Version Generated");

            //Update Service Provider with new password
            UpdateServicePassword(secret, randomPassword);
            log.LogInformation("Password Changed");
            log.LogInformation($"Secret Rotated Successfully");
        }
}

Полный код можно найти на GitHub.

Добавление секрета в 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/akvrotation-kv

Создайте новый секрет с тегами, содержащими идентификатор ресурса SQL Server, имя входа SQL Server и срок действия секрета в днях. Укажите имя секрета, исходный пароль из базы данных SQL (в нашем примере "Simple123") и добавьте дату окончания срока действия, установленную завтра.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddThh:mm:ssZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Создание секрета с короткой датой окончания срока действия опубликует SecretNearExpiry событие через 15 минут, которое, в свою очередь, активирует функцию для смены ключа.

Тестирование и проверка

Чтобы убедиться, что секрет обновился, перейдите к Key Vault>Secrets:

Скриншот, показывающий, как получить доступ к Key Vault > Secrets.

Откройте секрет sqlPassword и просмотрите исходные и сменные версии:

Перейти к секретам

Создание веб-приложения

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

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

  • Веб-приложение с управляемым системой удостоверением
  • Политика доступа к секретам в Key Vault через управляемую учетную запись веб-приложения
  1. Выберите ссылку развертывания шаблона Azure:

    Изображение с кнопкой с надписью

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

  3. В поле SQL Server Name введите имя SQL Server и пароль для выполнения ротации.

  4. В поле Key Vault Name введите имя key vault

  5. В имени секрета введите имя секрета, где хранится пароль.

  6. В поле Repo Url введите расположение кода веб-приложения на GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

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

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

Открытие веб-приложения

Перейдите по URL-адресу развернутого приложения:

https://akvrotation-app.azurewebsites.net/

Когда приложение откроется в браузере, вы увидите созданное значение секрета и подключенное к базе данных значение true.

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

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

I'm using the Azure Key Vault secret rotation tutorial for SQL Server. Help me modify the rotation function to work with PostgreSQL instead. The function should:
1. Generate a new secure password
2. Update the PostgreSQL database user password
3. Store the new password in Key Vault
Show me the changes needed to the C# function code, including the correct PostgreSQL connection library and password update command.

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

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

Подробнее