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 použití spravované identity, ale existují některé scénáře, kdy to není možnost. V takových 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ů ověřování. Konkrétně tento kurz obměňuje hesla SQL Serveru uložená ve službě Azure Key Vault pomocí funkce aktivované oznámením služby Azure Event Grid:

Diagram řešení obměně

  1. Třicet dní před datem vypršení platnosti tajného kódu služba Key Vault publikuje událost téměř vypršení platnosti ve službě Event Grid.
  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 ve službě Key Vault.
  4. Aplikace funkcí aktualizuje SQL Server novým heslem.

Poznámka:

Mezi kroky 3 a 4 může docházet k prodlevě. Během této doby se tajný klíč ve službě Key Vault nebude moct ověřit na SQL Serveru. V případě selhání některého z kroků služba Event Grid opakuje několik hodin.

Požadavky

Pokud ještě nemáte službu Key Vault a SQL Server, můžete použít tento odkaz pro nasazení:

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

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

Vytvoření skupiny zdrojů

Teď budete mít službu Key Vault a instanci SQL Serveru. 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 byly ve stejné skupině prostředků.

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

Aplikace funkcí vyžaduje tyto komponenty:

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

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

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

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

  4. Do názvu služby Key Vault 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 umístění GitHubu s kódem funkce (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ě 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
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 ke službě Key Vault, najdete v tématu Vytvoření aplikace funkcí z webu Azure Portal, použití spravované identity pro App Service a Azure Functions a přiřazení zásad přístupu ke službě Key Vault pomocí webu Azure Portal.

Funkce Rotation

Nasazená v předchozí funkci používá událost k aktivaci obměny tajného kódu aktualizací služby Key Vault a databáze SQL.

Událost triggeru funkce

Tato funkce čte data událostí a spouští 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 kódu, vytvoří novou verzi tajného kódu 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");
        }
}

Kompletní kód najdete na GitHubu.

Přidání tajného kódu do služby 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ý klíč se značkami, které obsahují ID prostředku SQL Serveru, přihlašovací jméno SQL Serveru a dobu platnosti tajného kódu ve dnech. Zadejte název tajného klíče, počáteční heslo z databáze SQL (v našem příkladu "Simple123") a zadejte datum vypršení platnosti nastavené na zítra.

$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 pro otočení tajného kódu.

Testování a ověření

Pokud chcete ověřit, že se tajný klíč otočil, přejděte na Tajné kódy služby Key Vault>:

Snímek obrazovky znázorňující přístup k tajným kódům služby 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 ze služby Key Vault, extrahuje informace o databázi SQL a přihlašovací údaje z tajného klíče a otestuje připojení k SQL Serveru.

Webová aplikace vyžaduje tyto komponenty:

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

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

  2. Vyberte skupinu prostředků akvrotation.

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

  4. Do názvu služby Key Vault zadejte název trezoru klíčů.

  5. Do pole Název tajného klíče zadejte název tajného kódu, ve kterém je heslo uloženo.

  6. Do adresy URL úložiště zadejte umístění GitHubu s kódem webové aplikace (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, zobrazí se vygenerovaná tajná hodnota a hodnota připojená k databázi s hodnotou true.

Další informace