Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De beste manier om te verifiëren bij Azure services is met een beheerde identiteit, maar voor sommige scenario's is een toegangssleutel, wachtwoord of ander geheim vereist. Wijzig deze geheimen regelmatig om de impact van een uitgelekt inloggegeven te beperken.
Deze zelfstudie laat zien hoe u periodieke geheimrotatie automatiseert voor databases en services die gebruikmaken van één set verificatiereferenties. Zie Informatie over autorotatie in Azure Key Vault voor een overzicht van autorotatie voor verschillende typen assets.
Concreet roteert deze zelfstudie een SQL Server-wachtwoord dat is opgeslagen in Azure Key Vault, met behulp van een functie die wordt geactiveerd door een Azure Event Grid-melding:
Tip
Voor Azure SQL Database en Azure SQL Managed Instance heeft uitsluitend Microsoft Entra-verificatie de voorkeur boven SQL-aanmeldingen. Gebruik het patroon voor wachtwoordrotatie in deze zelfstudie alleen wanneer een workload SQL-verificatie vereist.
- Dertig dagen vóór de vervaldatum van een geheim publiceert Key Vault de gebeurtenis 'bijna verlopen' op Event Grid.
- Event Grid controleert de gebeurtenisabonnementen en maakt gebruik van HTTP POST om het eindpunt voor de functie-app aan te roepen die is geabonneerd op de gebeurtenis.
- De functie-app ontvangt de geheime informatie, genereert een nieuw willekeurig wachtwoord en maakt een nieuwe versie voor het geheim met het nieuwe wachtwoord in Key Vault.
- De functie-app werkt SQL Server bij met het nieuwe wachtwoord.
Opmerking
Er kan een vertraging optreden tussen stap 3 en 4. Tijdens dat venster kan het geheim in Key Vault niet worden geverifieerd bij SQL Server. Als een stap mislukt, probeert Event Grid twee uur opnieuw.
Vereiste voorwaarden
- Een Azure-abonnement- gratis een abonnement maken.
- Azure Key Vault.
- SQL Server.
Als u nog geen sleutelkluis en SQL Server-exemplaar hebt, gebruikt u deze implementatielink:
- Selecteer onder ResourcegroepNieuwe maken en geef de groep een naam. In deze zelfstudie wordt akvrotation gebruikt.
- Voer onder SQL Admin Login de aanmeldingsnaam van de SQL-beheerder in.
- Kies Beoordelen + creëren.
- Klik op Creëren.
U hebt nu een sleutelkluis en een SQL Server-exemplaar. Controleer deze instelling in de Azure CLI:
az resource list -o table -g akvrotation
Het resultaat ziet er ongeveer als volgt uit:
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
De functie SQL Server wachtwoordrotatie maken en implementeren
Belangrijk
Voor deze sjabloon moeten de Key Vault, de SQL Server-instantie en de functie-app zich in dezelfde resourcegroep bevinden.
Maak vervolgens een functie-app met een door het systeem toegewezen beheerde identiteit samen met de andere vereiste onderdelen en implementeer de functie SQL Server wachtwoordrotatie.
Voor de functie-app zijn de volgende onderdelen vereist:
- Een Azure App Service plan.
- Een functie-app met een SQL-functie voor wachtwoordrotatie met een Event Grid-trigger en een HTTP-trigger.
- Een opslagaccount voor triggerbeheer voor functie-apps.
- Een Azure roltoewijzing waarmee de identiteit van de functie-app toegang heeft tot geheimen in de sleutelkluis.
- Een event-abonnement in Event Grid voor de gebeurtenis SecretNearExpiry.
Selecteer de Azure sjabloonimplementatie link:
Selecteer akvrotation in de lijst Resource groep.
Voer in Naam van SQL Server de naam in van de SQL Server-instantie waarvan u het wachtwoord wilt roteren.
Voer in Key Vault Naam de naam van de key vault in.
Voer in De naam van de functie-app de naam van de functie-app in.
Voer in Geheime naam de geheime naam in waarin het wachtwoord wordt opgeslagen.
Voer in de OPSLAGPLAATS-URL de GitHub locatie van de functiecode in:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.Kies Beoordelen + creëren.
Klik op Creëren.
Opmerking
Deze ARM-sjabloon maakt gebruik van Kudu-implementatie (Broncodebeheer) van App Service om de functiecode op te halen uit GitHub. Voor een productieworkload raden we een implementatie op basis van pakketten aan, zoals func azure functionapp publish of zip-implementatie met WEBSITE_RUN_FROM_PACKAGE in plaats daarvan.
Nadat u de voorgaande stappen hebt voltooid, hebt u een opslagaccount, een serverfarm en een functie-app. Controleer deze instelling in de Azure CLI:
az resource list -o table -g akvrotation
Het resultaat ziet er ongeveer als volgt uit:
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
Zie Een functie-app maken vanuit de Azure-portal, beheerde identiteit gebruiken voor App Service en Azure Functions en toegang bieden tot Key Vault met Azure RBAC voor meer informatie over het maken van een functie-app en het gebruik van een beheerde identiteit voor toegang tot Key Vault.
Opmerking
De voorbeeldfunctie is gericht op het .NET in-process model voor Azure Functions. Voor nieuwe ontwikkeling gebruikt u het .NET geïsoleerde werkrolmodel. Dit is het ondersteunde model in de toekomst.
Draaifunctie
De functie die in de vorige stap is geïmplementeerd, maakt gebruik van een gebeurtenis om geheimrotatie te activeren. Hiermee worden Key Vault en de SQL-database bijgewerkt.
Trigger-gebeurtenis van functie
Deze functie leest gebeurtenisgegevens en voert de rotatielogica uit:
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);
}
}
Logica voor geheimrotatie
Deze rotatiemethode leest databasegegevens uit het geheim, maakt een nieuwe versie van het geheim en werkt de database bij met het nieuwe geheim:
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");
}
}
U vindt de volledige code op GitHub.
Het geheim toevoegen aan Key Vault
Wijs uzelf de rol Key Vault Secrets Officer toe, zodat u geheimen in de kluis kunt beheren:
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
Maak een geheim met tags die de SQL Server resource-id, de SQL Server aanmeldingsnaam en de geldigheidsperiode van het geheim in dagen bevatten. Stel de geheime naam, het initiële wachtwoord uit de SQL-database (Simple123 in dit voorbeeld) en een vervaldatum in die is ingesteld op morgen, zodat rotatie onmiddellijk wordt geactiveerd.
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
Als u een korte vervaldatum instelt, wordt binnen 15 minuten een SecretNearExpiry-gebeurtenis gepubliceerd, waardoor de functie wordt geactiveerd om het geheim te roteren.
Testen en verifiëren
Ga naar Key Vault>Secrets om te controleren of het geheim is geroteerd:
Open het sqlPassword-geheim en bekijk de oorspronkelijke en gedraaide versies:
Een web-app maken
Als u de SQL-referenties wilt controleren, maakt u een web-app. De web-app haalt het geheim op uit Key Vault, extraheert de SQL-databasegegevens en -referenties uit het geheim en test de verbinding met SQL Server.
Voor de web-app zijn de volgende onderdelen vereist:
- Een web-app met een door het systeem toegewezen beheerde identiteit.
- Een roltoewijzing waarmee de beheerde identiteit van de web-app geheimen in de sleutelkluis kan lezen.
Selecteer de Azure sjabloonimplementatie link:
Kies de akvrotation-resourcegroep.
Voer in SQL Server Naam de SQL Server naam in waarvan u het wachtwoord hebt gedraaid.
Voer in Key Vault Naam de naam van de key vault in.
Voer in Geheime naam de geheime naam in waarin het wachtwoord wordt opgeslagen.
Voer in de OPSLAGPLAATS-URL de GitHub locatie van de code van de web-app in:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.Kies Beoordelen + creëren.
Klik op Creëren.
De web-app openen
Ga naar de URL van de geïmplementeerde toepassing: https://akvrotation-app.azurewebsites.net/.
Wanneer de toepassing wordt geopend in de browser, wordt op de pagina de gegenereerde geheime waarde en een database verbonden waarde van trueweergegeven.
AI gebruiken om de rotatiefunctie voor uw database aan te passen
Deze zelfstudie demonstreert geheime rotatie voor SQL Server, maar u kunt de rotatiefunctie aanpassen voor andere databasetypen. GitHub Copilot kunt u helpen de functiecode voor roulatie te wijzigen zodat deze werkt met uw database of referentietype.
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 kan u ook helpen dit patroon aan te passen voor andere soorten referenties, zoals API-sleutels, verbindingsreeksen (connection strings) of wachtwoorden voor service-accounts.
GitHub Copilot wordt aangedreven door AI, dus verrassingen en fouten zijn mogelijk. Zie Copilot veelgestelde vragen voor meer informatie.