Automatización de la rotación de un secreto para los recursos que tienen dos conjuntos de credenciales de autenticación

La mejor manera de autenticarse en Azure servicios es con una identidad administrada, pero algunos escenarios todavía requieren claves de acceso o contraseñas. Rote esas credenciales con frecuencia para reducir el impacto de una filtración.

En este tutorial se muestra cómo automatizar la rotación periódica de secretos para bases de datos y servicios que usan dos conjuntos de credenciales de autenticación. Para obtener una visión general de la rotación automática en distintos tipos de recursos, consulte Descripción de la rotación automática en Azure Key Vault.

En concreto, este tutorial rota las claves de la cuenta de almacenamiento de Azure que se almacenan en Azure Key Vault como secretos. Usa una función desencadenada por una notificación de Azure Event Grid.

Important

Para Azure Storage, prefiera la autorización de Microsoft Entra ID con una identidad administrada en lugar de las claves compartidas de la cuenta. Cuando el cumplimiento lo permita, deshabilite la autorización de clave compartida en la cuenta de almacenamiento y quite completamente la necesidad de rotación de claves. Use el patrón de este tutorial solo cuando una carga de trabajo requiera una clave de cuenta de almacenamiento o un cadena de conexión.

Esta es la solución de rotación que se describe en este tutorial:

Diagrama que muestra la solución de rotación.

En esta solución, Azure Key Vault almacena cada clave de acceso de la cuenta de almacenamiento como una versión del mismo secreto, alternando entre la clave principal y la secundaria en versiones sucesivas. Cuando se almacena una clave de acceso como la versión más reciente del secreto, se vuelve a generar la clave alternativa y se agrega a Key Vault como la nueva versión más reciente. Este diseño proporciona a la aplicación un ciclo de rotación completo para recoger la clave recién regenerada.

  1. Treinta días antes de la fecha de expiración de un secreto, Key Vault publica el evento casi expirado en Event Grid.
  2. Event Grid comprueba las suscripciones del evento y usa HTTP POST para llamar al punto de conexión de la aplicación de funciones suscrita al evento.
  3. La aplicación de funciones identifica la clave alternativa (no la más reciente) y llama a la cuenta de almacenamiento para volver a generarla.
  4. La aplicación de funciones agrega la clave regenerada a Azure Key Vault como la nueva versión del secreto.

Prerrequisitos

  • Una suscripción Azure. Cree una cuenta gratuita.
  • Azure Cloud Shell. En este tutorial se usa el portal Cloud Shell con el entorno de PowerShell.
  • Un almacén de claves de Azure.
  • Dos cuentas de almacenamiento Azure.

Nota:

La rotación de una clave de cuenta de almacenamiento compartida revoca cualquier firma de acceso compartido (SAS) de nivel de cuenta generada a partir de esa clave. Después de la rotación, regenere los tokens SAS a nivel de cuenta para evitar interrupciones para las aplicaciones.

Si no tiene un almacén de claves existente y dos cuentas de almacenamiento, use este vínculo de implementación:

Link con la etiqueta Deploy to Azure.

  1. En Grupo de recursos, seleccione Crear nuevo. Asigne al grupo el nombre rotación del almacén y seleccione Aceptar.

  2. Selecciona Revisar + crear.

  3. Selecciona Crear.

    Captura de pantalla que muestra cómo crear un grupo de recursos.

Ahora tiene un almacén de claves y dos cuentas de almacenamiento. Compruebe esta configuración en el CLI de Azure o Azure PowerShell:

az resource list -o table -g vaultrotation

El resultado es similar al siguiente 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

Creación e implementación de la función de rotación de claves

A continuación, cree una aplicación de funciones con una identidad administrada asignada por el sistema junto con los demás componentes necesarios e implemente la función de rotación para las claves de la cuenta de almacenamiento.

