Automatyzowanie rotacji tajnego hasła dla zasobów, które używają jednego zestawu poświadczeń uwierzytelnianiaAutomate the rotation of a secret for resources that use one set of authentication credentials

Najlepszym sposobem uwierzytelniania w usługach platformy Azure jest użycie tożsamości zarządzanej, ale w niektórych scenariuszach nie jest to możliwe.The best way to authenticate to Azure services is by using a managed identity, but there are some scenarios where that isn't an option. W takich przypadkach są używane klucze dostępu lub wpisy tajne.In those cases, access keys or secrets are used. Należy okresowo obracać klucze dostępu lub wpisy tajne.You should periodically rotate access keys or secrets.

W tym samouczku pokazano, jak zautomatyzować okresową rotację wpisów tajnych dla baz danych i usług, które używają jednego zestawu poświadczeń uwierzytelniania.This tutorial shows how to automate the periodic rotation of secrets for databases and services that use one set of authentication credentials. W szczególności w tym samouczku SQL Server hasła przechowywane w Azure Key Vault przy użyciu funkcji wyzwalane przez Azure Event Grid powiadomień:Specifically, this tutorial rotates SQL Server passwords stored in Azure Key Vault by using a function triggered by Azure Event Grid notification:

Diagram rozwiązania rotacji

  1. 30 dni przed datą wygaśnięcia tajnego Key Vault publikuje zdarzenie "blisko wygaśnięcia" Event Grid.Thirty days before the expiration date of a secret, Key Vault publishes the "near expiry" event to Event Grid.
  2. Event Grid sprawdza subskrypcje zdarzeń i używa żądania HTTP POST do wywołania punktu końcowego aplikacji funkcji subskrybowanego do zdarzenia.Event Grid checks the event subscriptions and uses HTTP POST to call the function app endpoint subscribed to the event.
  3. Aplikacja funkcji odbiera informacje o kluczu tajnym, generuje nowe losowe hasło i tworzy nową wersję dla tego hasła przy użyciu nowego hasła w Key Vault.The function app receives the secret information, generates a new random password, and creates a new version for the secret with the new password in Key Vault.
  4. Aplikacja funkcji zostanie SQL Server przy użyciu nowego hasła.The function app updates SQL Server with the new password.

Uwaga

Może być opóźnienie między krokami 3 i 4.There could be a lag between steps 3 and 4. W tym czasie klucz tajny w Key Vault nie będzie mógł uwierzytelnić się w SQL Server.During that time, the secret in Key Vault won't be able to authenticate to SQL Server. W przypadku niepowodzenia dowolnego z tych kroków Event Grid ponowne próby przez dwie godziny.In case of a failure of any of the steps, Event Grid retries for two hours.

Wymagania wstępnePrerequisites

Poniższego linku wdrażania można użyć, jeśli nie masz istniejących Key Vault i SQL Server:Below deployment link can be used, if you don't have existing Key Vault and SQL Server:

Obraz przedstawiający przycisk z etykietą "Wdrażanie na platformie Azure".Image showing a button labeled "Deploy to Azure".

  1. W obszarze Grupa zasobów wybierz pozycję Utwórz nową.Under Resource group, select Create new. Nadaj grupie nazwę. W tym samouczku użyjemy akvrotation.Give group a name, we use akvrotation in this tutorial.
  2. W obszarze Identyfikator logowania administratora SQL wpisz nazwę logowania administratora sql.Under Sql Admin Login, type Sql administrator login name.
  3. Wybierz pozycję Przejrzyj i utwórz.Select Review + create.
  4. Wybierz pozycję UtwórzSelect Create

Tworzenie grupy zasobów

Teraz będziesz mieć wystąpienie Key Vault i SQL Server wystąpienia.You'll now have a Key Vault, and a SQL Server instance. Tę konfigurację można zweryfikować w interfejsie wiersza polecenia platformy Azure, uruchamiając następujące polecenie:You can verify this setup in the Azure CLI by running the following command:

az resource list -o table -g akvrotation

Wynik będzie wyglądać następująco:The result will look something the following output:

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 ServerCreate and deploy sql server password rotation function

Ważne

Poniższy szablon wymaga Key Vault, programu SQL Server i funkcji platformy Azure w tej samej grupie zasobówBelow template requires Key Vault, SQL server and Azure Function to be in the same resource group

