Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Najlepszym sposobem na uwierzytelnienie się w usługach Azure jest użycie zarządzanej tożsamości, ale są pewne scenariusze, w których nie jest to możliwe. W takich przypadkach używane są klucze dostępu lub tajne dane. Należy okresowo obracać klucze dostępu lub sekrety.
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. Aby zapoznać się z kompleksowym omówieniem pojęć i korzyści związanych z autorotacją w różnych typach zasobów, zobacz Zrozumienie autorotacji w usłudze Azure Key Vault.
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 tajemnicy, usługa Key Vault publikuje zdarzenie "bliskie wygaśnięcia" do usługi 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 funkcjonalna otrzymuje tajne informacje, generuje nowe losowe hasło i tworzy nową wersję tajemnicy z nowym hasłem w usłudze Key Vaulta.
- Aplikacja funkcjonalna aktualizuje serwer SQL za pomocą nowego hasła.
Uwaga
Może wystąpić opóźnienie między krokami 3 i 4. W tym czasie tajny klucz w usłudze Key Vault nie będzie mógł uwierzytelniać na serwerze 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 opcję Recenzja i utwórz.
- Wybierz pozycję Utwórz
Teraz będziesz mieć Azure Key Vault i instancję 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 Azure App Service
- Aplikacja funkcyjna z funkcjami rotacji haseł SQL z wyzwalaczem zdarzeń i wyzwalaczem HTTP
- Konto magazynowe wymagane do zarządzania wyzwalaczami aplikacji funkcji
- Zasady dostępu dla tożsamości aplikacji Function App umożliwiające uzyskanie dostępu do sekretów w usłudze Key Vault
- Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry
Wybierz łącze do wdrożenia szablonu 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 opcję Recenzja i utwórz.
Wybierz Utwórz.
Po wykonaniu powyższych kroków uzyskasz dostęp do konta magazynowego, farmy serwerów i aplikacji funkcjonalnej. Tę konfigurację można zweryfikować w interfejsie wiersza polecenia platformy Azure, uruchamiając następujące polecenie:
az resource list -o table -g akvrotation
Efekt będzie przypominał poniższy rezultat:
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 Obrót
Wdrożona w poprzednim etapie funkcja używa zdarzenia, aby zainicjować rotację tajemnicy przez zaktualizowanie Key Vault oraz bazy danych SQL.
Zdarzenie uruchomienia 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 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.
Dodaj tajemnicę do Key Vault
Ustaw zasady dostępu, aby udzielić użytkownikom uprawnień do zarządzania tajemnicami:
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ę sekretu, początkowe hasło dla bazy danych SQL (w naszym przykładzie "Simple123") i dodaj 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 tajemnicy z krótką datą wygaśnięcia spowoduje opublikowanie SecretNearExpiry zdarzenia w ciągu 15 minut, co z kolei wyzwoli funkcję rotacji tajemnicy.
Testowanie i weryfikowanie
Aby sprawdzić, czy wpis tajny został obracany, przejdź do pozycjiWpisy tajne>:
Otwórz tajny element sqlPassword i wyświetl oryginalną oraz zaktualizowaną wersję:
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
- Polityka dostępu do tajemnic w usłudze Key Vault za pośrednictwem zarządzanej tożsamości aplikacji internetowej
Wybierz łącze do wdrożenia szablonu 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ę kodu aplikacji internetowej w usłudze GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Wybierz opcję Recenzja i utwórz.
Wybierz 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ą tajną wartość i połączenie z bazą danych o wartości prawda.