Automatizace obměně tajného kódu pro prostředky, které používají jednu sadu přihlašovacích údajů pro ověřování

Nejlepším způsobem, jak se ověřit ve službách Azure, je spravovaná identita, ale některé scénáře vyžadují přístupový klíč, heslo nebo jiný tajný klíč. Obměňujte tyto tajné kódy pravidelně, abyste snížili dopad úniku přihlašovacích údajů.

V tomto kurzu se dozvíte, jak automatizovat pravidelnou obměnu tajných kódů pro databáze a služby, které používají jednu sadu přihlašovacích údajů pro ověřování. Přehled automatickéhorotování napříč různými typy prostředků najdete v tématu Principy automatickéhorotování v Azure Key Vault.

Konkrétně tento kurz obnovuje heslo pro SQL Server uložené v Azure Key Vault pomocí funkce, která je aktivována oznámením Azure Event Grid:

Tip

U Azure SQL Database a Azure SQL Managed Instance upřednostněte ověřování pouze Microsoft Entra před přihlášeními SQL. Vzor obměně hesel v tomto kurzu použijte jenom v případě, že úloha vyžaduje ověřování SQL.

Diagram řešení obměně

  1. Třicet dní před datem vypršení platnosti tajného kódu Key Vault publikuje událost "blízké vypršení platnosti" do Event Gridu.
  2. Event Grid zkontroluje odběry událostí a používá HTTP POST k volání koncového bodu aplikace funkcí, který se k události přihlásil.
  3. Aplikace funkcí obdrží tajné informace, vygeneruje nové náhodné heslo a vytvoří novou verzi tajného kódu s novým heslem v Key Vault.
  4. Aplikace funkcí aktualizuje SQL Server novým heslem.

Poznámka:

Mezi kroky 3 a 4 může být prodleva. Během této doby nelze tajný klíč v Key Vault použít k ověření vůči serveru SQL Server. Pokud některý krok selže, Event Grid provádí opakované pokusy po dobu dvou hodin.

Požadavky

Pokud ještě nemáte trezor klíčů a SQL Server instanci, použijte tento odkaz pro nasazení:

Image s tlačítkem

  1. V části Skupina prostředků vyberte Vytvořit nový a pojmenujte skupinu. Tento návod používá akvrotation.
  2. V části Přihlášení správce SQL zadejte přihlašovací jméno správce SQL.
  3. Vyberte možnost Zkontrolovat a vytvořit.
  4. Vyberte Vytvořit.

Vytvoření skupiny prostředků

Teď máte trezor klíčů a instanci SQL Server. Ověřte toto nastavení v Azure CLI:

az resource list -o table -g akvrotation

Výsledek vypadá podobně jako následující výstup:

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

Vytvoření a nasazení funkce obměně hesel SQL Server

Důležité

Tato šablona vyžaduje, aby trezor klíčů, SQL Server instance a aplikace funkcí byly ve stejné skupině prostředků.

Dále vytvořte aplikaci funkcí se spravovanou identitou přiřazenou systémem spolu s dalšími požadovanými komponentami a nasaďte funkci obměně hesel SQL Server.

Aplikace funkcí vyžaduje tyto komponenty:

  • Plán Azure App Service.
  • Aplikace funkcí s funkcí pro rotaci hesla SQL, která má trigger Event Gridu a trigger HTTP.
  • Účet úložiště pro správu triggerů aplikace funkcí.
  • Přiřazení role Azure, které umožňuje aplikaci funkcí přistupovat k tajným kódům identit v trezoru klíčů.
  • Odběr události Event Gridu pro událost SecretNearExpiry .
  1. Vyberte odkaz pro nasazení šablony Azure:

    Image s tlačítkem

  2. V seznamu Skupina prostředků vyberte akvrotation.

  3. Do pole SQL Server Název zadejte název instance SQL Server, jejíž heslo chcete otočit.

  4. Do pole Název trezoru klíčů zadejte název trezoru klíčů.

  5. Do pole Název aplikace funkcí zadejte název aplikace funkcí.

  6. Do Název tajného klíče zadejte název tajného klíče, ve kterém je uloženo heslo.

  7. Do pole Repo URL zadejte umístění kódu funkce na GitHubu: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Vyberte možnost Zkontrolovat a vytvořit.

  9. Vyberte Vytvořit.

Poznámka:

Tato šablona ARM používá nasazení správy zdrojového kódu služby App Service (Kudu) k načtení kódu funkce z GitHub. Pro produkční pracovní zatížení místo toho doporučujeme nasazení založené na balíčku, například func azure functionapp publish nebo nasazení zip deploy pomocí WEBSITE_RUN_FROM_PACKAGE.

