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

A melhor forma de autenticar nos serviços do Azure é com uma identidade gerida, mas alguns cenários exigem uma chave de acesso, palavra-passe ou outro segredo. Alterne esses segredos regularmente para reduzir o impacto de uma credencial divulgada.

Este tutorial mostra como automatizar a rotação periódica de segredos para bases de dados e serviços que utilizam um único conjunto de credenciais de autenticação. Para uma visão geral da autorrotação entre diferentes tipos de ativos, consulte Compreender a autorrotação no Azure Key Vault.

Especificamente, este tutorial roda uma palavra-passe do SQL Server que está armazenada no Azure Key Vault, usando uma função que é ativada por uma notificação do Azure Event Grid:

Sugestão

Para Base de Dados SQL do Azure e Azure SQL Managed Instance, prefira autenticação apenas Microsoft Entra em vez de logins SQL. Use o padrão de rotação de palavra-passe neste tutorial apenas quando uma carga de trabalho requer autenticação SQL.

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 os passos 3 e 4. Durante esse período, o segredo do Key Vault não pode ser utilizado para autenticação no SQL Server. Se algum passo falhar, o Event Grid tenta novamente durante duas horas.

Pré-requisitos

Se ainda não tem um cofre de chaves e uma instância do SQL Server, use este link de implementação:

Imagem mostrando um botão rotulado

  1. Em Grupo de Recursos, selecione Criar novo e dê um nome ao grupo. Este tutorial usa akvrotation.
  2. Em Login de Administrador SQL, introduza o nome de login do administrador SQL.
  3. Selecione Verificar + criar.
  4. Selecione Criar.

Criar um grupo de recursos

Agora tens um cofre de chaves e uma instância do SQL Server. Verifique esta configuração no CLI do Azure:

az resource list -o table -g akvrotation

O resultado é semelhante ao seguinte resultado:

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 implementar a função de rotação de palavras-passe do SQL Server

Importante

Este modelo requer que o cofre de chaves, a instância do SQL Server e a aplicação de funções estejam no mesmo grupo de recursos.

De seguida, crie uma aplicação de funções com uma identidade gerida atribuída pelo sistema, juntamente com os outros componentes necessários, e implemente a função de rotação de palavras-passe do SQL Server.

O aplicativo de função requer estes componentes:

  • Um plano do Serviço de Aplicações do Azure.
  • Uma aplicação de funções com uma função para rotação da palavra-passe SQL que tem um accionador do Event Grid e um accionador HTTP.
  • Uma conta de armazenamento para gestão de triggers de aplicações funcionais.
  • Uma atribuição de função no Azure que permite à identidade da aplicação de funções aceder a segredos no Key Vault.
  • Uma subscrição de evento da 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. Em SQL Server Name, introduza o nome da instância do SQL Server cuja palavra-passe pretende alterar.

  4. Em Key Vault Name, introduza o nome do Key vault.

  5. Em Nome da Aplicação de Função, introduza o nome da aplicação de função.

  6. Em Nome Secreto, introduza o nome secreto que armazena a palavra-passe.

  7. Na URL do repositório, introduza a localização do código da função no GitHub: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Selecione Verificar + criar.

  9. Selecione Criar.

Observação

Este modelo ARM utiliza a implantação por controlo de código-fonte do App Service (Kudu) para obter o código da função a partir do GitHub. Para uma carga de trabalho de produção, recomendamos uma implementação baseada em pacotes, como func azure functionapp publish ou zip deploy with WEBSITE_RUN_FROM_PACKAGE .

Selecione Revisão+criar

Depois de completares os passos anteriores, tens uma conta de armazenamento, uma farm de servidores e uma aplicação de funções. Verifique esta configuração no CLI do Azure:

az resource list -o table -g akvrotation

O resultado é semelhante ao seguinte resultado:

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 mais informações sobre como criar uma aplicação de funções e usar uma identidade gerida para aceder ao Key Vault, consulte Criar uma aplicação de funções a partir do portal do Azure, Como usar a identidade gerida para App Service e Funções do Azure, e Fornecer acesso ao Key Vault com o Azure RBAC.

Observação

A função de exemplo direciona-se ao modelo .NET em processo para o Funções do Azure. Para novos desenvolvimentos, utilize o modelo de trabalhador isolado .NET, que será o modelo suportado daqui para a frente.

Função de rotação

A função implementada no passo anterior utiliza um evento para desencadear uma rotação secreta. Atualiza 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

Atribui-te o papel de Oficial de Segredos do Key Vault para que possas gerir segredos no cofre:

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 segredo com tags que contenham o ID de recurso do SQL Server, o nome de login do SQL Server e o período de validade do segredo em dias. Defina o nome secreto, a palavra-passe inicial da base de dados SQL (Simple123 neste exemplo) e uma data de expiração definida para amanhã para que a rotação seja acionada imediatamente.

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

Ao definir uma data de expiração curta, é publicado um evento SecretNearExpiry no prazo de 15 minutos, que aciona a função para efetuar a rotação do segredo.

Testar e verificar

Para verificar se o segredo foi alternado, aceda 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. A aplicação web recupera o segredo do Key Vault, extrai a informação e credenciais da base de dados SQL do segredo e testa a ligação ao SQL Server.

O aplicativo Web requer estes componentes:

  • Uma aplicação web com uma identidade gerida atribuída pelo sistema.
  • Uma atribuição de funções que permite à identidade gerida da aplicação web ler segredos no cofre de chaves.
  1. Selecione o link de implementação do modelo Azure:

    Imagem mostrando um botão rotulado

  2. Selecione o grupo de recursos akvrotation .

  3. Em SQL Server Name, introduza o nome do SQL Server cuja palavra-passe alterou.

  4. Em Key Vault Name, introduza o nome do Key vault.

  5. Em Nome Secreto, introduza o nome secreto que armazena a palavra-passe.

  6. Na URL do repositório, 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á à URL da aplicação implementada: https://akvrotation-app.azurewebsites.net/.

Quando a aplicação abre no navegador, a página mostra o Valor Secreto Gerado e um valor Ligado à Base de Dados de true.

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 pode ajudá-lo a modificar o código da função de rotação para funcionar com a sua base de dados ou tipo de credencial.

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