Automatizar a rotação de um segredo para recursos que têm dois conjuntos de credenciais de autenticação

A melhor maneira de autenticar nos serviços de Azure é com uma identidade gerenciada, mas alguns cenários ainda exigem chaves de acesso ou senhas. Altere com frequência essas credenciais para reduzir o impacto de um vazamento.

Este tutorial mostra como automatizar a rotação de segredo periódica para bancos de dados e serviços que usam dois conjuntos de credenciais de autenticação. Para obter uma visão geral da autorotação entre diferentes tipos de ativos, consulte Noções básicas sobre a autorotação em Azure Key Vault.

Especificamente, este tutorial alterna chaves de conta do Armazenamento do Azure que são armazenadas no Azure Key Vault como segredos. Ele usa uma função disparada por uma notificação Grade de Eventos do Azure.

Importante

Para o Armazenamento do Azure, prefira a autorização do Microsoft Entra ID com uma identidade gerenciada em vez de chaves de conta compartilhadas. Quando a conformidade permitir, desabilite a autorização de Chave Compartilhada na conta de armazenamento e remova totalmente a necessidade de rotação de chaves. Use o padrão deste tutorial somente quando uma carga de trabalho exigir uma chave de uma conta de armazenamento ou uma cadeia de conexão.

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

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

Nesta solução, Azure Key Vault armazena cada chave de acesso da conta de armazenamento como uma versão do mesmo segredo, alternando entre a chave primária e a 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 a Key Vault como a nova versão mais recente. Esse design fornece ao aplicativo um ciclo de rotação completo para pegar a chave recém-regenerada.

  1. Trinta dias antes da data de validade de um segredo, Key Vault publica o evento de quase expiração 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ções assinado para o evento.
  3. O aplicativo de funções identifica a chave alternativa (não a mais recente) e chama a conta de armazenamento para regenere-la.
  4. O aplicativo de funções adiciona a chave regenerada para Azure Key Vault como a nova versão do segredo.

Pré-requisitos

  • Uma assinatura Azure. Crie uma gratuitamente.
  • Azure Cloud Shell. Este tutorial usa o portal Cloud Shell com o ambiente do PowerShell.
  • Um cofre de chaves do Azure.
  • Duas contas de armazenamento Azure.

Observação

Girar uma chave de conta de armazenamento compartilhado revoga qualquer SAS (assinatura de acesso compartilhado) no nível da conta gerada a partir dessa chave. Após a rotação, regenere tokens SAS no nível da conta para evitar interrupções nos aplicativos.

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

Link rotulado como Deploy to Azure.

  1. Em Grupo de recursos, selecione Criar. Nomeie o grupo como vault rotation e clique em OK.

  2. Selecione Examinar + criar.

  3. Selecione Criar.

    Captura de tela que mostra como criar um grupo de recursos.

Agora você tem um cofre de chaves e duas contas de armazenamento. Verifique essa configuração no CLI do Azure ou Azure PowerShell:

az resource list -o table -g vaultrotation

O resultado se parece com a saída a seguir:

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 chaves

Em seguida, crie um aplicativo de funções com uma identidade gerenciada atribuída pelo sistema junto com os outros componentes necessários e implante 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 Aplicativo do Azure.
  • Uma conta de armazenamento para gerenciar gatilhos do aplicativo de funções.
  • Uma atribuição de função do Azure que permite ao aplicativo de funções acessar segredos no cofre de chaves.
  • A função do serviço de operador da chave da conta de armazenamento atribuída ao aplicativo de funções para que possa acessar chaves de acesso da conta de armazenamento.
  • Uma função de rotação de chave com um gatilho do Event Grid e um gatilho HTTP (para rotação sob demanda).
  • Uma assinatura de evento do Event Grid para SecretNearExpiry.
  1. Selecione o link de implantação do modelo Azure:

    Link de implantação de modelo do Azure.

  2. Na lista de grupos de recursos, selecione vaultrotation.

  3. No RG da Conta de Armazenamento, insira o nome do grupo de recursos em que a conta de armazenamento está localizada. Mantenha o padrão [resourceGroup().name] se a conta de armazenamento estiver no mesmo grupo de recursos que a função de rotação.

  4. No Nome da Conta de Armazenamento, insira o nome da conta de armazenamento cujas chaves de acesso você deseja girar. Mantenha o valor padrão [concat(resourceGroup().name, 'storage')] se você usar a conta de armazenamento dos Pré-requisitos.

  5. Em Key Vault RG, insira o nome do grupo de recursos em que o key vault está localizado. Mantenha o padrã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 Nome, insira o nome do key vault. Mantenha o valor padrão [concat(resourceGroup().name, '-kv')] se você usar o cofre de chaves da seção Pré-requisitos.

  7. No Tipo de Plano do Serviço de Aplicativo, selecione o plano de hospedagem. O Plano Premium é necessário somente quando o cofre de chaves está atrás de um firewall.

  8. No Nome do Aplicativo de Funções, insira o nome do aplicativo de funções.

  9. Em Nome do Segredo, insira o nome do segredo que armazena as chaves de acesso.

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

  11. Selecione Examinar + criar.

  12. Selecione Criar.

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

