Automatize a rotação de um segredo para recursos que tenham dois conjuntos de credenciais de autenticação

A melhor forma de autenticar nos serviços do Azure é com uma identidade gerida, mas alguns cenários ainda exigem chaves de acesso ou palavras-passe. Altere essas credenciais regularmente para reduzir o impacto de uma fuga de dados.

Este tutorial mostra como automatizar a rotação periódica de segredos para bases de dados e serviços que utilizam dois conjuntos 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 as chaves de conta do Armazenamento do Azure que estão armazenadas no Azure Key Vault como segredos. Utiliza uma função que é ativada por uma notificação do Azure Event Grid.

Importante

Para Armazenamento do Azure, prefira autorização Microsoft Entra ID com identidade gerida em vez de chaves de conta partilhadas. Quando a conformidade permitir, desative a autorização de Chave Partilhada na conta de armazenamento e elimine completamente a necessidade de rotação de chaves. Use o padrão neste tutorial apenas quando uma carga de trabalho requer uma chave de conta de armazenamento ou uma cadeia de ligação.

Aqui está a solução de rotação descrita neste tutorial:

Diagrama que mostra a solução de rotação.

Nesta solução, o Azure Key Vault armazena cada chave de acesso à conta de armazenamento como uma versão do mesmo segredo, alternando entre a chave primária e secundária em versões sucessivas. Quando uma chave de acesso é armazenada como a versão mais recente do segredo, a chave alternativa é regenerada e adicionada ao Key Vault como a nova versão mais recente. Este design dá à aplicação um ciclo completo de rotação para captar a chave recém-regenerada.

  1. Trinta dias antes da data de expiração de um segredo, o Key Vault publica o evento de expiração iminente no Event Grid.
  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. O aplicativo de função identifica a chave alternativa (não a mais recente) e chama a conta de armazenamento para regenerá-la.
  4. A aplicação de funções adiciona a chave regenerada ao Azure Key Vault como a nova versão do segredo.

Pré-requisitos

  • Uma subscrição do Azure. Crie um gratuitamente.
  • Azure Cloud Shell. Este tutorial utiliza o portal Cloud Shell com o ambiente PowerShell.
  • Um cofre de chaves do Azure.
  • Duas contas de armazenamento Azure.

Observação

Rodar uma chave de conta de armazenamento partilhado revoga qualquer assinatura de acesso partilhado (SAS) ao nível da conta gerada a partir dessa chave. Após a rotação, regenere os tokens SAS ao nível da conta para evitar interrupções nas aplicações.

Se não tiver um cofre de chaves existente e duas contas de armazenamento, use este link de implementação:

Link intitulado Implementar no Azure.

  1. Em Grupo de recursos, selecione Criar novo. Nomeie o grupo rotação do cofre e, em seguida, selecione OK.

  2. Selecione Verificar + criar.

  3. Selecione Criar.

    Captura de ecrã que mostra como criar um grupo de recursos.

Agora tens um cofre de chaves e duas contas de armazenamento. Verifique esta configuração no CLI do Azure ou Azure PowerShell:

az resource list -o table -g vaultrotation

O resultado é semelhante ao seguinte resultado:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

Criar e implantar a função de rotação de teclas

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 para as chaves da conta de armazenamento.

