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 het gebruik van een beheerde identiteit, maar er zijn enkele scenario's waarin dat geen optie is. In dergelijke gevallen worden toegangssleutels of geheimen gebruikt. U moet regelmatig toegangssleutels of geheimen roteren.

In deze zelfstudie leert u hoe u de periodieke rotatie van geheimen voor databases en services automatiseert die gebruikmaken van één set verificatiereferenties. Zie Onderstaand autorotatie in Azure Key Vault voor een uitgebreid overzicht van concepten en voordelen van automatischerotatie voor verschillende assettypen.

Deze zelfstudie rouleert SQL Server wachtwoorden die zijn opgeslagen in Azure Key Vault met behulp van een functie die wordt geactiveerd door een Azure Event Grid notificatie.

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. Gedurende die tijd kan het geheim in Key Vault niet worden geverifieerd bij SQL Server. In het geval van een fout in een van de stappen probeert Event Grid twee uur opnieuw.

Vereiste voorwaarden

Als u nog geen Key Vault en SQL Server hebt, kunt u deze implementatiekoppeling gebruiken:

Afbeelding met de knop Implementeren in Azure.

  1. Selecteer voor Resourcegroep de optie Nieuwe maken. Geef groep een naam, we gebruiken akvrotation in deze zelfstudie.
  2. Typ de aanmeldingsnaam van de SQL-beheerder onder SQL-beheerdersaanmelding.
  3. Kies Beoordelen + creëren.
  4. Selecteer Creëren

Een resourcegroep maken

U hebt nu een Key Vault en een SQL Server exemplaar. U kunt deze instelling controleren in de Azure CLI door de volgende opdracht uit te voeren:

az resource list -o table -g akvrotation

Het resultaat zal er ongeveer als het volgende uitzien:

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 wachtwoordrotatie voor SQL Server maken en implementeren

Belangrijk

Voor deze sjabloon moeten de sleutelkluis, SQL Server en Azure Function zich in dezelfde resourcegroep bevinden.

Maak vervolgens een functie-app met een door het systeem beheerde identiteit, naast de andere vereiste onderdelen, en implementeer functies voor wachtwoordrotatie van SQL Server

Voor de functie-app zijn de volgende onderdelen vereist:

  • Een Azure App Service-abonnement
  • Een functie-app met functies voor het rouleren van SQL-wachtwoorden met gebeurtenistrigger en HTTP-trigger
  • Een opslagaccount dat vereist is voor het beheer van triggers voor functie-apps
  • Een Azure RBAC-roltoewijzing om de identiteit van de functie-app toegang tot geheimen in Key Vault te geven.
  • Een Event Grid-gebeurtenisabonnement voor SecretNearExpiry-gebeurtenis
  1. Selecteer de Azure sjabloonimplementatie link:

    Afbeelding met de knop Implementeren in Azure.

  2. Selecteer akvrotation in de lijst Resource groep.

  3. Typ in de SQL Server Naam de naam van de SQL Server en het wachtwoord om te roteren.

  4. Typ in de Key Vault Name de naam van de key vault

  5. Typ in de functie-appnaam de naam van de functie-app.

  6. Typ in de geheime naam de geheime naam waarin het wachtwoord wordt opgeslagen

  7. Voer in de Repo-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.

Selecteer Beoordelen+maken

Nadat u de voorgaande stappen hebt voltooid, hebt u een opslagaccount, een serverfarm en een functie-app. U kunt deze instelling controleren in de Azure CLI door de volgende opdracht uit te voeren:

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

Voor informatie over het maken van een functie-app en het gebruik van een beheerde identiteit voor toegang tot Key Vault, zie Maak een functie-app vanuit de Azure portal, Het gebruik van beheerde identiteiten voor App Service en Azure Functions en Provide-toegang tot Key Vault met Azure RBAC.

Draaifunctie

Geïmplementeerd in de vorige stapfunctie maakt gebruik van een gebeurtenis om de rotatie van een geheim te activeren door Key Vault en de SQL-database bij te werken.

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

Stel uw toegangsbeleid in om beheren van geheimen rechten aan gebruikers te verlenen.

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 nieuw geheim met tags die de SQL Server resource-id, de SQL Server aanmeldingsnaam en de geldigheidsperiode voor het geheim in dagen bevatten. Geef de naam op van het geheim, het eerste wachtwoord van de SQL-database (in ons voorbeeld 'Simple123') en neem een vervaldatum op die voor morgen is ingesteld.

$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

Als u een geheim met een korte vervaldatum maakt, wordt binnen 15 minuten een SecretNearExpiry gebeurtenis gepubliceerd. Hierdoor wordt de functie geactiveerd om het geheim te draaien.

Testen en verifiëren

Als u wilt controleren of het geheim is bijgewerkt, gaat u naar Key Vault>Secrets:

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. Deze web-app haalt het geheim op uit Key Vault, extraheert gegevens en referenties van de SQL-database uit het geheim en test de verbinding met SQL Server.

Voor de web-app zijn de volgende onderdelen vereist:

  • Een web-app met door het systeem beheerde identiteit
  • Een toegangsbeleid voor toegang tot geheimen in Key Vault via beheerde identiteit voor web-apps
  1. Selecteer de koppeling voor Azure-sjabloonimplementatie:

    Afbeelding met de knop Implementeren in Azure.

  2. Kies de akvrotation-resourcegroep.

  3. Voer in de SQL Server Naam de SQL Server naam en wachtwoord in om te roteren.

  4. Typ de sleutelkluisnaam in Sleutelkluisnaam in.

  5. Typ in de geheime naam de geheime naam waarin het wachtwoord is opgeslagen

  6. Typ in de Repo-URL de code van de web-app GitHub locatie (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 in de browser wordt geopend, ziet u de gegenereerde geheime waarde en een Database verbonden waarde van true.

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 in VS Code kan u helpen de code van de rotatiefunctie te wijzigen zodat deze werkt met uw specifieke 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