Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Лучший способ проверки подлинности в службах Azure является управляемым удостоверением, но для некоторых сценариев требуется ключ доступа, пароль или другой секрет. Регулярно поворачивайте эти секреты, чтобы снизить влияние утечки учетных данных.
В этом руководстве показано, как автоматизировать периодическое смену секретов для баз данных и служб, использующих один набор учетных данных проверки подлинности. Общие сведения об авторотации для различных типов ресурсов см. в статье «Основные сведения об авторотации в Azure Key Vault».
В частности, в этом руководстве выполняется ротация пароля SQL Server, хранящегося в Azure Key Vault, с помощью функции, которая запускается уведомлением Сетка событий Azure:
Tip
Для База данных SQL Azure и Управляемый экземпляр SQL Azure следует отдавать предпочтение аутентификации только через Microsoft Entra, а не учетным записям SQL. Используйте шаблон смены паролей в этом руководстве, только если для рабочей нагрузки требуется проверка подлинности SQL.
- Тридцать дней до истечения срока действия секрета, Key Vault публикует событие "почти истекает" в Сетке событий.
- Сетка событий проверяет подписки на события и использует HTTP POST для вызова конечной точки приложения-функции, подписанной на событие.
- Приложение-функция получает секретную информацию, создает новый случайный пароль и создает новую версию секрета с новым паролем в Key Vault.
- Приложение-функция обновляет SQL Server с новым паролем.
Примечание.
Между шагами 3 и 4 может возникнуть задержка. Во время этого окна секрет в Key Vault не может пройти проверку подлинности в SQL Server. Если какой-либо шаг завершается ошибкой, сетка событий повторяется в течение двух часов.
Предпосылки
- Подписка Azure — создайте бесплатно.
- Azure Key Vault.
- SQL Server.
Если у вас еще нет хранилища ключей и экземпляра SQL Server, используйте эту ссылку развертывания:
Изображение с кнопкой с надписью "Развернуть в Azure".
- В группе ресурсов выберите "Создать" и присвойте группе имя. В этом руководстве используется akvrotation.
- В разделе "Имя входа администратора SQL" введите имя входа администратора SQL.
- Выберите Review + create.
- Выберите Создать.
Теперь у вас есть хранилище ключей и экземпляр 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 экземпляр и приложение-функция были в одной группе ресурсов.
Затем создайте приложение-функцию с управляемым удостоверением, назначаемое системой, вместе с другими необходимыми компонентами, и разверните функцию смены паролей SQL Server.
Приложению-функции требуются следующие компоненты:
- План службы Служба приложений Azure.
- Приложение-функция с функцией смены паролей SQL с триггером сетки событий и триггером HTTP.
- Учетная запись хранения для управления триггерами приложения-функции.
- Назначение роли Azure, которое позволяет удостоверению приложения-функции получать доступ к секретам в хранилище ключей.
- Подписка на событие Event Grid для события SecretNearExpiry.
Выберите ссылку развертывания шаблона Azure:
Изображение с кнопкой с надписью "Развернуть в Azure".
В списке групп ресурсов выберите akvrotation.
В поле "Имя SQL Server" введите имя экземпляра SQL Server, пароль которого требуется повернуть.
В поле "Имя Key Vault" введите имя key vault.
В поле "Имя приложения-функции" введите имя приложения-функции.
В поле "Имя секрета" введите имя секрета, которое хранит пароль.
В URL репозитория введите адрес на GitHub, где находится код функции:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.gitВыберите Review + create.
Выберите Создать.
Примечание.
Этот шаблон ARM использует развертывание через систему управления версиями App Service (Kudu) для получения кода функции из GitHub. Для рабочей нагрузки в производственной среде вместо этого рекомендуется пакетное развертывание, например с помощью func azure functionapp publish или развертывание ZIP с помощью WEBSITE_RUN_FROM_PACKAGE.
После выполнения предыдущих шагов у вас есть учетная запись хранения, ферма серверов и приложение-функция. Проверьте эту настройку в 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.
Примечание.
Пример функции предназначен для внутрипроцессной модели .NET в Функции Azure. Для новой разработки используйте .NET изолированную рабочую модель, которая является поддерживаемой моделью.
Функция поворота
Функция, развернутая на предыдущем шаге, использует событие для активации смены секретов. Он обновляет 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=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
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:
Откройте секрет sqlPassword и просмотрите исходные и сменные версии:
Создание веб-приложения
Чтобы проверить учетные данные SQL, создайте веб-приложение. Веб-приложение извлекает секрет из Key Vault, извлекает сведения и учетные данные базы данных SQL из секрета и проверяет подключение к SQL Server.
Для веб-приложения требуются следующие компоненты:
- Веб-приложение с системно назначенным управляемым идентификатором.
- Назначение ролей, позволяющее управляемому удостоверению веб-приложения считывать секреты в хранилище ключей.
Выберите ссылку развертывания шаблона Azure:
Изображение с кнопкой с надписью "Развернуть в Azure".
Выберите группу ресурсов akvrotation .
В поле Имя SQL Server введите имя SQL Server, для которого вы сменили пароль.
В поле "Имя Key Vault" введите имя key vault.
В поле "Имя секрета" введите имя секрета, которое хранит пароль.
В URL-адресе репозитория введите адрес кода веб-приложения на GitHub:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.gitВыберите Review + create.
Выберите Создать.
Открытие веб-приложения
Перейдите по URL-адресу развернутого приложения: https://akvrotation-app.azurewebsites.net/
Когда приложение откроется в браузере, на странице отображается созданное значение секрета и подключенное к базе данных значение true.
Использование ИИ для настройки функции поворота для базы данных
В этом руководстве демонстрируется ротация секретов для SQL Server, но вы можете адаптировать функцию ротации для других типов баз данных. GitHub Copilot может помочь вам изменить код функции ротации для работы с вашей базой данных или вашим типом учетных данных.
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 часто задаваемые вопросы.