Vyberte Zkontrolovat a vytvořit.

Po dokončení předchozích kroků budete mít účet služby Storage, serverovou farmu a aplikaci Function App. Ověřte toto nastavení v Azure CLI:

az resource list -o table -g akvrotation

Výsledek vypadá podobně jako následující výstup:

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

Další informace o vytvoření aplikace funkcí a použití spravované identity pro přístup k Key Vault najdete v tématu Vytvoření aplikace funkcí z portálu Azure, použití spravované identity pro App Service a Azure Functions a poskytnutí přístupu k Key Vault pomocí Azure RBAC.

Poznámka:

Ukázková funkce cílí na model .NET v procesu pro Azure Functions. Pro nový vývoj použijte .NET izolovaný model pracovního procesu, což je podporovaný model v budoucnu.

Funkce Rotation

Funkce nasazená v předchozím kroku používá událost k aktivaci obměně tajných kódů. Aktualizuje Key Vault a databázi SQL.

Spouštěcí událost funkce

Tato funkce čte data událostí a spouští logiku rotace.

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 rotace tajných klíčů

Tato metoda rotace čte informace o databázi z tajemství, vytvoří novou verzi tajemství a aktualizuje databázi novým tajemstvím.

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

Kompletní kód najdete na GitHub.

Přidání tajného kódu do Key Vault

Přiřaďte si roli Key Vault Secrets Officer, abyste mohli spravovat tajné údaje v trezoru klíčů:

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

Vytvořte tajný kód se značkami, které obsahují ID prostředku SQL Server, přihlašovací jméno SQL Server a dobu platnosti tajného kódu ve dnech. Nastavte název tajného kódu, počáteční heslo z databáze SQL (Simple123 v tomto příkladu) a datum vypršení platnosti nastavené na zítra, aby se rotace aktivovala okamžitě.

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Nastavení krátké doby platnosti publikuje během 15 minut událost SecretNearExpiry, která spustí funkci pro obměnu tajného klíče.

Testování a ověření

Chcete-li ověřit, že došlo k obměně tajného klíče, přejděte na Key Vault>Tajné klíče:

Screenshot, který ukazuje, jak získat přístup k Key Vault > Secrets.

Otevřete tajný kód sqlPassword a zobrazte původní a otočené verze:

Přejít na tajné kódy

Vytvoření webové aplikace

Pokud chcete ověřit přihlašovací údaje SQL, vytvořte webovou aplikaci. Webová aplikace načte tajný klíč z Key Vault, extrahuje informace o databázi SQL a přihlašovací údaje z tajného klíče a otestuje připojení k SQL Server.

Webová aplikace vyžaduje tyto komponenty:

  • Webová aplikace se spravovanou identitou přiřazenou systémem
  • Přiřazení role, které umožňuje spravované identitě webové aplikace číst tajné kódy v trezoru klíčů.
  1. Vyberte odkaz pro nasazení šablony Azure:

    Image s tlačítkem

  2. Vyberte skupinu prostředků akvrotation .

  3. Do pole SQL Server Name zadejte název SQL Server, jehož heslo jste otočili.

  4. Do pole Key Vault Name zadejte název trezoru klíčů.

  5. Do pole Název tajného klíče zadejte název tajného klíče, který ukládá heslo.

  6. Do pole URL úložiště zadejte umístění kódu webové aplikace na GitHubu: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Vyberte možnost Zkontrolovat a vytvořit.

  8. Vyberte Vytvořit.

Otevření webové aplikace

Přejděte na adresu URL nasazené aplikace: https://akvrotation-app.azurewebsites.net/.

Když se aplikace otevře v prohlížeči, zobrazí se na stránce vygenerovaná tajná hodnota a hodnota true .

Přizpůsobení funkce rotace pro vaši databázi pomocí AI

Tento návod demonstruje správu tajností pro SQL Server, ale funkci rotace můžete přizpůsobit pro jiné typy databází. GitHub Copilot vám může pomoct upravit kód funkce rotace tak, aby fungoval s databází nebo typem přihlašovacích údajů.

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 vám také může pomoct tento model přizpůsobit pro jiné typy přihlašovacích údajů, jako jsou klíče rozhraní API, připojovací řetězce nebo hesla účtu služby.

GitHub Copilot využívá AI, takže jsou možné překvapení a chyby. Další informace najdete v tématu Copilot nejčastější dotazy.

Další informace