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 usar una identidad administrada, pero hay algunos escenarios en los que eso no es una opción. En esos casos, se usan claves de acceso o secretos. Debe rotar periódicamente las claves de acceso o los secretos.
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 información general completa sobre los conceptos y ventajas de la asignación automática en distintos tipos de recursos, consulte Understanding autorotation in Azure Key Vault.
En concreto, este tutorial rota las contraseñas de SQL Server almacenadas en Azure Key Vault mediante una función desencadenada por una notificación de Azure Event Grid.
- 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:
Podría haber un retraso entre los pasos 3 y 4. Durante ese tiempo, el secreto de Key Vault no podrá autenticarse en SQL Server. En caso de error de cualquiera de los pasos, Event Grid reintenta durante dos horas.
Prerrequisitos
- Una suscripción Azure: crear una gratuita.
- Azure Key Vault
- SQL Server
Si no tiene Key Vault y SQL Server existentes, puede usar este vínculo de implementación:
- En Grupo de recursos, seleccione Crear nuevo. Asigne un nombre a un grupo, usamos akvrotation en este tutorial.
- En Inicio de sesión de administrador de SQL, escriba Nombre de inicio de sesión del administrador de SQL.
- Selecciona Revisar + crear.
- Seleccione Crear
Ahora tendrá una Key Vault y una instancia de SQL Server. Para comprobar esta configuración en el CLI de Azure, ejecute el comando siguiente:
az resource list -o table -g akvrotation
El resultado tendrá un aspecto similar a la salida siguiente:
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 y Azure Function estén en el mismo grupo de recursos.
A continuación, cree una aplicación de funciones con una identidad administrada por el sistema, además de los demás componentes necesarios e implemente funciones de rotación de contraseñas de SQL Server.
La aplicación de funciones requiere estos componentes:
- Un plan de Azure App Service
- Una aplicación de funciones con funciones de rotación de contraseñas SQL con desencadenador de eventos y desencadenador http.
- Se requiere una cuenta de almacenamiento para la gestión de desencadenadores de la aplicación de funciones.
- Asignación de roles de RBAC de Azure para que la identidad de la aplicación de funciones acceda a secretos en Key Vault
- 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 Nombre de SQL Server, escriba el nombre de la instancia de SQL Server con la contraseña que se va a rotar.
En el Nombre del Key Vault, escriba el nombre del Key Vault.
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 donde se almacenará la contraseña.
En el Repo Url, escriba la ubicación del código de función GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Selecciona Revisar + crear.
Selecciona Crear.
Después de completar los pasos anteriores, tendrá una cuenta de almacenamiento, una granja de servidores y una aplicación de funciones. Para comprobar esta configuración en el CLI de Azure, ejecute el comando siguiente:
az resource list -o table -g akvrotation
El resultado tendrá un aspecto similar al siguiente:
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 información sobre cómo crear una aplicación de funciones y usar la identidad administrada para acceder a Key Vault, consulte Crear una aplicación de funciones desde el portal de Azure, Cómo usar la identidad administrada para App Service y Azure Functions y Provide acceso a Key Vault con Azure RBAC.
Función de rotación
La función implementada en el paso anterior utiliza un evento para desencadenar la rotación de un secreto mediante la actualización de 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
Establezca la directiva de acceso para conceder permisos de administración de secretos a los usuarios:
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 nuevo 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. Proporcione el nombre del secreto, la contraseña inicial de la base de datos SQL (en nuestro ejemplo "Simple123") e incluya una fecha de expiración establecida para mañana.
$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddThh:mm:ssZ")
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 crear un secreto con una fecha de expiración corta, se publicará un SecretNearExpiry evento en un plazo de 15 minutos, que a su vez desencadenará la función para rotar el secreto.
Prueba y comprobación
Para comprobar que el secreto ha rotado, vaya a Key Vault>Secrets:
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. Esta aplicación web obtendrá el secreto de Key Vault, extraerá información y credenciales de la base de datos SQL del secreto y probará la conexión a SQL Server.
La aplicación web requiere estos componentes:
- Una aplicación web con identidad administrada por el sistema
- Una directiva de acceso para acceder a secretos en Key Vault a través de la identidad administrada de la aplicación web
Seleccione el vínculo de implementación de plantilla de Azure:
Seleccione el grupo de recursos akvrotation .
En Nombre de SQL Server, escriba el nombre de la instancia de SQL Server con la contraseña que se va a rotar.
En el Nombre del Almacén de Claves, escriba el nombre del almacén de claves
En Secret Name (Nombre secreto), escriba el nombre del secreto donde se almacena la contraseña.
En Repo Url, escriba la ubicación del código de la aplicación web en GitHub (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 abra la aplicación en el explorador, verá 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 en VS Code puede ayudarle a modificar el código de función de rotación para trabajar con su base de datos o tipo de credencial específico.
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.