Partilhar via


Automatize a rotação de um segredo para recursos que usam um conjunto de credenciais de autenticação

A melhor forma de autenticar em serviços do Azure é usando uma identidade gerida, mas há alguns cenários em que isso não é uma opção. Nesses casos, chaves de acesso ou segredos são usados. Você deve alternar periodicamente as chaves de acesso ou segredos.

Este tutorial mostra como automatizar a rotação periódica de segredos para bancos de dados e serviços que usam um conjunto de credenciais de autenticação. Para uma visão abrangente dos conceitos e benefícios de autorrotação em diferentes tipos de ativos, consulte Compreender a autorrotação em Azure Key Vault.

Especificamente, este tutorial roda as palavras-passe do SQL Server armazenadas no Azure Key Vault usando uma função ativada pela notificação do Azure Event Grid:

Diagrama da solução de rotação

  1. Trinta dias antes da data de expiração de um segredo, o Key Vault publica o evento "quase expirado" na Grade de Eventos.
  2. A Grade de Eventos verifica as assinaturas de eventos e usa HTTP POST para chamar o ponto de extremidade do aplicativo de função inscrito no evento.
  3. A aplicação da função recebe a informação secreta, gera uma nova palavra-passe aleatória e cria uma nova versão do segredo com a nova palavra-passe no Key Vault.
  4. A aplicação de funções atualiza o SQL Server com a nova palavra-passe.

Observação

Pode haver um atraso entre as etapas 3 e 4. Durante esse tempo, o segredo no Key Vault não conseguirá autenticar-se no SQL Server. Em caso de falha em qualquer uma das etapas, o Event Grid faz novas tentativas durante duas horas.

Pré-requisitos

Se não tiver o Key Vault e o SQL Server existentes, pode usar este link de implementação:

Imagem mostrando um botão rotulado

  1. Em Grupo de recursos, selecione Criar novo. Dê um nome ao grupo, usamos akvrotation neste tutorial.
  2. Em Logon de administrador do SQL, digite Nome de logon do administrador do SQL.
  3. Selecione Verificar + criar.
  4. Selecione Criar

Criar um grupo de recursos

Agora terá um Key Vault e uma instância do SQL Server. Pode verificar esta configuração na CLI do Azure executando o seguinte comando:

az resource list -o table -g akvrotation

O resultado terá a seguinte aparência:

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

Criar e implantar a função de rotação de senha do SQL Server

Importante

Este modelo exige que o cofre de chaves, o servidor SQL e a função Azure estejam no mesmo grupo de recursos.

Em seguida, crie um aplicativo de função com uma identidade gerenciada pelo sistema, além dos outros componentes necessários, e implante funções de rotação de senha do SQL Server

O aplicativo de função requer estes componentes:

  • Um plano de Serviço de Aplicações Azure
  • Um App de Função com funções de rotação de senha SQL com gatilho de evento e gatilho HTTP
  • É necessário ter uma conta de armazenamento para a gestão de gatilhos de aplicações de funções.
  • Uma atribuição de função Azure RBAC para a identidade da aplicação de função para aceder a segredos no Key Vault
  • Uma subscrição de evento do Event Grid para o evento SecretNearExpiry
  1. Selecione o link de implementação do modelo Azure:

    Imagem mostrando um botão rotulado

  2. Na lista Grupo de recursos , selecione akvrotation.

  3. No Nome do SQL Server, digite o nome do SQL Server e a palavra-passe para rotação.

  4. No Nome do Cofre de Chaves, escreva o nome do cofre de chaves

  5. Em Nome do aplicativo de função, digite o nome do aplicativo de função

  6. No Nome Secreto, digite o nome secreto onde a senha será armazenada

  7. Na Repo Url, escreva a localização do código de função no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Selecione Verificar + criar.

  9. Selecione Criar.

Selecione Revisão+criar

Depois de concluir as etapas anteriores, irá ter uma conta de armazenamento, um grupo de servidores e uma aplicação de funções. Pode verificar esta configuração na CLI do Azure executando o seguinte comando:

az resource list -o table -g akvrotation

O resultado será semelhante à seguinte saída:

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

Para informações sobre como criar uma aplicação de funções e usar identidade gerida para aceder a Key Vault, consulte Criar uma aplicação de funções a partir do portal Azure, Como usar identidade gerida para Serviços de Aplicações e Funções do Azure, e Fornecer acesso a Key Vault com Azure RBAC.

Função de rotação

A função implementada no passo anterior utiliza um evento para desencadear a rotação de um segredo atualizando o Key Vault e a base de dados SQL.

Evento de ativação de função

Esta função lê os dados do evento e executa a lógica de rotação:

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

Lógica de rotação secreta

Esse método de rotação lê as informações do banco de dados do segredo, cria uma nova versão do segredo e atualiza o banco de dados com o novo segredo:

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

Pode encontrar o código completo em GitHub.

Adicione o segredo ao Key Vault

Defina sua política de acesso para conceder permissões de gerenciamento de segredos aos usuários:

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

Crie um novo segredo com etiquetas que contenham o ID do recurso do SQL Server, o nome de login do SQL Server e o período de validade do segredo em dias. Forneça o nome da senha inicial secreta do banco de dados SQL (em nosso exemplo "Simple123") e inclua uma data de expiração definida para amanhã.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-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

Criar um segredo com uma data de expiração curta publicará um SecretNearExpiry evento dentro de 15 minutos, o que, por sua vez, acionará a função para girar o segredo.

Testar e verificar

Para verificar se o segredo foi rotacionado, vá a Key Vault>Segredos:

Captura de ecrã que mostra como aceder a Key Vault > Secrets.

Abra o segredo sqlPassword e visualize as versões original e rotativa:

Ir para Segredos

Criar um aplicativo Web

Para verificar as credenciais SQL, crie um aplicativo Web. Esta aplicação web irá obter o segredo do Key Vault, extrair informações e credenciais da base de dados SQL do segredo e testar a ligação ao SQL Server.

O aplicativo Web requer estes componentes:

  • Um aplicativo Web com identidade gerenciada pelo sistema
  • Uma política de acesso para aceder a segredos no Key Vault através da identidade gerida por aplicação web
  1. Selecione o link de implementação do modelo Azure:

    Imagem mostrando um botão rotulado

  2. Selecione o grupo de recursos akvrotation .

  3. No SQL Server Nome, escreva o nome SQL Server com palavra-passe para rodar

  4. No Key Vault Name, escreva o nome do cofre de chaves

  5. No Nome Secreto, digite o nome secreto onde a senha está armazenada

  6. No Repo Url, introduza a localização do código da aplicação web no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Selecione Verificar + criar.

  8. Selecione Criar.

Abra o aplicativo Web

Vá para a URL do aplicativo implantado:

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

Quando a aplicação for aberta no navegador, verá o valor Segredo gerado e um valor Conectado ao banco de dados de verdadeiro.

Use IA para personalizar a função de rotação da sua base de dados

Este tutorial demonstra a rotação secreta para o SQL Server, mas pode adaptar a função de rotação para outros tipos de bases de dados. O GitHub Copilot no VS Code pode ajudar-te a modificar o código da função de rotação para funcionar com a tua base de dados ou tipo de credencial específico.

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.

O Copilot também pode ajudá-lo a adaptar este padrão para outros tipos de credenciais, como chaves API, cadeias de ligação ou palavras-passe de contas de serviço.

O GitHub Copilot é alimentado por IA, por isso surpresas e erros são possíveis. Para mais informações, consulte Copilot FAQs.

Mais informações