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 los servicios de Azure 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 una visión general completa sobre los conceptos y ventajas de la autorrotación en distintos tipos de recursos, consulte Comprender la autorrotación en Azure Key Vault.
En concreto, en este tutorial se rotan las contraseñas de SQL Server almacenadas en Azure Key Vault mediante una función desencadenada por la notificación de Azure Event Grid:
- Treinta días antes de la fecha de expiración de un secreto, Key Vault publica el evento de "expiración cercana" 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 del secreto, genera una nueva contraseña aleatoria y crea una versión del secreto con la contraseña nueva 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 a Azure: cree una cuenta gratuita.
- Azure Key Vault
- Servidor SQL
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 instancia de Key Vault y una instancia de SQL Server. Para comprobar esta configuración en la CLI de Azure, ejecute el siguiente comando:
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 la función de Azure 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.
- Una política de acceso para la identidad de Function App que permita la obtención de secretos en Key Vault.
- Una suscripción de eventos de Event Grid para el evento SecretNearExpiry
Seleccione el vínculo implementación de plantillas 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 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 donde se almacenará la contraseña.
En la URL del repositorio, escriba la ubicación del código de función de 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 la CLI de Azure, ejecute el siguiente comando:
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 Creación de una aplicación de funciones desde Azure Portal, Uso de la identidad administrada para App Service y Azure Functions y Asignación de una directiva de acceso de Key Vault mediante Azure Portal.
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.
Añadir el secreto a Key Vault
Establezca la directiva de acceso para conceder permisos de administración de secretos a los usuarios:
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
Cree un nuevo secreto con etiquetas que contengan el identificador de recurso de SQL Server, el nombre de inicio de sesión de 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("yyy-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>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. 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 los secretos de Key Vault a través de la identidad administrada de la aplicación web
Seleccione el vínculo implementación de plantillas 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 la dirección URL del repositorio, 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.