Automatizar a rotação de um segredo para recursos com dois conjuntos de credenciais de autenticação

A melhor maneira de se autenticar nos serviços do Azure é usando uma identidade gerenciada, mas há alguns cenários em que essa não é uma opção. Nesses casos, são usadas chaves de acesso ou senhas. Você deve fazer a rotação das chaves de acesso e senhas com frequência.

Este tutorial mostra como automatizar a rotação periódica de segredos para bancos de dados e serviços que usam dois conjuntos de credenciais de autenticação. Especificamente, este tutorial mostra como fazer a rotação das chaves de conta do Armazenamento do Azure armazenadas no Azure Key Vault como segredos. Você usará uma função disparada pela notificação da Grade de Eventos do Azure.

Observação

Para serviços de conta de armazenamento, é recomendável usar o Microsoft Entra ID para autorizar solicitações. Para obter mais informações, consulte Autorizar o acesso a blobs usando o Microsoft Entra ID. Há serviços que exigem cadeias de conexão de conta de armazenamento com chaves de acesso. Para esse cenário, recomendamos esta solução.

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

Diagram that shows the rotation solution.

Nesta solução, o Azure Key Vault armazena as chaves de acesso individuais da conta de Armazenamento como versões do mesmo segredo, alternando entre a chave primária e a secundária nas versões subsequentes. Quando uma chave de acesso é armazenada na versão mais recente do segredo, a chave alternativa é regenerada e adicionada ao Key Vault como a nova versão mais recente do segredo. A solução fornece um ciclo de rotação inteiro do aplicativo a fim de fazer a atualização para a chave regenerada mais recente.

  1. Trinta dias antes da data de validade de um segredo, o Key Vault publica o evento de expiração próxima 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 regenerá-la.
  4. O aplicativo de funções adiciona nova chave regenerada ao Azure Key Vault como uma nova versão do segredo.

Pré-requisitos

  • Uma assinatura do Azure. Crie uma gratuitamente.
  • Azure Cloud Shell. Este tutorial está usando o portal do Cloud Shell com o PowerShell
  • Azure Key Vault.
  • Duas contas de armazenamento do Azure.

Observação

A rotação de chave da conta de armazenamento compartilhado revoga a SAS (assinatura de acesso compartilhado) no nível da conta gerada com base nessa chave. Após a rotação de chave da conta de armazenamento, você deve regenerar os tokens SAS no nível da conta para evitar interrupções nos aplicativos.

Você poderá usar este link de implantação se não tiver um cofre de chaves existente e contas de armazenamento existentes:

Link that's labelled 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.

    Screenshot that shows how to create a resource group.

Agora você terá um cofre de chaves e duas contas de armazenamento. Verifique essa configuração na CLI do Azure ou no Azure PowerShell executando este comando:

az resource list -o table -g vaultrotation

Os resultados serão algo parecido com esta saída:

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, você criará um aplicativo de funções com uma identidade gerenciada pelo sistema, além dos outros componentes necessários. Você também implantará a função de rotação para as chaves da conta de armazenamento.

A função de rotação do aplicativo de funções exige os seguintes componentes e a seguinte configuração:

  • Um plano do Serviço de Aplicativo do Azure
  • Uma conta de armazenamento para gerenciar gatilhos do aplicativo de funções
  • Uma política de acesso para acessar segredos no Key Vault
  • A função do serviço de operador da chave da conta de armazenamento atribuída ao aplicativo de funções para que ela possa acessar as chaves de acesso da conta de armazenamento
  • Uma função de rotação de chaves com um gatilho de evento e um gatilho HTTP (rotação sob demanda)
  • Uma assinatura de evento da Grade de Eventos para o evento SecretNearExpiry
  1. Selecione o link de implantação de modelo do Azure:

    Azure template deployment link.

  2. Na lista Grupo de recursos, selecione vaultrotation.

  3. Na caixa GR da Conta de Armazenamento, insira o nome do grupo de recursos em que sua conta de armazenamento está localizada. Mantenha o valor padrão [resourceGroup().name] se sua conta de armazenamento já estiver localizada no mesmo grupo de recursos em que você implantará a função de rotação de chaves.

  4. Na caixa Nome da Conta de Armazenamento, insira o nome da conta de armazenamento que contém as chaves de acesso cuja rotação será feita. Mantenha o valor padrão [concat(resourceGroup().name, 'storage')] caso use a conta de armazenamento criada em Pré-requisitos.

  5. Na caixa GR do Cofre de Chaves, insira o nome do grupo de recursos no qual seu cofre de chaves estará localizado. Mantenha o valor padrão [resourceGroup().name] se seu cofre de chaves já existir no mesmo grupo de recursos em que você implantará a função de rotação de chaves.

  6. Na caixa Nome do Cofre de Chaves, insira o nome do cofre de chaves. Mantenha o valor padrão [concat(resourceGroup().name, '-kv')] caso use o cofre de chaves criado em Pré-requisitos.

  7. Na caixa Tipo de Plano do Serviço de Aplicativo, selecione o plano de hospedagem. O Plano Premium será necessário somente quando o cofre de chaves estiver atrás do firewall.

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

  9. Na caixa Nome do Segredo, insira o nome do segredo em que você armazenará as chaves de acesso.

  10. Na caixa URL do Repositório, insira a localização do GitHub do código de função. Neste tutorial, você pode usar https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git .

  11. Selecione Examinar + criar.

  12. Selecione Criar.

    Screenshot that shows how to create and deploy function.

