Automatyzowanie rotacji wpisu tajnego dla zasobów korzystających z jednego zestawu poświadczeń uwierzytelniania
Najlepszym sposobem uwierzytelniania w usługach platformy Azure jest użycie tożsamości zarządzanej, ale istnieją pewne scenariusze, w których nie jest to opcja. W takich przypadkach używane są klucze dostępu lub wpisy tajne. Należy okresowo obracać klucze dostępu lub wpisy tajne.
W tym samouczku pokazano, jak zautomatyzować okresową rotację wpisów tajnych dla baz danych i usług korzystających z jednego zestawu poświadczeń uwierzytelniania. W szczególności ten samouczek obraca hasła programu SQL Server przechowywane w usłudze Azure Key Vault przy użyciu funkcji wyzwalanej przez powiadomienie usługi Azure Event Grid:
- Trzydzieści dni przed datą wygaśnięcia wpisu tajnego usługa Key Vault publikuje zdarzenie "bliskie wygaśnięcia" usłudze Event Grid.
- Usługa Event Grid sprawdza subskrypcje zdarzeń i używa żądania HTTP POST do wywołania punktu końcowego aplikacji funkcji subskrybowanego do zdarzenia.
- Aplikacja funkcji odbiera informacje o wpisie tajnym, generuje nowe losowe hasło i tworzy nową wersję wpisu tajnego przy użyciu nowego hasła w usłudze Key Vault.
- Aplikacja funkcji aktualizuje program SQL Server przy użyciu nowego hasła.
Uwaga
Może wystąpić opóźnienie między krokami 3 i 4. W tym czasie wpis tajny w usłudze Key Vault nie będzie mógł uwierzytelniać się w programie SQL Server. W przypadku niepowodzenia dowolnego z kroków usługa Event Grid ponawia próbę przez dwie godziny.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- Azure Key Vault
- SQL Server
Jeśli nie masz istniejącej usługi Key Vault i programu SQL Server, możesz użyć tego linku wdrożenia:
- W obszarze Grupa zasobów wybierz pozycję Utwórz nową. Nadaj grupie nazwę. W tym samouczku użyjemy funkcji akvrotation .
- W obszarze Identyfikator logowania administratora SQL wpisz nazwę logowania administratora SQL.
- Wybierz pozycję Przejrzyj i utwórz.
- Wybierz pozycję Utwórz
Teraz będziesz mieć usługę Key Vault i wystąpienie programu SQL Server. Tę konfigurację można zweryfikować w interfejsie wiersza polecenia platformy Azure, uruchamiając następujące polecenie:
az resource list -o table -g akvrotation
Wynik będzie wyglądać następująco:
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
Tworzenie i wdrażanie funkcji rotacji haseł programu SQL Server
Ważne
Ten szablon wymaga, aby magazyn kluczy, program SQL Server i funkcja platformy Azure znajdowali się w tej samej grupie zasobów.
Następnie utwórz aplikację funkcji z tożsamością zarządzaną przez system, oprócz innych wymaganych składników i wdróż funkcje rotacji haseł programu SQL Server
Aplikacja funkcji wymaga następujących składników:
- Plan usługi aplikacja systemu Azure
- Aplikacja funkcji z funkcjami rotacji haseł SQL z wyzwalaczem zdarzeń i wyzwalaczem http
- Konto magazynu wymagane do zarządzania wyzwalaczem aplikacji funkcji
- Zasady dostępu dla tożsamości aplikacji funkcji w celu uzyskania dostępu do wpisów tajnych w usłudze Key Vault
- Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry
Wybierz link wdrażania szablonu platformy Azure:
Na liście Grupa zasobów wybierz pozycję akvrotation.
W polu Nazwa programu SQL Server wpisz nazwę programu SQL Server z hasłem do rotacji
W polu Nazwa magazynu kluczy wpisz nazwę magazynu kluczy
W polu Nazwa aplikacji funkcji wpisz nazwę aplikacji funkcji
W polu Nazwa wpisu tajnego wpisz nazwę wpisu tajnego, w którym będzie przechowywane hasło
W adresie URL repozytorium wpisz kod funkcji Lokalizacja usługi GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Wybierz pozycję Przejrzyj i utwórz.
Wybierz pozycję Utwórz.
Po wykonaniu powyższych kroków będziesz mieć konto magazynu, farmę serwerów i aplikację funkcji. Tę konfigurację można zweryfikować w interfejsie wiersza polecenia platformy Azure, uruchamiając następujące polecenie:
az resource list -o table -g akvrotation
Wynik będzie wyglądać podobnie do następujących danych wyjściowych:
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
Aby uzyskać informacje na temat tworzenia aplikacji funkcji i używania tożsamości zarządzanej do uzyskiwania dostępu do usługi Key Vault, zobacz Tworzenie aplikacji funkcji w witrynie Azure Portal, How to use managed identity for App Service and Azure Functions (Jak używać tożsamości zarządzanej dla usług App Service i Azure Functions) oraz Assign a Key Vault access policy using the Azure Portal (Przypisywanie zasad dostępu usługi Key Vault przy użyciu witryny Azure Portal).
Funkcja Rotacja
Wdrożona w poprzedniej funkcji kroku używa zdarzenia, aby wyzwolić rotację wpisu tajnego przez zaktualizowanie usługi Key Vault i bazy danych SQL.
Zdarzenie wyzwalacza funkcji
Ta funkcja odczytuje dane zdarzeń i uruchamia logikę rotacji:
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);
}
}
Logika rotacji wpisów tajnych
Ta metoda rotacji odczytuje informacje o bazie danych z wpisu tajnego, tworzy nową wersję wpisu tajnego i aktualizuje bazę danych przy użyciu nowego wpisu tajnego:
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");
}
}
Pełny kod można znaleźć w witrynie GitHub.
Dodawanie wpisu tajnego do usługi Key Vault
Ustaw zasady dostępu, aby udzielić użytkownikom uprawnień do zarządzania wpisami tajnymi :
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
Utwórz nowy wpis tajny z tagami zawierającymi identyfikator zasobu programu SQL Server, nazwę logowania programu SQL Server i okres ważności wpisu tajnego w dniach. Podaj nazwę wpisu tajnego, początkowe hasło z bazy danych SQL (w naszym przykładzie "Simple123") i podaj datę wygaśnięcia ustawioną na jutro.
$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
Utworzenie wpisu tajnego z krótką datą wygaśnięcia spowoduje opublikowanie SecretNearExpiry
zdarzenia w ciągu 15 minut, co z kolei wyzwoli funkcję w celu rotacji wpisu tajnego.
Testowanie i weryfikowanie
Aby sprawdzić, czy wpis tajny został obracany, przejdź do pozycji Wpisy tajne usługi Key Vault>:
Otwórz wpis tajny sqlPassword i wyświetl oryginalne i obrócone wersje:
Tworzenie aplikacji internetowej
Aby zweryfikować poświadczenia SQL, utwórz aplikację internetową. Ta aplikacja internetowa pobierze wpis tajny z usługi Key Vault, wyodrębni informacje i poświadczenia bazy danych SQL z wpisu tajnego oraz przetestuje połączenie z programem SQL Server.
Aplikacja internetowa wymaga następujących składników:
- Aplikacja internetowa z tożsamością zarządzaną przez system
- Zasady dostępu do uzyskiwania dostępu do wpisów tajnych w usłudze Key Vault za pośrednictwem tożsamości zarządzanej aplikacji internetowej
Wybierz link wdrażania szablonu platformy Azure:
Wybierz grupę zasobów akvrotation .
W polu Nazwa programu SQL Server wpisz nazwę programu SQL Server z hasłem do rotacji
W polu Nazwa magazynu kluczy wpisz nazwę magazynu kluczy
W polu Nazwa wpisu tajnego wpisz nazwę wpisu tajnego, w którym jest przechowywane hasło
W adresie URL repozytorium wpisz lokalizację usługi GitHub w kodzie aplikacji internetowej (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Wybierz pozycję Przejrzyj i utwórz.
Wybierz pozycję Utwórz.
Otwieranie aplikacji internetowej
Przejdź do adresu URL wdrożonej aplikacji:
"https://akvrotation-app.azurewebsites.net/"
Po otwarciu aplikacji w przeglądarce zobaczysz wygenerowaną wartość wpisu tajnego i połączoną z bazą danych wartość true.