Automatisieren der Rotation eines Geheimnisses für Ressourcen, die einen Satz von Authentifizierungsdaten verwenden

Die beste Möglichkeit, sich bei Azure Diensten zu authentifizieren, ist mit einer verwalteten Identität, aber einige Szenarien erfordern einen Zugriffsschlüssel, ein Kennwort oder einen anderen geheimen Schlüssel. Rotieren Sie diese Geheimwerte regelmäßig, um die Auswirkungen einer offengelegten Anmeldeinformation zu minimieren.

Dieses Tutorial zeigt, wie Sie die regelmäßige Rotation von Secrets für Datenbanken und Dienste automatisieren, die einen Satz von Authentifizierungsanmeldeinformationen verwenden. Eine Übersicht über die Autorotation über verschiedene Objekttypen hinweg finden Sie unter Grundlegendes zur Autorotation in Azure Key Vault.

Konkret wird in diesem Lernprogramm das in Azure Key Vault gespeicherte SQL-Server-Kennwort mithilfe einer Funktion rotiert, die durch eine Azure Event Grid-Benachrichtigung ausgelöst wird:

Tip

Für Azure SQL-Datenbank und Azure SQL Managed Instance bevorzugen Sie die Microsoft Entra-only-Authentifizierung gegenüber SQL-Anmeldungen. Verwenden Sie das Kennwortdrehungsmuster in diesem Lernprogramm nur, wenn eine Workload SQL-Authentifizierung erfordert.

Diagramm der Drehungslösung

  1. Dreißig Tage vor dem Ablaufdatum eines Geheimnisses veröffentlicht Key Vault das Ereignis "kurz vor Ablauf" im Event Grid.
  2. Event Grid überprüft die Ereignisabonnements und ruft mit HTTP POST den Funktions-App-Endpunkt auf, der dieses Ereignis abonniert hat.
  3. Die Funktions-App empfängt die geheimen Informationen, generiert ein neues zufälliges Kennwort und erstellt eine neue Version für den geheimen Schlüssel mit dem neuen Kennwort in Key Vault.
  4. Die Funktions-App aktualisiert SQL Server mit dem neuen Kennwort.

Hinweis

Zwischen den Schritten 3 und 4 kann ein Abstand bestehen. Während dieses Fensters kann sich der geheime Schlüssel in Key Vault nicht bei SQL Server authentifizieren. Wenn ein Schritt fehlschlägt, wird das Ereignisraster zwei Stunden lang erneut ausgeführt.

Voraussetzungen

Wenn Sie noch keinen Schlüsseltresor und keine SQL Server-Instanz haben, verwenden Sie diesen Bereitstellungslink:

Abbildung einer Schaltfläche mit der Bezeichnung „Bereitstellung in Azure“.

  1. Wählen Sie unter "Ressource" die Option " Neu erstellen" aus, und geben Sie der Gruppe einen Namen. In diesem Lernprogramm wird akvrotation verwendet.
  2. Geben Sie unter SQL-Administratoranmeldung den ANMELDEnamen des SQL-Administrators ein.
  3. Klicken Sie auf Überprüfen + erstellen.
  4. Wählen Sie "Erstellen" aus.

Erstellen einer Ressourcengruppe

Sie verfügen jetzt über einen Schlüsseltresor und eine SQL Server-Instanz. Überprüfen Sie dieses Setup im Azure CLI:

az resource list -o table -g akvrotation

Das Ergebnis sieht in etwa wie im folgende Ausgabe aus:

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

Erstellen und stellen Sie die SQL Server-Kennwortrotationsfunktion bereit

Von Bedeutung

Für diese Vorlage müssen sich der Schlüsseltresor, die SQL-Server-Instanz und die Funktions-App in derselben Ressourcengruppe befinden.

Erstellen Sie als Nächstes eine Funktions-App mit einer vom System zugewiesenen verwalteten Identität zusammen mit den anderen erforderlichen Komponenten, und stellen Sie die SQL Server Kennwortdrehungsfunktion bereit.

Für die Funktions-App sind die folgenden Komponenten erforderlich:

  • Ein Azure App Service Plan.
  • Eine Funktions-App mit einer Funktion zur Rotation eines SQL-Kennworts, die über einen Event Grid-Trigger und einen HTTP-Trigger verfügt.
  • Ein Speicherkonto für die Triggerverwaltung der Function App.
  • Eine Azure-Rollenzuweisung, die der Identität der Funktions-App den Zugriff auf Geheimnisse im Schlüsseltresor ermöglicht.
  • Ein Event Grid-Ereignisabonnement für das SecretNearExpiry-Ereignis .
  1. Wählen Sie den Link zur Bereitstellung der Vorlage in Azure aus:

    Abbildung einer Schaltfläche mit der Bezeichnung „Bereitstellung in Azure“.

  2. Wählen Sie in der Ressourcengruppenliste"Akvrotation" aus.

  3. Geben Sie in SQL Server Name den Namen der SQL Server Instanz ein, deren Kennwort Sie drehen möchten.

  4. Geben Sie in Key Vault Name den Key-Vault-Namen ein.

  5. Geben Sie im Funktions-App-Namen den Namen der Funktions-App ein.

  6. Geben Sie unter "Geheimer Name" den geheimen Namen ein, der das Kennwort speichert.

  7. Geben Sie in der Repository-URL den GitHub Speicherort des Funktionscodes ein: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Klicken Sie auf Überprüfen + erstellen.

  9. Wählen Sie "Erstellen" aus.

Hinweis

Diese ARM-Vorlage verwendet die App Service-Quellcodeverwaltungsbereitstellung (Kudu), um den Funktionscode aus GitHub abzurufen. Für Produktionsworkloads empfehlen wir stattdessen eine paketbasierte Bereitstellung wie func azure functionapp publish oder ZIP-Bereitstellung mit WEBSITE_RUN_FROM_PACKAGE.

