Udostępnij przez


Automatyzuj rotację sekretu dla zasobów używających jednolitych poświadczeń uwierzytelniania

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:

Diagram rozwiązania rotacji

  1. Trzydzieści dni przed datą wygaśnięcia tajemnicy, usługa Key Vault publikuje zdarzenie "bliskie wygaśnięcia" do usługi Event Grid.
  2. Usługa Event Grid sprawdza subskrypcje zdarzeń i używa żądania HTTP POST do wywołania punktu końcowego aplikacji funkcji subskrybowanego do zdarzenia.
  3. Aplikacja funkcjonalna otrzymuje tajne informacje, generuje nowe losowe hasło i tworzy nową wersję tajemnicy z nowym hasłem w usłudze Key Vaulta.
  4. 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

Jeśli nie masz istniejącej usługi Key Vault i programu SQL Server, możesz użyć tego linku wdrożenia:

Obraz przedstawiający przycisk z etykietą

  1. W obszarze Grupa zasobów wybierz pozycję Utwórz nową. Nadaj grupie nazwę. W tym samouczku użyjemy funkcji akvrotation .
  2. W obszarze Identyfikator logowania administratora SQL wpisz nazwę logowania administratora SQL.
  3. Wybierz opcję Recenzja i utwórz.
  4. Wybierz pozycję Utwórz

Tworzenie grupy zasobów

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
  1. Wybierz łącze do wdrożenia szablonu Azure:

    Obraz przedstawiający przycisk z etykietą

  2. Na liście Grupa zasobów wybierz pozycję akvrotation.

  3. W polu Nazwa programu SQL Server wpisz nazwę programu SQL Server z hasłem do rotacji

  4. W polu Nazwa magazynu kluczy wpisz nazwę magazynu kluczy

  5. W polu Nazwa aplikacji funkcji wpisz nazwę aplikacji funkcji

  6. W polu Nazwa wpisu tajnego wpisz nazwę wpisu tajnego, w którym będzie przechowywane hasło

  7. W adresie URL repozytorium wpisz kod funkcji Lokalizacja usługi GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Wybierz opcję Recenzja i utwórz.

  9. Wybierz Utwórz.

Wybierz pozycję Przejrzyj i 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>:

Zrzut ekranu przedstawiający sposób uzyskiwania dostępu do sekretów Key Vault >.

Otwórz tajny element sqlPassword i wyświetl oryginalną oraz zaktualizowaną wersję:

Przejdź do sekcji Sekrety

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
  1. Wybierz łącze do wdrożenia szablonu Azure:

    Obraz przedstawiający przycisk z etykietą

  2. Wybierz grupę zasobów akvrotation .

  3. W polu Nazwa programu SQL Server wpisz nazwę programu SQL Server z hasłem do rotacji

  4. W polu Nazwa magazynu kluczy wpisz nazwę magazynu kluczy

  5. W polu Nazwa wpisu tajnego wpisz nazwę wpisu tajnego, w którym jest przechowywane hasło

  6. W adresie URL repozytorium wpisz lokalizację kodu aplikacji internetowej w usłudze GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Wybierz opcję Recenzja i utwórz.

  8. 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.

Dowiedz się więcej