De rotatie van een geheim automatiseren voor resources die gebruikmaken van één set verificatiereferenties

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.

Diagram van draaiingsoplossing

  1. Dertig dagen vóór de vervaldatum van een geheim publiceert Key Vault de gebeurtenis 'bijna verlopen' op Event Grid.
  2. 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.
  3. 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.
  4. 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

Als u nog geen sleutelkluis en SQL Server-exemplaar hebt, gebruikt u deze implementatielink:

Afbeelding met de knop Implementeren in Azure.

  1. Selecteer onder ResourcegroepNieuwe maken en geef de groep een naam. In deze zelfstudie wordt akvrotation gebruikt.
  2. Voer onder SQL Admin Login de aanmeldingsnaam van de SQL-beheerder in.
  3. Kies Beoordelen + creëren.
  4. Klik op Creëren.

Een resourcegroep maken

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.
  1. Selecteer de Azure sjabloonimplementatie link:

    Afbeelding met de knop Implementeren in Azure.

  2. Selecteer akvrotation in de lijst Resource groep.

  3. Voer in Naam van SQL Server de naam in van de SQL Server-instantie waarvan u het wachtwoord wilt roteren.

  4. Voer in Key Vault Naam de naam van de key vault in.

  5. Voer in De naam van de functie-app de naam van de functie-app in.

  6. Voer in Geheime naam de geheime naam in waarin het wachtwoord wordt opgeslagen.

  7. Voer in de OPSLAGPLAATS-URL de GitHub locatie van de functiecode in: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Kies Beoordelen + creëren.

  9. 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.

Selecteer Beoordelen+maken

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:

Schermopname waarin wordt getoond hoe u toegang hebt tot Key Vault > Secrets.

Open het sqlPassword-geheim en bekijk de oorspronkelijke en gedraaide versies:

Ga naar Geheimen

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.
  1. Selecteer de Azure sjabloonimplementatie link:

    Afbeelding met de knop Implementeren in Azure.

  2. Kies de akvrotation-resourcegroep.

  3. Voer in SQL Server Naam de SQL Server naam in waarvan u het wachtwoord hebt gedraaid.

  4. Voer in Key Vault Naam de naam van de key vault in.

  5. Voer in Geheime naam de geheime naam in waarin het wachtwoord wordt opgeslagen.

  6. 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.

  7. Kies Beoordelen + creëren.

  8. 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.

Meer informatie