La función de rotación requiere los siguientes componentes y configuración:

  • Un plan de Azure App Service.
  • Una cuenta de almacenamiento para administrar los activadores de una aplicación de funciones.
  • Una asignación de rol de Azure que permite a la aplicación de funciones acceder a los secretos del Key Vault.
  • El rol de servicio Operador de claves de cuenta de almacenamiento asignado a la aplicación de funciones para que pueda acceder a las claves de acceso de la cuenta de almacenamiento.
  • Función de rotación de claves con un desencadenador de Event Grid y un desencadenador HTTP (para la rotación a petición).
  • Una suscripción de eventos de Event Grid para el evento SecretNearExpiry .
  1. Seleccione el vínculo de implementación de plantilla de Azure:

    Enlace de implementación de plantilla de Azure.

  2. En la lista Grupo de recursos, seleccione vaultrotation.

  3. En RG de la cuenta de almacenamiento, escriba el nombre del grupo de recursos donde se encuentra la cuenta de almacenamiento. Mantenga el valor predeterminado [resourceGroup().name] si la cuenta de almacenamiento está en el mismo grupo de recursos que la función de rotación.

  4. En Nombre de la cuenta de almacenamiento, escriba el nombre de la cuenta de almacenamiento cuyas claves de acceso desea rotar. Mantenga el valor predeterminado [concat(resourceGroup().name, 'storage')] si usa la cuenta de almacenamiento de Requisitos previos.

  5. En Key Vault RG, escriba el nombre del grupo de recursos donde se encuentra el key vault. Mantenga el valor predeterminado [resourceGroup().name] si el almacén de claves está en el mismo grupo de recursos que la función de rotación.

  6. En Nombre de Key Vault, escriba el nombre del Key Vault. Mantén el valor predeterminado [concat(resourceGroup().name, '-kv')] si usas el almacén de claves indicado en Requisitos previos.

  7. En Tipo de plan de App Service, seleccione el plan de hospedaje. El plan Premium solo es necesario cuando el almacén de claves está detrás de un firewall.

  8. En Nombre de la aplicación de funciones, escriba el nombre de la aplicación de funciones.

  9. En Nombre secreto, escriba el nombre del secreto que almacena las claves de acceso.

  10. En URL del repositorio, introduzca la ubicación de GitHub del código de la función: https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git.

  11. Selecciona Revisar + crear.

  12. Selecciona Crear.

    Captura de pantalla que muestra cómo crear e implementar la función.

Una vez completada la implementación, tiene una cuenta de almacenamiento, una granja de servidores, una aplicación de funciones y un recurso de Application Insights:

Captura de pantalla que muestra la página Su implementación está completa.

Nota:

Esta plantilla de ARM usa la implementación de control de código fuente (Kudu) de App Service para extraer el código de función de GitHub. Para una carga de trabajo en producción, recomendamos un despliegue basado en paquetes, como func azure functionapp publish o zip deploy con WEBSITE_RUN_FROM_PACKAGE. Si se produce un error en la implementación, seleccione Volver a implementar para reintentar.

Las plantillas de implementación y el código de la función de rotación se encuentran en Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

Añada las claves de acceso de la cuenta de almacenamiento a los secretos de Key Vault

En primer lugar, asígnate el rol de Responsable de secretos de Key Vault para poder administrar los secretos del almacén:

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

Ahora puede crear un secreto cuyo valor sea una clave de acceso de la cuenta de almacenamiento. Junto con el valor, agregue el identificador de recurso de la cuenta de almacenamiento, el período de validez del secreto y el identificador de clave como etiquetas para que la función de rotación pueda volver a generar la clave en la cuenta de almacenamiento.

Determine el identificador de recurso de la cuenta de almacenamiento. Es la propiedad id:

az storage account show -n vaultrotationstorage

Enumere las claves de acceso de la cuenta de almacenamiento para que pueda obtener los valores de clave:

az storage account keys list -n vaultrotationstorage

Añade el secreto al almacén de claves con un periodo de validez de 60 días y (a modo de demostración) una fecha de caducidad fijada para mañana, con el fin de activar la rotación de inmediato. Ejecute este comando con los valores recuperados para key1Value y 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 secreto desencadena un evento SecretNearExpiry al cabo de unos minutos, que a su vez activa la función que rota el secreto con un vencimiento fijado a 60 días. En esa configuración, el evento SecretNearExpiry se activa cada 30 días (30 días antes del vencimiento), y la función de rotación alterna entre key1 y key2.

Compruebe que las claves de acceso se regeneran recuperando la clave de la cuenta de almacenamiento y el secreto de Key Vault y, a continuación, compárelas.

Use este comando para obtener la información secreta:

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