Após a conclusão da implantação, você terá uma conta de armazenamento, um farm de servidores, um aplicativo de funções e um recurso do Application Insights:

Captura de tela que mostra a página

Observação

Este modelo ARM usa a implantação de controle de código-fonte do Serviço de Aplicativo (Kudu) para obter o código da função do GitHub. Para uma carga de trabalho de produção, é recomendável uma implantação baseada em pacote, como func azure functionapp publish ou implantação de zip com WEBSITE_RUN_FROM_PACKAGE. Se a implantação falhar, selecione Reimplantar para tentar novamente.

Os modelos de implantação e o código da função de rotação estão em Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

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

Primeiro, atribua a si mesmo a função Responsável pelos Segredos do Key Vault para poder gerenciar 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 você pode criar um segredo cujo valor é uma chave de acesso da conta de armazenamento. Junto com o valor, adicione a ID do recurso da conta de armazenamento, o período de validade do segredo e a ID da chave como marcas para que a função de rotação possa regenerar a chave na conta de armazenamento.

Determine a ID do recurso da conta de armazenamento. Esta é a propriedade id:

az storage account show -n vaultrotationstorage

Liste as chaves de acesso da conta de armazenamento para que você possa obter os valores de chave:

az storage account keys list -n vaultrotationstorage

Adicione o segredo ao cofre de chaves com período de validade de 60 dias e (para demonstração) com data do término para amanhã para disparar a rotação imediatamente. Execute este comando com os valores obtidos 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

Esse segredo dispara um evento SecretNearExpiry em alguns minutos, que, por sua vez, aciona a função para rotacionar o segredo com a expiração definida para 60 dias. Nessa configuração, o evento SecretNearExpiry é disparado a cada 30 dias (30 dias antes da expiração), e a função de rotação alterna entre key1 e key2.

Verifique se as chaves de acesso foram regeneradas recuperando a chave da conta de armazenamento e o segredo Key Vault e, em seguida, 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:

Uma captura de tela que mostra a saída do comando A Z 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

Observe que o valor da chave corresponde ao segredo no Key Vault:

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

Usar uma função de rotação existente para várias contas de armazenamento

Você pode reutilizar o mesmo aplicativo de funções para girar chaves para mais de uma conta de armazenamento.

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

  • A função do serviço de operador da chave da conta de armazenamento atribuída ao aplicativo de funções para que possa acessar chaves de acesso da conta de armazenamento.
  • Uma assinatura de evento do Event Grid para SecretNearExpiry.
  1. Selecione o link de implantação do modelo Azure:

    Link de implantação de modelo do Azure.

  2. Na lista de grupos de recursos, selecione vaultrotation.

  3. No RG da Conta de Armazenamento, insira o nome do grupo de recursos em que a conta de armazenamento está localizada. Mantenha o padrão [resourceGroup().name] se a conta de armazenamento estiver no mesmo grupo de recursos que a função de rotação.

  4. No Nome da Conta de Armazenamento, insira o nome da conta de armazenamento cujas chaves de acesso você deseja girar.

  5. Em Key Vault RG, insira o nome do grupo de recursos em que o key vault está localizado. Mantenha o padrã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 Nome, insira o nome do key vault.

  7. No Nome do Aplicativo de Funções, insira o nome do aplicativo de funções.

  8. Em Nome do Segredo, insira o nome do segredo que armazena as chaves de acesso.

  9. Selecione Examinar + criar.

  10. Selecione Criar.

    Captura de tela que mostra como criar uma conta de armazenamento adicional.

Adicionar a chave de acesso da conta de armazenamento aos segredos do Key Vault

Determine a ID do recurso da conta de armazenamento. Você pode encontrar esse valor na id propriedade.

az storage account show -n vaultrotationstorage2

Liste as chaves de acesso da conta de armazenamento para que você possa obter o valor key2:

az storage account keys list -n vaultrotationstorage2

Adicione o segredo ao cofre de chaves com período de validade de 60 dias e (para demonstração) com data do término para amanhã para disparar a rotação imediatamente. Execute este comando com os valores obtidos 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:

Uma captura de tela que mostra a saída do comando A Z 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

Observe que o valor da chave corresponde ao segredo armazenado 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.

Desabilitar a rotação para um segredo

Para desabilitar a rotação de um segredo, exclua a assinatura da Grade de Eventos para esse segredo. Use o cmdlet do Azure PowerShell Remove-AzEventGridSubscription ou o comando da CLI do Azure az eventgrid event-subscription delete.

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

Este tutorial demonstra a rotação de segredos para contas do Armazenamento do Azure, mas você pode adaptar a função de rotação para outros serviços do Azure que usam credenciais duplas. GitHub Copilot pode ajudá-lo a modificar o código da função de rotação do PowerShell para trabalhar com seu 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.

GitHub Copilot é alimentado pela IA, portanto, surpresas e erros são possíveis. Para obter mais informações, consulte Copilot perguntas frequentes.

Próximas etapas