Automatisera rotationen av en hemlighet för resurser som använder en uppsättning autentiseringsuppgifter

Det bästa sättet att autentisera till Azure tjänster är med en hanterad identitet, men vissa scenarier kräver en åtkomstnyckel, ett lösenord eller en annan hemlighet. Rotera dessa hemligheter regelbundet för att minska effekten av en läckt autentiseringsuppgift.

Den här handledningen visar hur du automatiserar regelbunden rotation av hemligheter för databaser och tjänster som använder en och samma uppsättning autentiseringsuppgifter. En översikt över autorotation över olika tillgångstyper finns i Förstå autorotation i Azure Key Vault.

Mer specifikt roterar den här självstudien ett SQL Server lösenord som lagras i Azure Key Vault med hjälp av en funktion som utlöses av ett Azure Event Grid-meddelande:

Tip

För Azure SQL Database och Azure SQL Managed Instance föredrar du endast Microsoft Entra autentisering framför SQL-inloggningar. Använd mönstret för lösenordsrotation i den här självstudien endast när en arbetsbelastning kräver SQL-autentisering.

Diagram över rotationslösning

  1. Trettio dagar före förfallodatumet för en hemlighet publicerar Key Vault händelsen "nära utgångsdatum" till Event Grid.
  2. Event Grid kontrollerar händelseprenumerationerna och använder HTTP POST för att anropa funktionsappens slutpunkt som prenumererar på händelsen.
  3. Funktionsappen tar emot hemlig information, genererar ett nytt slumpmässigt lösenord och skapar en ny version för hemligheten med det nya lösenordet i Key Vault.
  4. Funktionsappen uppdaterar SQL Server med det nya lösenordet.

Anmärkning

Det kan finnas en fördröjning mellan steg 3 och 4. Under den tiden kan hemligheten i Key Vault inte användas för att autentisera mot SQL Server. Om något steg misslyckas försöker Event Grid igen i två timmar.

Förutsättningar

Om du inte redan har ett nyckelvalv och SQL Server instans använder du den här distributionslänken:

Image med en knapp med etiketten

  1. Under Resursgrupp väljer du Skapa ny och ger gruppen ett namn. I den här självstudien används akvrotation.
  2. Under SQL-administratörsinloggning anger du inloggningsnamnet för SQL-administratören.
  3. Välj Förhandsgranska + skapa.
  4. Välj Skapa.

Skapa en resursgrupp

Nu har du ett nyckelvalv och en SQL Server instans. Kontrollera den här konfigurationen i Azure CLI:

az resource list -o table -g akvrotation

Resultatet ser ut ungefär som följande utdata:

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

Skapa och distribuera funktionen SQL Server lösenordsrotation

Viktigt!

Den här mallen kräver att nyckelvalvet, SQL Server-instansen och funktionsappen finns i samma resursgrupp.

Skapa sedan en funktionsapp med en systemtilldelad hanterad identitet tillsammans med de andra nödvändiga komponenterna och distribuera funktionen SQL Server lösenordsrotation.

Funktionsappen kräver följande komponenter:

  • En Azure App Service plan.
  • En funktionsapp med en SQL-lösenordsrotationsfunktion som har en Event Grid-utlösare och en HTTP-utlösare.
  • Ett lagringskonto för funktionsappens utlösarhantering.
  • En rolltilldelning i Azure som ger funktionsappens identitet åtkomst till hemligheter i nyckelvalvet.
  • En Event Grid-händelseprenumeration för SecretNearExpiry-händelsen .
  1. Välj Azure mallens distributionslänk:

    Image med en knapp med etiketten

  2. I listan Resursgrupp väljer du akvrotation.

  3. I SQL Server Namn anger du namnet på den SQL Server instans vars lösenord du vill rotera.

  4. I Key Vault Namn anger du namnet på key vault.

  5. I Funktionsappens namn anger du funktionsappens namn.

  6. I Hemligt namn anger du det hemliga namn som lagrar lösenordet.

  7. I Repo-URL anger du GitHub plats för funktionskoden: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Välj Förhandsgranska + skapa.

  9. Välj Skapa.

Anmärkning

Den här ARM-mallen använder App Service-distributionen för källkontroll (Kudu) för att hämta funktionskoden från GitHub. För en produktionsarbetsbelastning rekommenderar vi en paketbaserad distribution, till exempel func azure functionapp publish eller zip-distribution med WEBSITE_RUN_FROM_PACKAGE i stället.

