Automatizace rotace tajného klíče pro prostředky, které používají jednu sadu ověřovacích přihlašovacích údajů

Nejlepším způsobem, jak ověřit služby Azure, je použití spravované identity, ale v některých případech se nejedná o možnost. V těchto případech se používají přístupové klíče a tajné kódy. Přístupové klíče a tajné kódy byste měli pravidelně střídat.

V tomto kurzu se dozvíte, jak automatizovat pravidelnou rotaci tajných kódů pro databáze a služby, které používají jednu sadu ověřovacích přihlašovacích údajů. Konkrétně tento kurz otočí SQL Server hesla uložená v Azure Key Vault pomocí funkce aktivované Azure Event Gridm oznámením:

Diagram řešení rotace

  1. Třicet dní před datem vypršení platnosti tajného kódu Key Vault pro Event Grid publikovat událost blížící se vypršení platnosti.
  2. Event Grid zkontroluje odběry událostí a pomocí HTTP POST zavolá koncový bod aplikace Function App, který se přihlásí k odběru události.
  3. Aplikace Function App obdrží tajné informace, vygeneruje nové náhodné heslo a vytvoří novou verzi pro tajný klíč s novým heslem v Key Vault.
  4. Aplikace Function App SQL Server aktualizuje pomocí nového hesla.

Poznámka

Mezi kroky 3 a 4 by mohlo dojít k prodlevě. Během této doby se tajný kód v Key Vault nebude moci ověřit pro SQL Server. V případě selhání některého z kroků Event Grid opakování po dvou hodinách.

Požadavky

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

Obrázek znázorňující tlačítko s názvem "nasadit do Azure".

  1. V části Skupina prostředků vyberte vytvořit novou. Zadejte název skupiny. v tomto kurzu použijeme 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 Vytvořit.

Vytvoření skupiny prostředků

Nyní budete mít Key Vault a instanci SQL Server. Tuto instalaci 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ě na následujícím výstupu:

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 rotace hesla systému SQL Server

Důležité

Pod šablonou se vyžaduje Key Vault, SQL Server a funkce Azure Functions ve stejné skupině prostředků.

Dále vytvořte aplikaci funkcí s identitou spravovanou systémem, kromě dalších požadovaných součástí a nasaďte funkce pro otočení hesla SQL serveru.

Aplikace Function App vyžaduje tyto komponenty:

  • Plán Azure App Service
  • Function App s funkcemi rotace hesla SQL s triggerem událostí a triggerem protokolu http
  • Účet úložiště vyžadovaný pro správu triggeru aplikace Function App
  • Zásady přístupu pro Function App identity pro přístup k tajným klíčům v Key Vault
  • Odběr události EventGrid pro událost SecretNearExpiry
  1. Vyberte odkaz nasazení šablony Azure:

    Obrázek znázorňující tlačítko s názvem "nasadit do Azure".

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

  3. Do pole název SQL serveru zadejte název SQL serveru s heslem pro otočení.

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

  5. Do Function App název zadejte název aplikace Function App.

  6. Do název tajného klíče zadejte tajný název, kde bude uloženo heslo.

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

  8. Vyberte Zkontrolovat a vytvořit.

  9. Vyberte Vytvořit.

Vybrat kontrolu + vytvořit

Po dokončení předchozích kroků budete mít účet úložiště, serverovou farmu a aplikaci Function App. Tuto instalaci 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žít spravovanou identitu pro přístup k Key Vault, najdete v tématu Vytvoření aplikace Function App z Azure Portal, použití spravované identity pro App Service a Azure Functionsa přiřazení zásad Key Vault přístupu pomocí Azure Portal.

Funkce rotace

Funkce nasazená v předchozím kroku používá událost k aktivaci rotace tajného kódu aktualizací Key Vault a SQL Database.

Událost triggeru funkce

Tato funkce čte data událostí a spouští logiku otáčení:

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 otáčení čte informace o databázi z tajného kódu, vytvoří novou verzi tajného klíče a aktualizuje databázi pomocí nového tajného klíče:

    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 můžete najít na GitHubu.

Přidání tajného klíče do Key Vault

Nastavte zásady přístupu pro udělení oprávnění Spravovat tajná klíče uživatelům:

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

Vytvořte nový tajný klíč pomocí značek, které obsahují ID prostředku SQL Server, SQL Server přihlašovací jméno a dobu platnosti tajného klíče ve dnech. Zadejte název tajného klíče, počáteční heslo z databáze SQL (v našem příkladu "Simple123") a zahrňte datum vypršení platnosti, které je nastavené pro zítřejší.

$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 klíče s krátkým datem vypršení platnosti způsobí publikování SecretNearExpiry události během 15 minut, což zase aktivuje funkci pro otočení tajného klíče.

Testování a ověření

Chcete-li ověřit, zda byl tajný klíč otočen, použijte Key Vault > tajných klíčů:

Snímek obrazovky, který ukazuje, jak získat přístup k Key Vault > tajných kódů.

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

Přejít k tajným klíčům

Vytvoření webové aplikace

Pokud chcete ověřit přihlašovací údaje SQL, vytvořte webovou aplikaci. Tato webová aplikace získá tajný klíč z Key Vault, extrahuje informace z databáze SQL a přihlašovací údaje z tajného kódu a otestuje připojení k SQL Server.

Webová aplikace vyžaduje tyto komponenty:

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

    Obrázek znázorňující tlačítko s názvem "nasadit do Azure".

  2. Vyberte skupinu prostředků akvrotation .

  3. Do pole název SQL serveru zadejte název SQL serveru s heslem pro otočení.

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

  5. Do název tajného klíče zadejte tajný název, kde je uložené heslo.

  6. Do pole Adresa URL úložiště zadejte umístění GitHubu pro kód 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řejít na adresu URL nasazené aplikace:

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

Po otevření aplikace v prohlížeči se zobrazí vygenerovaná tajná hodnota a hodnota je připojená k databázi true.

Další informace