Tenga en cuenta que CredentialId se actualiza a la alternativa keyName y que value se vuelve a generar:

Recorte de pantalla que muestra la salida del comando A Z keyvault secret show para la primera cuenta de almacenamiento.

Recupere las claves de acceso para comparar los valores:

az storage account keys list -n vaultrotationstorage

Fíjate en que el valor de la clave coincide con el secreto del almacén de claves:

Captura de pantalla que muestra la salida del comando A Z storage account keys list para la primera cuenta de almacenamiento.

Uso de una función de rotación existente para varias cuentas de almacenamiento

Puede reutilizar la misma aplicación de funciones para rotar las claves de más de una cuenta de almacenamiento.

Para agregar las claves de otra cuenta de almacenamiento a una función de rotación existente, necesita:

  • El rol de servicio Operador de claves de cuenta de almacenamiento asignado a la aplicación de funciones para que pueda acceder a las claves de acceso de la cuenta de almacenamiento.
  • Una suscripción de eventos de Event Grid para el evento SecretNearExpiry .
  1. Seleccione el vínculo de implementación de plantilla de Azure:

    Enlace de implementación de plantilla de Azure.

  2. En la lista Grupo de recursos, seleccione vaultrotation.

  3. En RG de la cuenta de almacenamiento, escriba el nombre del grupo de recursos donde se encuentra la cuenta de almacenamiento. Mantenga el valor predeterminado [resourceGroup().name] si la cuenta de almacenamiento está en el mismo grupo de recursos que la función de rotación.

  4. En Nombre de la cuenta de almacenamiento, escriba el nombre de la cuenta de almacenamiento cuyas claves de acceso desea rotar.

  5. En Key Vault RG, escriba el nombre del grupo de recursos donde se encuentra el key vault. Mantenga el valor predeterminado [resourceGroup().name] si el almacén de claves está en el mismo grupo de recursos que la función de rotación.

  6. En Nombre de Key Vault, escriba el nombre del Key Vault.

  7. En Nombre de la aplicación de funciones, escriba el nombre de la aplicación de funciones.

  8. En Nombre secreto, escriba el nombre del secreto que almacena las claves de acceso.

  9. Selecciona Revisar + crear.

  10. Selecciona Crear.

    Captura de pantalla que muestra cómo crear una cuenta de almacenamiento adicional.

Añadir la clave de acceso de la cuenta de almacenamiento a los secretos de Key Vault

Determine el identificador de recurso de la cuenta de almacenamiento. Puede encontrar este valor en la id propiedad .

az storage account show -n vaultrotationstorage2

Enumere las claves de acceso de la cuenta de almacenamiento para que pueda obtener el valor key2:

az storage account keys list -n vaultrotationstorage2

Añade el secreto al almacén de claves con un periodo de validez de 60 días y (a modo de demostración) una fecha de caducidad fijada para mañana, con el fin de activar la rotación de inmediato. Ejecute este comando con los valores recuperados para key2Value y 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 obtener la información secreta:

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

Tenga en cuenta que CredentialId se actualiza a la alternativa keyName y que value se vuelve a generar:

Recorte de pantalla que muestra la salida del comando A Z keyvault secret show para la segunda cuenta de almacenamiento.

Recupere las claves de acceso para comparar los valores:

az storage account keys list -n vaultrotationstorage2

Fíjate en que el valor de la clave coincide con el secreto del almacén de claves:

Captura de pantalla que muestra la salida del comando A Z storage account keys list para la segunda cuenta de almacenamiento.

Desactivar la rotación de un secreto

Para deshabilitar la rotación de un secreto, elimine la suscripción de Event Grid para ese secreto. Use el cmdlet Remove-AzEventGridSubscription de Azure PowerShell o el comando CLI de Azure az eventgrid event-subscription delete.

Utilice AI para personalizar la función de rotación para otros servicios

En este tutorial se muestra la rotación de secretos para las cuentas de Azure Storage, pero puede adaptar la función de rotación para otros servicios de Azure que usan credenciales duales. GitHub Copilot puede ayudarle a modificar el código de la función de rotación de PowerShell para trabajar con el servicio.

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 funciona con inteligencia artificial, por lo que son posibles sorpresas y errores. Para obtener más información, vea Copilot preguntas más frecuentes.

Pasos siguientes