Depois de concluir as etapas anteriores, você terá uma conta de armazenamento, um farm de servidores, um aplicativo de funções e o Application Insights. Quando a implantação estiver concluída, você verá esta página:

Screenshot that shows the Your deployment is complete page.

Observação

Se você encontrar uma falha, poderá selecionar Reimplantar para concluir a implantação dos componentes.

É possível encontrar modelos de implantação e o código da função de rotação em Exemplos do Azure.

Adicionar chaves de acesso da conta de armazenamento a segredos do Key Vault

Primeiro, defina sua política de acesso a fim de conceder à entidade de usuário permissões para gerenciar segredos:

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

Agora você pode criar um segredo com uma chave de acesso da conta de armazenamento como valor. Você também precisará da ID do recurso da conta de armazenamento, do período de validade do segredo e da ID da chave a ser adicionada ao segredo 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. É possível encontrar esse valor na propriedade id.

az storage account show -n vaultrotationstorage

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

az storage account keys list -n vaultrotationstorage

Adicione segredo ao cofre de chaves com um período de validade de 60 dias, ID de recurso da conta de armazenamento e para fins de demonstração. Para disparar a rotação imediatamente, defina a data de expiração para amanhã. Execute este comando, usando os valores recuperados para key1Value e storageAccountResourceId:

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddTHH:mm:ssZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Esse segredo disparará o evento SecretNearExpiry em alguns minutos. Esse evento disparará uma função para girar o segredo com um término definido como 60 dias. Nessa configuração, o evento 'SecretNearExpiry' seria disparado a cada 30 dias (30 dias antes da expiração) e a função de rotação alternará a rotação entre key1 e key2.

É possível verificar se as chaves de acesso foram regeneradas recuperando a chave de conta de armazenamento, bem como o segredo do Key Vault e comparando-os.

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

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

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

Screenshot that shows the output of the A Z keyvault secret show command for the first storage account.

Recupere as chaves de acesso para comparar os valores:

az storage account keys list -n vaultrotationstorage 

Observe que o value da chave é igual ao segredo do cofre de chaves:

Screenshot that shows the output of the A Z storage account keys list command for the first storage account.

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

Você pode reutilizar o mesmo aplicativo de funções para fazer a rotação das chaves para várias contas de armazenamento.

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

  • Da função do serviço de operador da chave da conta de armazenamento atribuída ao aplicativo de funções para que ela possa acessar as chaves de acesso da conta de armazenamento.
  • De uma assinatura de evento da Grade de Eventos para o evento SecretNearExpiry.
  1. Selecione o link de implantação de modelo do Azure:

    Azure template deployment link.

  2. Na lista Grupo de recursos, selecione vaultrotation.

  3. Na caixa GR da Conta de Armazenamento, insira o nome do grupo de recursos em que sua conta de armazenamento está localizada. Mantenha o valor padrão [resourceGroup().name] se sua conta de armazenamento já estiver localizada no mesmo grupo de recursos em que você implantará a função de rotação de chaves.

  4. Na caixa Nome da Conta de Armazenamento, insira o nome da conta de armazenamento que contém as chaves de acesso cuja rotação será feita.

  5. Na caixa GR do Cofre de Chaves, insira o nome do grupo de recursos no qual seu cofre de chaves estará localizado. Mantenha o valor padrão [resourceGroup().name] se seu cofre de chaves já existir no mesmo grupo de recursos em que você implantará a função de rotação de chaves.

  6. Na caixa Nome do Cofre de Chaves, insira o nome do cofre de chaves.

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

  8. Na caixa Nome do Segredo, insira o nome do segredo em que você armazenará as chaves de acesso.

  9. Selecione Examinar + criar.

  10. Selecione Criar.

    Screenshot that shows how to create an additional storage account.

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

Determine a ID do recurso da conta de armazenamento. É possível encontrar esse valor na propriedade id.

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 segredo ao cofre de chaves com um período de validade de 60 dias, ID de recurso da conta de armazenamento e para fins de demonstração. Para disparar a rotação imediatamente, defina a data de expiração para amanhã. Execute este comando, usando os valores recuperados para key2Value e storageAccountResourceId:

$tomorrowDate = (Get-Date).AddDays(+1).ToString('yyyy-MM-ddTHH:mm:ssZ')
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "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 a CredentialId é atualizada para o keyName alternativo e o value é regenerado:

Screenshot that shows the output of the A Z keyvault secret show command for the second storage account.

Recupere as chaves de acesso para comparar os valores:

az storage account keys list -n vaultrotationstorage 

Observe que o value da chave é igual ao segredo do cofre de chaves:

Screenshot that shows the output of the A Z storage account keys list command for the second storage account.

Desabilitar a rotação para o segredo

É possível desabilitar a rotação de um segredo simplesmente excluindo a assinatura da Grade de Eventos para esse segredo. Use o cmdlet Remove-AzEventGridSubscription do PowerShell ou o comando az event grid event--subscription delete da CLI do Azure.

Funções de rotação do Key Vault para dois conjuntos de credenciais

Um modelo de funções de rotação para dois conjuntos de credenciais e várias funções prontas para uso:

Observação

Essas funções de rotação serão criadas por um membro da comunidade, e não pela Microsoft. As funções do Community não têm suporte em qualquer programa ou serviço de suporte da Microsoft e elas são disponibilizadas como estão, sem garantias de qualquer tipo.

Próximas etapas