Välj Granska+skapa

När du har slutfört föregående steg har du ett lagringskonto, en servergrupp och en funktionsapp. Kontrollera den här konfigurationen i Azure CLI:

az resource list -o table -g akvrotation

Resultatet ser ut ungefär som följande utdata:

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

Mer information om hur du skapar en funktionsapp och använder en hanterad identitet för att komma åt Key Vault finns i Skapa en funktionsapp från Azure-portalen, Använda hanterad identitet för App Service och Azure Functions och Ge åtkomst till Key Vault med Azure RBAC.

Anmärkning

Exempelfunktionen riktar sig till .NET processmodell för Azure Functions. För ny utveckling använder du den .NET isolerade arbetsmodellen, som är den modell som stöds framöver.

Rotationsfunktion

Funktionen som distribuerades i föregående steg använder en händelse för att utlösa hemlig rotation. Den uppdaterar Key Vault och SQL-databasen.

Händelse för funktionsutlösare

Den här funktionen läser händelsedata och kör rotationslogik:

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

Hemlig rotationslogik

Den här rotationsmetoden läser databasinformation från hemligheten, skapar en ny version av hemligheten och uppdaterar databasen med den nya hemligheten:

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

Du hittar den fullständiga koden på GitHub.

Lägg till hemligheten i Key Vault

Tilldela dig själv rollen Key Vault Secrets Officer så att du kan hantera hemligheter i valvet:

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

Skapa en hemlighet med taggar som innehåller SQL Server resurs-ID, SQL Server inloggningsnamn och hemlighetens giltighetsperiod i dagar. Ange det hemliga namnet, det första lösenordet från SQL-databasen (Simple123 i det här exemplet) och ett förfallodatum inställt på i morgon så att rotationen utlöses omedelbart.

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

Om du anger ett kort förfallodatum publiceras en SecretNearExpiry händelse inom 15 minuter, vilket utlöser funktionen för att rotera hemligheten.

Testa och verifiera

Om du vill kontrollera att hemligheten har roterats går du till Key Vault>Secrets:

Screenshot som visar hur du kommer åt Key Vault > Secrets.

Öppna sqlPassword-hemligheten och visa de ursprungliga och roterade versionerna:

Gå till Hemligheter

Skapa en webbapp

Om du vill verifiera SQL-autentiseringsuppgifterna skapar du en webbapp. Webbappen hämtar hemligheten från Key Vault, extraherar SQL-databasinformationen och autentiseringsuppgifterna från hemligheten och testar anslutningen till SQL Server.

Webbappen kräver följande komponenter:

  • En webbapp med en systemtilldelad hanterad identitet.
  • En rolltilldelning som gör att webbappens hanterade identitet kan läsa hemligheter i nyckelvalvet.
  1. Välj Azure mallens distributionslänk:

    Image med en knapp med etiketten

  2. Välj resursgruppen akvrotation .

  3. I SQL Server Namn anger du det SQL Server namn vars lösenord du roterade.

  4. I Key Vault Namn anger du namnet på key vault.

  5. I Hemligt namn anger du det hemliga namn som lagrar lösenordet.

  6. I Repo-URL anger du GitHub plats för webbappkoden: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Välj Förhandsgranska + skapa.

  8. Välj Skapa.

Öppna webbappen

Gå till den distribuerade program-URL:en: https://akvrotation-app.azurewebsites.net/.

När applikationen öppnas i webbläsaren visar sidan det genererade hemliga värdet och ett Databasanslutning-värde på true.

Använda AI för att anpassa rotationsfunktionen för databasen

Den här självstudien visar hemlig rotation för SQL Server, men du kan anpassa rotationsfunktionen för andra databastyper. GitHub Copilot kan hjälpa dig att ändra rotationsfunktionskoden så att den fungerar med din databas eller typ av autentiseringsuppgifter.

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 också hjälpa dig att anpassa det här mönstret för andra typer av autentiseringsuppgifter som API-nycklar, anslutningssträngar eller lösenord för tjänstkonto.

GitHub Copilot drivs av AI, så överraskningar och misstag är möjliga. Mer information finns i vanliga frågor och svar om Copilot.

Lära sig mer