Wählen Sie

Nachdem Sie die vorstehenden Schritte ausgeführt haben, verfügen Sie über ein Speicherkonto, eine Serverfarm und eine Funktions-App. Überprüfen Sie dieses Setup im Azure CLI:

az resource list -o table -g akvrotation

Das Ergebnis sieht in etwa wie im folgende Ausgabe aus:

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

Weitere Informationen zum Erstellen einer Funktions-App und zum Verwenden einer verwalteten Identität für den Zugriff auf Key Vault finden Sie unter Erstellen einer Funktions-App aus dem Azure-Portal, Verwenden der verwalteten Identität für App Service und Azure Functions und Bereitstellen des Zugriffs auf Key Vault mit Azure RBAC.

Hinweis

Die Beispielfunktion zielt auf das .NET In-Process-Modell für Azure Functions ab. Verwenden Sie für Neuentwicklungen das isolierte .NET-Workermodell, das künftig das unterstützte Modell ist.

Rotationsfunktion

Die im vorherigen Schritt bereitgestellte Funktion verwendet ein Ereignis, um eine geheime Drehung auszulösen. Sie aktualisiert Key Vault und die SQL-Datenbank.

Funktionstriggerereignis

Diese Funktion liest Ereignisdaten und führt die Drehungslogik aus:

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);
   }
}

Geheime Drehungslogik

Diese Rotationsmethode liest Datenbankinformationen aus dem Geheimnis, erstellt eine neue Version des Geheimnisses und aktualisiert die Datenbank mit dem neuen Geheimnis.

    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");
        }
}

Den vollständigen Code finden Sie unter GitHub.

Hinzufügen des geheimen Schlüssels zu Key Vault

Weisen Sie sich selbst die Rolle Key Vault Secrets Officer zu, damit Sie Geheimnisse im Schlüsseltresor verwalten können:

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

Erstellen Sie einen geheimen Schlüssel mit Tags, die die SQL Server Ressourcen-ID, den SQL Server Anmeldenamen und den geheimen Gültigkeitszeitraum in Tagen enthalten. Legen Sie den Namen des Geheimnisses, das ursprüngliche Passwort aus der SQL-Datenbank (Simple123 in diesem Beispiel) und ein auf morgen gesetztes Ablaufdatum fest, sodass die Rotation sofort ausgelöst wird.

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

Wenn Sie eine kurze Ablaufzeit festlegen, wird innerhalb von 15 Minuten ein SecretNearExpiry-Ereignis veröffentlicht, das die Funktion zum Rotieren des Secrets auslöst.

Testen und Überprüfen

Um zu überprüfen, ob das Geheimnis rotiert wurde, navigieren Sie zu Key Vault>Secrets:

Screenshot, der zeigt, wie Sie auf Key Vault > Secrets zugreifen können.

Öffnen Sie das sqlPassword-Geheimnis und zeigen Sie die ursprünglichen und ersetzten Versionen an:

Gehe zu den Geheimnissen

Erstellen einer Web-App

Um die SQL-Anmeldeinformationen zu überprüfen, erstellen Sie eine Web-App. Die Web-App ruft den geheimen Schlüssel aus Key Vault ab, extrahiert die SQL-Datenbankinformationen und Anmeldeinformationen aus dem geheimen Schlüssel und testet die Verbindung mit SQL Server.

Für die Web-App sind die folgenden Komponenten erforderlich:

  • Eine Web-App mit einer vom System zugewiesenen verwalteten Identität.
  • Eine Rollenzuweisung, mit der die verwaltete Identität der Web-App geheime Schlüssel im Schlüsseltresor lesen kann.
  1. Wählen Sie den Link zur Bereitstellung der Vorlage in Azure aus:

    Abbildung einer Schaltfläche mit der Bezeichnung „Bereitstellung in Azure“.

  2. Wählen Sie die Akvrotation-Ressourcengruppe aus.

  3. Geben Sie in SQL Server Namen den SQL Server Namen ein, dessen Kennwort Sie gedreht haben.

  4. Geben Sie in Key Vault Name den Key-Vault-Namen ein.

  5. Geben Sie unter "Geheimer Name" den geheimen Namen ein, der das Kennwort speichert.

  6. Geben Sie in der Repository-URL den GitHub Speicherort des Web-App-Codes ein: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Klicken Sie auf Überprüfen + erstellen.

  8. Wählen Sie "Erstellen" aus.

Öffnen der Web-App

Wechseln Sie zur bereitgestellten Anwendungs-URL: https://akvrotation-app.azurewebsites.net/.

Wenn die Anwendung im Browser geöffnet wird, zeigt die Seite den generierten geheimen Wert und einen Datenbankverbindungswert von true.

Verwenden von KI zum Anpassen der Drehungsfunktion für Ihre Datenbank

In diesem Tutorial wird die Schlüsselrotation für SQL Server demonstriert, aber Sie können die Rotationsfunktion für andere Datenbanktypen anpassen. GitHub Copilot kann Ihnen helfen, den Code der Rotationsfunktion so anzupassen, dass er mit Ihrer Datenbank oder Ihrem Anmeldeinformationstyp funktioniert.

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 kann Ihnen auch helfen, dieses Muster für andere Anmeldedatentypen wie API-Schlüssel, Verbindungszeichenfolgen oder Dienstkonto-Kennwörter anzupassen.

GitHub Copilot wird von KI unterstützt, sodass Überraschungen und Fehler möglich sind. Weitere Informationen finden Sie unter Copilot FAQs.

Erfahren Sie mehr