Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La mejor manera de autenticarse en Azure servicios es con una identidad administrada, pero algunos escenarios requieren una clave de acceso, una contraseña u otro secreto. Rota esos secretos periódicamente para reducir el impacto de una filtración de credenciales.
En este tutorial se muestra cómo automatizar la rotación periódica de secretos para bases de datos y servicios que usan un conjunto 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 gira una contraseña de SQL Server almacenada en Azure Key Vault mediante una función desencadenada por una notificación de Azure Event Grid:
Sugerencia
Para Azure SQL Database y Azure SQL Managed Instance, prefiera la autenticación exclusiva de Microsoft Entra en lugar de los inicios de sesión de SQL. Use el patrón de rotación de contraseñas en este tutorial solo cuando una carga de trabajo requiera autenticación de SQL.
- Treinta días antes de la fecha de expiración de un secreto, Key Vault publica el evento "casi expirado" en Event Grid.
- 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.
- La aplicación de funciones recibe la información secreta, genera una nueva contraseña aleatoria y crea una nueva versión para el secreto con la nueva contraseña en Key Vault.
- La aplicación de funciones actualiza SQL Server con la nueva contraseña.
Nota:
Puede haber un retraso entre los pasos 3 y 4. Durante esa ventana, el secreto de Key Vault no se puede autenticar en SQL Server. Si se produce un error en algún paso, Event Grid reintenta durante dos horas.
Prerrequisitos
- Una suscripción Azure: crear una gratuita.
- Azure Key Vault
- SQL Server.
Si aún no tiene un almacén de claves y una instancia de SQL Server, use este enlace de implementación:
- En Grupo de recursos, seleccione Crear nuevo y asigne un nombre al grupo. En este tutorial se usa akvrotation.
- En Inicio de sesión de administrador de SQL, escriba el nombre de inicio de sesión del administrador de SQL.
- Selecciona Revisar + crear.
- Selecciona Crear.
Ahora tiene un almacén de claves y una instancia de SQL Server. Compruebe esta configuración en el CLI de Azure:
az resource list -o table -g akvrotation
El resultado es similar al siguiente 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
Creación e implementación de la función de rotación de contraseñas de SQL Server
Importante
Esta plantilla requiere que el almacén de claves, SQL Server instancia y la aplicación de funciones estén en el mismo grupo de recursos.
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 de contraseñas SQL Server.
La aplicación de funciones requiere estos componentes:
- Un plan de Azure App Service.
- Una aplicación de funciones con una función de rotación de contraseñas de SQL que tiene un desencadenador de Event Grid y un desencadenador HTTP.
- Una cuenta de almacenamiento para la administración de los desencadenadores de la aplicación de funciones.
- Una asignación de rol de Azure que permite a la identidad de la aplicación de funciones acceder a los secretos del almacén de claves.
- Una suscripción de eventos de Event Grid para el evento SecretNearExpiry .
Seleccione el vínculo de implementación de plantilla de Azure:
En la lista Grupo de recursos, seleccione akvrotation.
En SQL Server Nombre, escriba el nombre de la instancia de SQL Server cuya contraseña desea rotar.
En Nombre del almacén de claves, escriba el nombre del almacén de claves.
En Nombre de la aplicación de funciones, escriba el nombre de la aplicación de funciones.
En Nombre secreto, escriba el nombre del secreto que almacena la contraseña.
En URL del repositorio, introduzca la ubicación de GitHub del código de la función:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.Selecciona Revisar + crear.
Selecciona Crear.
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.
Después de completar los pasos anteriores, tiene una cuenta de almacenamiento, una granja de servidores y una aplicación de funciones. Compruebe esta configuración en el CLI de Azure:
az resource list -o table -g akvrotation
El resultado es similar al siguiente 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 obtener más información sobre cómo crear una aplicación de funciones y usar una identidad administrada para acceder a Key Vault, consulte Creación de una aplicación de funciones desde el portal de Azure, Uso de la identidad administrada para App Service y Azure Functions y Proporcionar acceso a Key Vault con Azure RBAC.
Nota:
La función de ejemplo tiene como destino el modelo de .NET en proceso para Azure Functions. Para los nuevos desarrollos, use el modelo de trabajo aislado de .NET, que es el modelo admitido de ahora en adelante.
Función de rotación
La función implementada en el paso anterior utiliza un evento para activar la rotación de secretos. Actualiza Key Vault y la base de datos SQL.
Evento de activación de función
Esta función lee los datos de eventos y ejecuta la lógica de rotación:
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 rotación de secretos
Este método de rotación lee la información de la base de datos del secreto, crea una nueva versión del secreto y actualiza la base de datos con el nuevo secreto:
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");
}
}
Puede encontrar el código completo en GitHub.
Agregar el secreto al Key Vault
Asigna a tu cuenta el rol de Responsable de secretos de Key Vault para que puedas 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/akvrotation-kv
Cree un secreto con etiquetas que contengan el identificador de recurso de SQL Server, el nombre de inicio de sesión SQL Server y el período de validez del secreto en días. Establezca el nombre del secreto, la contraseña inicial de la base de datos SQL (Simple123 en este ejemplo) y una fecha de expiración establecida en mañana para que la rotación se desencadene inmediatamente.
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
Al establecer una fecha de caducidad corta, se publica un SecretNearExpiryevento en un plazo de 15 minutos, lo que activa la función para rotar el secreto.
Prueba y comprobación
Para comprobar que el secreto se ha rotado, ve a Key Vault>Secretos:
Abra el secreto sqlPassword y vea las versiones originales y rotadas:
Creación de una aplicación web
Para comprobar las credenciales de SQL, cree una aplicación web. La aplicación web recupera el secreto de Key Vault, extrae la información y las credenciales de la base de datos SQL del secreto y prueba la conexión a SQL Server.
La aplicación web requiere estos componentes:
- Una aplicación web con una identidad administrada asignada por el sistema.
- Una asignación de rol que permite a la identidad administrada de la aplicación web leer secretos en el almacén de claves.
Seleccione el vínculo de implementación de plantilla de Azure:
Seleccione el grupo de recursos akvrotation .
En Nombre de SQL Server, introduzca el nombre de SQL Server del que cambió la contraseña.
En Nombre de Key Vault, escriba el nombre del Key Vault.
En Nombre secreto, escriba el nombre del secreto que almacena la contraseña.
En URL del repositorio, introduzca la ubicación de GitHub del código de la aplicación web:
https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.Selecciona Revisar + crear.
Selecciona Crear.
Abrir la aplicación web
Vaya a la dirección URL de la aplicación implementada: https://akvrotation-app.azurewebsites.net/.
Cuando se abre la aplicación en el explorador, la página muestra el valor secreto generado y un valor conectado a la base de datos de true.
Utiliza IA para personalizar la función de rotación de la base de datos
En este tutorial se muestra la rotación de secretos para SQL Server, pero puede adaptar el mecanismo de rotación para otros tipos de bases de datos. GitHub Copilot puede ayudarle a modificar el código de función de rotación para trabajar con la base de datos o el 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.
Copilot también puede ayudarle a adaptar este patrón para otros tipos de credenciales, como claves de API, cadenas de conexión o contraseñas de cuenta de servicio.
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.