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 SQL Server hasła przechowywane w usłudze Azure Key Vault przy użyciu funkcji wyzwalanej przez powiadomienie Azure Event Grid:

Diagram rozwiązania rotacji

  1. Trzydzieści dni przed datą wygaśnięcia wpisu tajnego Key Vault publikuje zdarzenie "bliskie wygaśnięcia" w usłudze 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 funkcji odbiera informacje o wpisie tajnym, generuje nowe losowe hasło i tworzy nową wersję wpisu tajnego z nowym hasłem w Key Vault.
  4. Aplikacja funkcji aktualizuje 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 Key Vault nie będzie mógł uwierzytelniać się w 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ących Key Vault i 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 SQL Administracja Login wpisz nazwę logowania administratora SQL.
  3. Wybierz pozycję Przejrzyj i utwórz.
  4. Wybierz pozycję Utwórz

Tworzenie grupy zasobów

Masz teraz Key Vault i wystąpienie 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 znajdowały 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 Azure App Service
  • 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 Key Vault
  • Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry
  1. Wybierz link wdrażania szablonu platformy Azure:

    Obraz przedstawiający przycisk z etykietą

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

  3. W polu Nazwa SQL Server wpisz nazwę SQL Server z hasłem, które chcesz obrócić

  4. W polu nazwa Key Vault 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 GitHub location (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Wybierz pozycję Przejrzyj i utwórz.

  9. Wybierz pozycję Utwórz.

Wybierz pozycję Przejrzyj i 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 Key Vault, zobacz Tworzenie aplikacji funkcji na podstawie Azure Portal, Jak używać tożsamości zarządzanej na potrzeby App Service i Azure Functions oraz Przypisywanie zasad dostępu Key Vault przy użyciu Azure Portal.

Funkcja Rotacja

Wdrożona w poprzedniej funkcji kroku używa zdarzenia, aby wyzwolić rotację wpisu tajnego przez zaktualizowanie 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 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 SQL Server, nazwę logowania 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 spowoduje wyzwolenie funkcji w celu rotacji wpisu tajnego.

Testowanie i weryfikowanie

Aby sprawdzić, czy wpis tajny został obrócony, przejdź do pozycji Key Vault>Secrets:

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

Otwórz wpis tajny sqlPassword i wyświetl oryginalne i obrócone wersje:

Przejdź do wpisów tajnych

Tworzenie aplikacji internetowej

Aby zweryfikować poświadczenia SQL, utwórz aplikację internetową. Ta aplikacja internetowa pobierze wpis tajny z Key Vault, wyodrębni informacje i poświadczenia bazy danych SQL z wpisu tajnego oraz przetestuje połączenie z 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 Key Vault za pośrednictwem tożsamości zarządzanej aplikacji internetowej
  1. Wybierz link wdrażania szablonu platformy Azure:

    Obraz przedstawiający przycisk z etykietą

  2. Wybierz grupę zasobów akvrotation .

  3. W polu Nazwa SQL Server wpisz nazwę SQL Server z hasłem, które chcesz obrócić

  4. W polu nazwa Key Vault wpisz nazwę magazynu kluczy

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

  6. W polu Adres URL repozytorium wpisz kod aplikacji internetowej Lokalizacja usługi GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Wybierz pozycję Przejrzyj i utwórz.

  8. 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ą danychwartość true.

Więcej tutaj