A função de rotação requer os seguintes componentes e configuração:

  • Um plano do Serviço de Aplicações do Azure.
  • Uma conta de armazenamento para gerir os acionadores da aplicação de funções.
  • Uma atribuição de funções no Azure que permite à aplicação de funções aceder a segredos no cofre de chaves.
  • A Função de Serviço de Operador da Chave da Conta de Armazenamento atribuída à aplicação de funções para que possa aceder às chaves de acesso da conta de armazenamento.
  • Uma função de rotação de chaves com um acionador do Event Grid e um acionador HTTP (para rotação a pedido).
  • Uma subscrição de evento da Event Grid para o evento SecretNearExpiry.
  1. Selecione o link de implementação do modelo Azure:

    Link de implementação do modelo Azure.

  2. Na lista Grupo de recursos , selecione vaultrotation.

  3. Em Storage Account RG, introduza o nome do grupo de recursos onde a conta de armazenamento se encontra. Mantém o padrão [resourceGroup().name] se a conta de armazenamento estiver no mesmo grupo de recursos que a função de rotação.

  4. Em Nome da Conta de Armazenamento, introduza o nome da conta de armazenamento cujas chaves de acesso pretende rodar. Mantenha a predefinição [concat(resourceGroup().name, 'storage')] se utilizar a conta de armazenamento em Pré-requisitos.

  5. No Key Vault RG, introduza o nome do grupo de recursos onde o key vault está localizado. Mantenha a predefinição [resourceGroup().name] se o cofre de chaves estiver no mesmo grupo de recursos que a função de rotação.

  6. Em Key Vault Name, introduza o nome do Key vault. Mantenha a predefinição [concat(resourceGroup().name, '-kv')] se utilizar o cofre de chaves em Pré-requisitos.

  7. Em Tipo de Plano de Serviço de Aplicação, selecione o plano de alojamento. O Plano Premium só é necessário quando o cofre de chaves está protegido por uma firewall.

  8. No campo Nome da aplicação de funções, introduza o nome da aplicação de funções.

  9. Em Nome Secreto, introduza o nome secreto que armazena as chaves de acesso.

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

  11. Selecione Verificar + criar.

  12. Selecione Criar.

    Captura de tela que mostra como criar e implantar a função.

Quando a implementação estiver concluída, tem uma conta de armazenamento, uma farm de servidores, uma aplicação de funções e um recurso do Application Insights:

Captura de tela que mostra a página Sua implantação está concluída.

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 implantação baseada em pacotes, como func azure functionapp publish ou implementação zip com WEBSITE_RUN_FROM_PACKAGE, em vez disso. Se a implementação falhar, selecione Redeploy para tentar novamente.

Os modelos de implementação e o código para a função de rotação encontram-se em Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

Adicionar as chaves de acesso à conta de armazenamento aos segredos do Key Vault

Primeiro, atribui a ti próprio 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/vaultrotation-kv

Agora pode criar um segredo cujo valor é uma chave de acesso à conta de armazenamento. Juntamente com o valor, adiciona o ID do recurso da conta de armazenamento, o período de validade secreta e o ID da chave como etiquetas para que a função de rotação possa regenerar a chave na conta de armazenamento.

Determine o identificador do recurso da conta de armazenamento. É a propriedade id:

az storage account show -n vaultrotationstorage

Liste as chaves de acesso da conta de armazenamento para obter os valores de chave:

az storage account keys list -n vaultrotationstorage

Adicione o segredo ao cofre de chaves com um período de validade de 60 dias e, (para demonstração), com data de expiração definida para amanhã, para desencadear a rotação imediatamente. Execute este comando com os valores recuperados para key1Value e storageAccountResourceId:

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1-value> --tags "CredentialId=key1" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

Este segredo desencadeia um evento SecretNearExpiry em poucos minutos, o que, por sua vez, faz com que a função proceda à rotação do segredo, com uma expiração definida para 60 dias depois. Nessa configuração, o evento SecretNearExpiry é acionado a cada 30 dias (30 dias antes da expiração), e a função de rotação alterna entre key1 e key2.

Verifica se as chaves de acesso se regeneraram recuperando a chave da conta de armazenamento e o segredo do Key Vault, e depois comparando-as.

Use este comando para obter as informações secretas:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

Observe que CredentialId é atualizado para o alternativo keyName e que value é regenerado:

Captura de ecrã que mostra a saída do comando AZ keyvault secret show para a primeira conta de armazenamento.

Recupere as chaves de acesso para comparar os valores:

az storage account keys list -n vaultrotationstorage

Note que o valor da chave corresponde ao segredo no cofre de chaves:

