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

Najlepszym sposobem uwierzytelniania w usługach Azure jest użycie managed identity ale istnieją pewne scenariusze, w których nie jest to opcja. 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 autowachlowaniem w różnych typach zasobach, zobacz Zrozumienie autowachlowania w Azure Key Vault.

W szczególności, ten samouczek obraca hasła serwera SQL przechowywane w Azure Key Vault, przy użyciu funkcji wyzwalanej przez powiadomienie z Azure Event Grid.

Diagram rozwiązania rotacji

  1. Trzydzieści dni przed datą wygaśnięcia sekretu, 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 funkcji odbiera informacje poufne, generuje nowe losowe hasło i tworzy nową wersję sekretu 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 tajna wartość w Key Vault nie będzie mogła uwierzytelnić się wobec 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:

Image 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

Masz teraz Key Vault i wystąpienie SQL Server. Tę konfigurację można zweryfikować w Azure CLI, 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 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 usługi Azure App
  • Aplikacja funkcyjna z funkcjami rotacji haseł SQL z wyzwalaczem zdarzeń i wyzwalaczem HTTP
  • Konto magazynowe wymagane do zarządzania wyzwalaczami aplikacji funkcji
  • Przypisanie roli RBAC Azure do tożsamości aplikacji funkcji w celu uzyskiwania dostępu do tajemnic w Key Vault
  • Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry
  1. Wybierz link wdrażania szablonu Azure:

    Image przedstawiający przycisk z etykietą

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

  3. W Nazwa SQL Server wpisz nazwę SQL Server oraz hasło, aby je zmienić.

  4. W Key Vault Name 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 Repo Url wpisz lokalizację kodu funkcji na GitHubie (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 Azure CLI, 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 Key Vault, zobacz Utwórz aplikację funkcji z portalu Azure, Jak używać tożsamości zarządzanej dla usługi App Service i Azure Functions oraz Podaj dostęp do Key Vault za pomocą kontroli dostępu opartej na rolach Azure.

Funkcja Obrót

Funkcja kroku wdrożona w poprzednim kroku używa zdarzenia, aby wyzwolić rotację tajemnicy przez zaktualizowanie Key Vault i 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 GitHub.

Dodaj sekret do Key Vault

Ustaw zasady dostępu, aby udzielić użytkownikom uprawnień do zarządzania tajemnicami:

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

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ę 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("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

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 tajemnica została zrotowana, przejdź do Key Vault>Secrets:

Screenshot pokazujący, jak uzyskać dostęp do Key Vault > Secrets.

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 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 tajemnic w Key Vault za pośrednictwem tożsamości zarządzanej aplikacji webowej
  1. Wybierz link wdrażania szablonu Azure:

    Image przedstawiający przycisk z etykietą

  2. Wybierz grupę zasobów akvrotation .

  3. W polu Nazwa SQL Server wpisz nazwę SQL Server oraz hasło, aby je zaktualizować.

  4. W Key Vault Name wpisz nazwę Key Vault

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

  6. W Repo Url wpisz lokalizację kodu aplikacji webowej w 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.

Dostosowywanie funkcji rotacji bazy danych za pomocą sztucznej inteligencji

W tym samouczku przedstawiono rotację tajnych danych dla SQL Server, ale można dostosować mechanizm rotacji dla innych typów baz danych. GitHub Copilot w programie VS Code może pomóc zmodyfikować kod funkcji rotacji, aby pracować z określoną bazą danych lub typem poświadczeń.

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 może również pomóc w dostosowaniu tego wzorca dla innych typów poświadczeń, takich jak klucze API, ciągi połączenia lub hasła konta usługi.

GitHub Copilot jest obsługiwana przez sztuczną inteligencję, więc możliwe są niespodzianki i błędy. Aby uzyskać więcej informacji, zobacz Copilot CZĘSTO zadawane pytania.

Dowiedz się więcej