Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 den periodiska rotationen av hemligheter för databaser och tjänster som använder en uppsättning autentiseringsuppgifter. En omfattande översikt över autorotationsbegrepp och fördelar för olika tillgångstyper finns i Understanding autorotation i Azure Key Vault.
Mer specifikt innebär den här handledningen att lösenord för SQL Server som lagras i Azure Key Vault regelbundet ändras med hjälp av en funktion som utlöses av ett Azure Event Grid-meddelande.
- Trettio dagar före förfallodatumet för en hemlighet publicerar Key Vault händelsen "nära utgångsdatum" till Event Grid.
- Event Grid kontrollerar händelseprenumerationerna och använder HTTP POST för att anropa funktionsappens slutpunkt som prenumererar på händelsen.
- 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.
- 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 kommer hemligheten i Key Vault inte att kunna autentisera mot SQL Server. Om något av stegen misslyckas försöker Event Grid igen i två timmar.
Förutsättningar
- En Azure prenumeration – skapa en kostnadsfri.
- Azure Key Vault
- SQL Server
Om du inte har befintliga Key Vault och SQL Server kan du använda den här distributionslänken:
- Välj Skapa ny under Resursgrupp. Ge gruppen ett namn, vi använder akvrotation i den här handledningen.
- Under SQL-administratörsinloggning skriver du inloggningsnamnet för SQL-administratören.
- Välj Förhandsgranska + skapa.
- Välj Skapa
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!
Den här mallen kräver att nyckelvalvet, SQL-servern och Azure-funktionen finns i samma resursgrupp.
Skapa sedan en funktionsapp med en systemhanterad identitet, utöver de andra nödvändiga komponenterna, och distribuera SQL Server-funktioner för lösenordsrotation
Funktionsappen kräver följande komponenter:
- En Azure App Service Plan
- En funktionsapp med SQL-lösenordsroteringsfunktioner med händelseutlösare och http-utlösare
- Ett lagringskonto som krävs för funktionsappens utlösarhantering
- En Azure RBAC-rolltilldelning för funktionsappens identitet för åtkomst till hemligheter i Key Vault
- En Event Grid-händelseprenumeration för SecretNearExpiry-händelse
Välj Azure mallens distributionslänk:
I listan Resursgrupp väljer du akvrotation.
I SQL Server Name skriver du SQL Server namn med lösenord för att rotera
I nyckelvalvnamnet, ange namnet på nyckelvalvet
I funktionsappens namn skriver du funktionsappens namn
I det hemliga namnet skriver du det hemliga namn där lösenordet ska lagras
I Repo Url anger du platsen för funktionskoden på GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Välj Förhandsgranska + skapa.
Välj 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 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
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 komma åt Key Vault finns i se Skapa en funktionsapp från Azure-portalen, Så här använder du hanterad identitet för App Service och Azure Functions och Provide access to Key Vault with Azure RBAC.
Rotationsfunktion
Distribuerad i föregående steg-funktion använder en händelse för att utlösa rotationen av en hemlighet genom att uppdatera 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
Ange din åtkomstprincip för att bevilja användare behörighet att hantera hemligheter :
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 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 har angetts för morgondagen.
$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
Om du skapar en hemlighet med ett kort utgångsdatum publiceras en SecretNearExpiry händelse inom 15 minuter, vilket i sin tur utlöser funktionen för att rotera hemligheten.
Testa och verifiera
Kontrollera att hemligheten har roterats genom att gå till Key Vault>Secrets:
Öppna sqlPassword-hemligheten och visa de ursprungliga och roterade versionerna:
Skapa en webbapp
Om du vill verifiera SQL-autentiseringsuppgifterna skapar du en webbapp. 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 systemhanterad identitet
- En åtkomstprincip för åtkomst till hemligheter i Key Vault via webbappens hanterade identitet
Välj distributionslänken Azure mall:
Välj resursgruppen akvrotation .
I SQL Server Name skriver du SQL Server namn med lösenord för att rotera
I Key Vault Name anger du namnet på nyckelvalvet
I det hemliga namnet skriver du det hemliga namn där lösenordet lagras
I Repo Url skriver du webbappskod GitHub plats (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Välj Förhandsgranska + skapa.
Välj Skapa.
Öppna webbappen
Gå till den distribuerade program-URL:en:
https://akvrotation-app.azurewebsites.net/
När programmet öppnas i webbläsaren visas värdet Genererad hemlighet och värdet Database Connected 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 i VS Code kan hjälpa dig att ändra rotationsfunktionskoden så att den fungerar med din specifika databas- eller autentiseringstyp.
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.