Następnie utwórz aplikację funkcji z tożsamością zarządzaną przez system, oprócz innych wymaganych składników, i wdrożysz funkcje rotacji haseł programu SQL ServerNext, create a function app with a system-managed identity, in addition to the other required components, and deploy sql server password rotation functions

Aplikacja funkcji wymaga tych składników:The function app requires these components:

  • Plan Azure App Service aplikacjiAn Azure App Service plan
  • Aplikacja funkcji z funkcjami rotacji haseł SQL z wyzwalaczem zdarzenia i wyzwalaczem HTTPA Function App with Sql password rotation functions with event trigger and http trigger
  • Konto magazynu wymagane do zarządzania wyzwalaczem aplikacji funkcjiA storage account required for function app trigger management
  • Zasady dostępu dla tożsamości aplikacji funkcji w celu uzyskania dostępu do wpisów tajnych w Key VaultAn access policy for Function App identity to access secrets in Key Vault
  • Subskrypcja zdarzeń EventGrid dla zdarzenia SecretNearExpiryAn EventGrid event subscription for SecretNearExpiry event
  1. Wybierz link wdrażania szablonu platformy Azure:Select the Azure template deployment link:

    Obraz przedstawiający przycisk z etykietą "Wdrażanie na platformie Azure".Image showing a button labeled "Deploy to Azure".

  2. Na liście Grupa zasobów wybierz pozycję akvrotation.In the Resource group list, select akvrotation.

  3. W nazwie programu SQL Server wpisz nazwę programu Sql Server z hasłem do rotacjiIn the Sql Server Name, type the Sql Server name with password to rotate

  4. W Key Vault wpisz nazwę magazynu kluczyIn the Key Vault Name, type the key vault name

  5. W nazwie aplikacji funkcji wpisz nazwę aplikacji funkcjiIn the Function App Name, type the function app name

  6. W skrypcie Nazwa wpisów tajnych wpisz nazwę wpisów tajnych, w której będzie przechowywane hasłoIn the Secret Name, type secret name where the password will be stored

  7. W polu Adres URL repozytorium wpisz kod funkcji Lokalizacja w usłudze GitHub ( https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git )In the Repo Url, type function code GitHub location (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Wybierz pozycję Przejrzyj i utwórz.Select Review + create.

  9. Wybierz pozycję Utwórz.Select Create.

Wybierz pozycję Przejrzyj i utwórz

Po ukończeniu powyższych kroków będziesz mieć konto magazynu, farmę serwerów i aplikację funkcji.After you complete the preceding steps, you'll have a storage account, a server farm, and a function app. Możesz zweryfikować tę konfigurację w interfejsie wiersza polecenia platformy Azure, uruchamiając następujące polecenie:You can verify this setup in the Azure CLI by running the following command:

az resource list -o table -g akvrotation

Wynik będzie wyglądać podobnie do następujących danych wyjściowych:The result will look something like the following output:

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 sposobu tworzenia aplikacji funkcji i używania tożsamości zarządzanej do uzyskiwania dostępu do usługi Key Vault, zobacz Tworzenie aplikacji funkcji z usługi Azure Portal,Jak używać tożsamości zarządzanej dla usług App Service i Azure Functionsoraz Przypisywanie zasad dostępu do usługi Key Vault przy użyciu usługi Azure Portal.For information on how to create a function app and use managed identity to access Key Vault, see Create a function app from the Azure portal, How to use managed identity for App Service and Azure Functions, and Assign a Key Vault access policy using the Azure portal.

Rotation, funkcjaRotation function

Funkcja wdrożona w poprzednim kroku używa zdarzenia w celu wyzwolenia rotacji tajnego przez zaktualizowanie Key Vault i bazy danych SQL.Deployed in previous step function uses an event to trigger the rotation of a secret by updating Key Vault and the SQL database.

Zdarzenie wyzwalacza funkcjiFunction trigger event

Ta funkcja odczytuje dane zdarzenia i uruchamia logikę rotacji:This function reads event data and runs the rotation logic:

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 tajnychSecret rotation logic

Ta metoda rotacji odczytuje informacje o bazie danych z tajnego, tworzy nową wersję tajnego i aktualizuje bazę danych nowym kluczem tajnym:This rotation method reads database information from the secret, creates a new version of the secret, and updates the database with the new secret:

    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");
        }
}