Captura de tela que mostra a saída do comando A Z storage account keys list para a primeira conta de armazenamento.

Use uma função de rotação existente para múltiplas contas de armazenamento

Pode reutilizar a mesma aplicação Function App para efetuar a rotação das chaves de mais de uma conta de armazenamento.

Para adicionar as chaves de outra conta de armazenamento a uma função de rotação existente, precisa de:

  • O Papel de Operador de Serviço da Chave de Conta de Armazenamento atribuído à aplicação de funções para que possa aceder às chaves de acesso da conta de armazenamento.
  • Uma subscrição de evento da Event Grid para o evento SecretNearExpiry.
  1. Selecione o link de implementação do modelo Azure:

    Link de implementação do modelo Azure.

  2. Na lista Grupo de recursos , selecione vaultrotation.

  3. Em Storage Account RG, introduza o nome do grupo de recursos onde a conta de armazenamento se encontra. Mantém o padrão [resourceGroup().name] se a conta de armazenamento estiver no mesmo grupo de recursos que a função de rotação.

  4. Em Nome da Conta de Armazenamento, introduza o nome da conta de armazenamento cujas chaves de acesso pretende alternar.

  5. No Key Vault RG, introduza o nome do grupo de recursos onde o key vault está localizado. Mantenha a predefinição [resourceGroup().name] se o cofre de chaves estiver no mesmo grupo de recursos que a função de rotação.

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

  7. Em Nome da Aplicação de Função, introduza o nome da Aplicação de Função.

  8. Em Nome Secreto, introduza o nome secreto que armazena as chaves de acesso.

  9. Selecione Verificar + criar.

  10. Selecione Criar.

    Captura de ecrã que mostra como criar uma conta de armazenamento adicional.

Adicionar chave de acesso à conta de armazenamento aos segredos do Key Vault

Determine o identificador do recurso da conta de armazenamento. Você pode encontrar este valor na propriedade id.

az storage account show -n vaultrotationstorage2

Liste as chaves de acesso da conta de armazenamento para obter o valor key2:

az storage account keys list -n vaultrotationstorage2

Adicione o segredo ao cofre de chaves com um período de validade de 60 dias e, (para demonstração), uma data de expiração para amanhã, para desencadear a rotação imediatamente. Execute este comando com os valores recuperados para key2Value e storageAccountResourceId:

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2-value> --tags "CredentialId=key2" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

Use este comando para obter as informações secretas:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

Observe que CredentialId é atualizado para o alternativo keyName e que value é regenerado:

Captura de ecrã que mostra a saída do comando AZ keyvault secret show para a segunda conta de armazenamento.

Recupere as chaves de acesso para comparar os valores:

az storage account keys list -n vaultrotationstorage2

Repare que o valor da chave corresponde ao segredo no cofre de chaves:

Captura de tela que mostra a saída do comando A Z storage account keys list para a segunda conta de armazenamento.

Desativar a rotação de um segredo

Para desativar a rotação de um segredo, elimine a subscrição do Event Grid para esse segredo. Utilize o cmdlet Remove-AzEventGridSubscription do Azure PowerShell ou o comando az eventgrid event-subscription delete da CLI do Azure.

Use IA para personalizar a função de rotação para outros serviços

Este tutorial demonstra a rotação secreta para contas do Armazenamento do Azure, mas pode adaptar a função de rotação para outros serviços do Azure que usam credenciais duplas. O GitHub Copilot pode ajudar-te a modificar o código da função de rotação do PowerShell para funcionar com o teu serviço.

I'm using the Azure Key Vault dual-credential secret rotation tutorial for Storage accounts. Help me modify the PowerShell rotation function to work with Azure Cosmos DB instead. The function should:
1. Connect to Cosmos DB and regenerate the secondary key
2. Store the new key in Key Vault as a new secret version
3. Alternate between primary and secondary keys on each rotation
Show me the changes needed to the PowerShell function code, including the correct Cosmos DB PowerShell cmdlets.

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

Próximos passos