Automatizace obměně tajného klíče 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 použití spravované identity, ale v některých scénářích to není možné. V těchto případech se používají přístupové klíče nebo tajné kódy. Přístupové klíče nebo tajné kódy byste měli pravidelně obměňovat.

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í. Konkrétně tento kurz obměňuje SQL Server hesla uložená v Azure Key Vault pomocí funkce aktivované oznámením Azure Event Grid:

Diagram řešení otáčení

  1. Třicet dní před datem vypršení platnosti tajného kódu Key Vault publikuje událost "blížící se vypršení platnosti" ve službě Event Grid.
  2. Event Grid zkontroluje odběry událostí a použije HTTP POST k volání koncového bodu aplikace funkcí přihlášeného k odběru události.
  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í SQL Server aktualizuje pomocí nového hesla.

Poznámka

Mezi kroky 3 a 4 může dojít ke zpoždění. Během této doby se tajný kód v Key Vault nebude moct ověřit pro SQL Server. V případě selhání některého z kroků se Event Grid pokusí provést opakování po dobu dvou hodin.

Požadavky

Pokud nemáte existující Key Vault a SQL Server, můžete použít tento odkaz pro nasazení:

Obrázek znázorňující tlačítko s popiskem

  1. V části Skupina prostředků vyberte Vytvořit novou. Pojmenujte skupinu. V tomto kurzu použijeme akvrotaci .
  2. V části SQL Správa Přihlášení zadejte přihlašovací jméno správce SQL.
  3. Vyberte Zkontrolovat a vytvořit.
  4. Vyberte Vytvořit.

Vytvoření skupiny prostředků

Teď budete mít Key Vault a instanci SQL Server. Toto nastavení můžete ověřit v Azure CLI spuštěním následujícího příkazu:

az resource list -o table -g akvrotation

Výsledek bude vypadat nějak takto:

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 Serveru

Důležité

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

Dále vytvořte aplikaci funkcí s identitou spravovanou systémem a dalšími požadovanými komponentami a nasaďte funkce obměně hesel SQL Serveru.

Aplikace funkcí vyžaduje tyto komponenty:

  • Plán Azure App Service
  • Aplikace funkcí s funkcemi pro obměně hesel SQL s triggerem události a triggerem HTTP
  • Účet úložiště vyžadovaný pro správu triggeru aplikace funkcí
  • Zásady přístupu pro identitu aplikace funkcí pro přístup k tajným kódům v Key Vault
  • Odběr události Event Gridu pro událost SecretNearExpiry
  1. Vyberte odkaz pro nasazení šablony Azure:

    Obrázek znázorňující tlačítko s popiskem

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

  3. Do SQL Server Název zadejte název SQL Server s heslem, který chcete otočit.

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

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

  6. Do pole Název tajného kódu zadejte název tajného kódu, do kterého se heslo uloží.

  7. Do adresy URL úložiště zadejte kód funkce Umístění GitHubu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Vyberte Zkontrolovat a vytvořit.

  9. Vyberte Vytvořit.

Vyberte Zkontrolovat a vytvořit.

Po dokončení předchozích kroků budete mít účet úložiště, serverovou farmu a aplikaci funkcí. Toto nastavení můžete ověřit v Azure CLI spuštěním následujícího příkazu:

az resource list -o table -g akvrotation

Výsledek bude vypadat přibližně 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

Informace o tom, jak vytvořit aplikaci funkcí a používat spravovanou identitu pro přístup k Key Vault, najdete v tématech Vytvoření aplikace funkcí z Azure Portal, Použití spravované identity pro App Service a Azure Functions a Přiřazení zásad Key Vault přístupu pomocí Azure Portal.

Funkce otáčení

Funkce nasazená v předchozím kroku používá událost k aktivaci obměně tajného kódu aktualizací Key Vault a databáze SQL.

Událost triggeru funkce

Tato funkce načte data událostí a spustí logiku obměny:

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 obměně tajných kódů

Tato metoda obměny čte informace o databázi z tajného klíče, vytvoří novou verzi tajného klíče a aktualizuje databázi novým tajným kódem:

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

Úplný kód najdete na GitHubu.

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

Nastavte zásady přístupu tak, aby uživatelům udělily oprávnění ke správě tajných kódů :

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

Vytvořte nový 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. Zadejte název tajného kódu, počáteční heslo z databáze SQL (v našem příkladu Simple123) a uveďte datum vypršení platnosti nastavené na zítřek.

$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

Vytvoření tajného kódu s krátkým datem vypršení platnosti publikuje SecretNearExpiry událost do 15 minut, což zase aktivuje funkci k obměně tajného kódu.

Testování a ověření

Pokud chcete ověřit, že se tajný klíč otočil, přejděte na Key Vault>Secrets:

Snímek obrazovky znázorňující přístup k tajným kódům Key Vault >

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. Tato webová aplikace získá tajný kód z Key Vault, extrahuje z tajného klíče informace a přihlašovací údaje databáze SQL a otestuje připojení k SQL Server.

Webová aplikace vyžaduje tyto komponenty:

  • Webová aplikace se systémem spravovanou identitou
  • Zásady přístupu pro přístup k tajným kódům v Key Vault prostřednictvím spravované identity webové aplikace
  1. Vyberte odkaz pro nasazení šablony Azure:

    Obrázek znázorňující tlačítko s popiskem

  2. Vyberte skupinu prostředků akvrotation .

  3. Do SQL Server Název zadejte název SQL Server s heslem, který chcete otočit.

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

  5. Do pole Název tajného kódu zadejte název tajného kódu, ve kterém je heslo uložené.

  6. Do adresy URL úložiště zadejte kód webové aplikace na GitHubu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git).

  7. Vyberte 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, uvidíte hodnotu Vygenerovaný tajný kód a hodnotu Připojená databázes hodnotou true.

Další informace