Kompletny kod można znaleźć w witrynie GitHub.You can find the complete code on GitHub.

Dodaj klucz tajny do Key VaultAdd the secret to Key Vault

Ustaw zasady dostępu, aby przyznać użytkownikom uprawnienia do zarządzania wpisami tajnymi:Set your access policy to grant manage secrets permissions to users:

az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list

Utwórz nowy klucz tajny z tagami, które zawierają identyfikator SQL Server, nazwę logowania SQL Server oraz okres ważności dla tego hasła w dniach.Create a new secret with tags that contain the SQL Server resource ID, the SQL Server login name, and validity period for the secret in days. Podaj nazwę tajnego i początkowego hasła z bazy danych SQL (w naszym przykładzie "Simple123") i dołącz datę wygaśnięcia ustawioną na przyszłość.Provide name of the secret, initial password from SQL database (in our example "Simple123") and include an expiration date that's set for tomorrow.

$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 tajnego hasła z krótką datą wygaśnięcia spowoduje opublikowanie zdarzenia w ciągu 15 minut, co z kolei spowoduje wyzwolenie rotacji SecretNearExpiry tego tajnego przez funkcję.Creating a secret with a short expiration date will publish a SecretNearExpiry event within 15 minutes, which will in turn trigger the function to rotate the secret.

Testowanie i weryfikowanieTest and verify

Aby sprawdzić, czy wpis tajny został obrócony, przejdź do Key Vault > Wpisy tajne:To verify that the secret has rotated, go to Key Vault > Secrets:

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

Otwórz klucz tajny sqlPassword i wyświetl oryginalne i obrócone wersje:Open the sqlPassword secret and view the original and rotated versions:

Przejdź do wpisów tajnych

Tworzenie aplikacji internetowejCreate a web app

Aby zweryfikować poświadczenia SQL, utwórz aplikację internetową.To verify the SQL credentials, create a web app. Ta aplikacja internetowa pobierze klucz tajny z Key Vault, wyodrębni informacje i poświadczenia bazy danych SQL z tego tajnego kodu oraz przetestuje połączenie z SQL Server.This web app will get the secret from Key Vault, extract SQL database information and credentials from the secret, and test the connection to SQL Server.

Aplikacja internetowa wymaga tych składników:The web app requires these components:

  • Aplikacja internetowa z tożsamością zarządzaną przez systemA web app with system-managed identity
  • Zasady dostępu do uzyskiwania dostępu do wpisów tajnych w Key Vault za pośrednictwem tożsamości zarządzanej aplikacji internetowejAn access policy to access secrets in Key Vault via web app managed identity
  1. Wybierz link wdrażania szablonu platformy Azure:Select the Azure template deployment link:

    Obraz przedstawiający przycisk z etykietą "Wdrażanie na platformie Azure".Image showing a button labeled "Deploy to Azure".

  2. Wybierz grupę zasobów akvrotation.Select the akvrotation resource group.

  3. W nazwie programu SQL Server wpisz nazwę programu Sql Server z hasłem do rotacjiIn the Sql Server Name, type the Sql Server name with password to rotate

  4. W Key Vault wpisz nazwę magazynu kluczyIn the Key Vault Name, type the key vault name

  5. W skrypcie Nazwa wpisów tajnych wpisz nazwę wpisów tajnych, w której jest przechowywane hasłoIn the Secret Name, type secret name where the password is stored

  6. W polu Adres URL repozytorium wpisz kod aplikacji internetowej Lokalizacja w serwisie GitHub ( https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git )In the Repo Url, type web app code GitHub location (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Wybierz pozycję Przejrzyj i utwórz.Select Review + create.

  8. Wybierz pozycję Utwórz.Select Create.

Otwieranie aplikacji internetowejOpen the web app

Przejdź do adresu URL wdrożonej aplikacji:Go to the deployed application URL:

'https://akvrotation-app.azurewebsites.net/''https://akvrotation-app.azurewebsites.net/'

Gdy aplikacja zostanie otwarta w przeglądarce, zobaczysz wartość Wygenerowano klucz tajny i Wartość połączona z bazą danych o wartości true.When the application opens in the browser, you will see the Generated Secret Value and a Database Connected value of true.

Więcej tutajLearn more