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 att använda en hanterad identitet ,men det finns vissa scenarier där det inte är ett alternativ. I dessa fall används åtkomstnycklar eller hemligheter. Du bör regelbundet rotera åtkomstnycklar eller hemligheter.

Den här självstudien visar hur du automatiserar periodisk rotation av hemligheter för databaser och tjänster som använder en uppsättning autentiseringsuppgifter. Mer specifikt roterar den här självstudien 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:

Diagram över rotationslösning

  1. 30 dagar före förfallodatumet för en hemlighet Key Vault publicerar händelsen "nära att gå ut" Event Grid.
  2. Event Grid kontrollerar händelseprenumerationer och använder HTTP POST för att anropa funktionsappens slutpunkt som prenumererar på händelsen.
  3. Funktionsappen tar emot den hemliga informationen, 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.

Anteckning

Det kan finnas en fördröjning mellan steg 3 och 4. Under den tiden kommer hemligheten i Key Vault inte att kunna autentisera till SQL Server. Om något av stegen misslyckas kan du Event Grid i två timmar.

Förutsättningar

Distributionslänken nedan kan användas om du inte har några befintliga Key Vault och SQL Server:

Bild som visar en knapp med etiketten "Distribuera till Azure".

  1. Under Resursgrupp väljer du Skapa ny. Ge gruppen ett namn. Vi använder akvrotation i den här självstudien.
  2. Under Sql Admin Login (Inloggning för SQL-administratör) skriver du sql-administratörens inloggningsnamn.
  3. Välj Granska + skapa.
  4. Välj Skapa

Skapa en resursgrupp

Nu har du en Key Vault och en SQL Server instans. Du kan kontrollera den här konfigurationen i Azure CLI genom att köra följande kommando:

az resource list -o table -g akvrotation

Resultatet ser ut ungefär så här:

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 sql server-funktionen för lösenordsrotation

Viktigt

Mallen nedan kräver Key Vault, SQL Server och Azure Function finns i samma resursgrupp

Skapa sedan en funktionsapp med en system hanterad identitet, utöver de andra nödvändiga komponenterna, och distribuera sql server-lösenordsrotationsfunktioner

Funktionsappen kräver följande komponenter:

  • En Azure App Service plan
  • En funktionsapp med sql-lösenordsrotationsfunktioner med händelseutlösare och HTTP-utlösare
  • Ett lagringskonto som krävs för hantering av funktionsapputlösare
  • En åtkomstprincip för funktionsappens identitet för att få åtkomst till hemligheter i Key Vault
  • En EventGrid-händelseprenumeration för SecretNearExpiry-händelse
  1. Välj länken för Azure-malldistribution:

    Bild som visar en knapp med etiketten "Distribuera till Azure".

  2. I listan Resursgrupp väljer du akvrotation.

  3. I SQL Server-namn skriver du sql Server-namnet med lösenordet som ska roteras

  4. I Key Vault anger du namnet på nyckelvalvet

  5. I Funktionsappens namn anger du funktionsappens namn

  6. I Hemlighetsnamn skriver du ett hemligt namn där lösenordet ska lagras

  7. I lagringsplatsens URL skriver du funktionskoden GitHub location ( https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git )

  8. Välj Granska + skapa.

  9. Välj Skapa.

Välj Granska och skapa

När du har slutfört föregående steg har du ett lagringskonto, en servergrupp och en funktionsapp. Du kan kontrollera den här konfigurationen i Azure CLI genom att köra följande kommando:

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

Information om hur du skapar en funktionsapp och använder hanterad identitet för att få åtkomst till Key Vault finns i Skapa en funktionsappfrån Azure Portal , Använda hanterad identitet för App Service och Azure Functionsoch Tilldela en Key Vault-åtkomstprincipmed hjälp av Azure Portal .

Rotationsfunktion

Funktionen som distribuerades i föregående steg använder en händelse för att utlösa rotationen av en hemlighet genom att Key Vault och SQL-databasen.

Funktionsutlösarhändelse

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

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

Logik för hemlig rotation

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

Ange din åtkomstprincip för att bevilja användare behörighet att hantera hemligheter:

az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list

Skapa en ny hemlighet med taggar som innehåller SQL Server resurs-ID, SQL Server inloggningsnamn och giltighetsperiod för hemligheten i dagar. Ange namnet på hemligheten, det första lösenordet från SQL-databasen (i vårt exempel "Simple123") och inkludera ett förfallodatum som är inställt på imorgon.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyy-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

Om du skapar en hemlighet med ett kort förfallodatum publiceras en händelse inom 15 minuter, vilket i sin tur utlöser SecretNearExpiry funktionen för att rotera hemligheten.

Testa och verifiera

Kontrollera att hemligheten har roterats genom att gå till Key Vault > Hemligheter:

Skärmbild som visar hur du kommer åt Key Vault > hemligheter.

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

Gå till Hemligheter

Skapa en webbapp

Skapa en webbapp för att verifiera SQL-autentiseringsuppgifterna. Den här webbappen hämtar hemligheten från Key Vault, extraherar SQL-databasinformation och autentiseringsuppgifter från hemligheten och testar anslutningen till SQL Server.

Webbappen kräver följande komponenter:

  • En webbapp med system hanterad identitet
  • En åtkomstprincip för att komma åt hemligheter i Key Vault via hanterad identitet för webbapp
  1. Välj länken för Azure-malldistribution:

    Bild som visar en knapp med etiketten "Distribuera till Azure".

  2. Välj resursgruppen akvrotation.

  3. I SQL Server-namn skriver du sql Server-namnet med lösenordet som ska roteras

  4. I Key Vault anger du namnet på nyckelvalvet

  5. I Hemlighetsnamn skriver du ett hemligt namn där lösenordet lagras

  6. I lagringsplatsens URL skriver du webbappkoden GitHub location ( https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git )

  7. Välj Granska + skapa.

  8. Välj Skapa.

Öppna webbappen

Gå till url:en för det distribuerade programmet:

'https://akvrotation-app.azurewebsites.net/'

När programmet öppnas i webbläsaren visas genererat hemlighetsvärde och värdet Databasanslutensant.

Läs mer