Automatiser la rotation des secrets pour les ressources utilisant un ensemble de données d'authentification

La meilleure façon de s’authentifier auprès de Azure services est avec une identité managée, mais certains scénarios nécessitent une clé d’accès, un mot de passe ou un autre secret. Renouvelez régulièrement ces secrets afin de réduire l’impact de la compromission d’un moyen d’authentification.

Ce tutoriel montre comment automatiser la rotation périodique des secrets pour les bases de données et les services qui utilisent un ensemble d’informations d’identification d’authentification. Pour obtenir une vue d’ensemble de l’autorotation entre différents types de ressources, consultez Présentation de l’autorotation dans Azure Key Vault.

Plus précisément, ce didacticiel effectue une rotation d'un mot de passe SQL Server stocké dans Azure Key Vault, à l'aide d'une fonction déclenchée par une notification Azure Event Grid :

Conseil / Astuce

Pour Azure SQL Database et Azure SQL Managed Instance, préférez l’authentification Microsoft Entra uniquement par rapport aux connexions SQL. Utilisez le modèle de rotation de mot de passe dans ce didacticiel uniquement lorsqu’une charge de travail nécessite une authentification SQL.

Diagramme de la solution de rotation

  1. Trente jours avant la date d’expiration d’un secret, Key Vault publie l’événement « expiration proche » dans Event Grid.
  2. Event Grid vérifie les abonnements aux événements et utilise HTTP POST pour appeler le point de terminaison de l’application de fonction abonné à l’événement.
  3. L’application de fonction reçoit les informations secrètes, génère un nouveau mot de passe aléatoire et crée une nouvelle version pour le secret avec le nouveau mot de passe dans Key Vault.
  4. L’application de fonction met à jour SQL Server avec le nouveau mot de passe.

Remarque

Il peut y avoir un décalage entre les étapes 3 et 4. Pendant cette fenêtre, le secret dans Key Vault ne peut pas s'authentifier auprès de SQL Server. Si une étape échoue, Event Grid réessaye pendant deux heures.

Conditions préalables

Si vous ne disposez pas déjà d'un coffre de clés et d'une instance de SQL Server, utilisez ce lien de déploiement :

Image affichant un bouton intitulé « Déployer sur Azure ».

  1. Sous Groupe de ressources, sélectionnez Créer et donnez un nom au groupe. Ce tutoriel utilise akvrotation.
  2. Sous Connexion d’administrateur SQL, entrez le nom de connexion de l’administrateur SQL.
  3. Sélectionnez Vérifier + créer.
  4. Cliquez sur Créer.

Créer un groupe de ressources

Vous disposez maintenant d’un coffre de clés et d’une instance de SQL Server. Vérifiez cette configuration dans la Azure CLI :

az resource list -o table -g akvrotation

Le résultat ressemble à la sortie suivante :

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

Créer et déployer la fonction de rotation de mot de passe SQL Server

Important

Ce modèle nécessite que le coffre de clés, l’instance SQL Server et l’application de fonction se trouvent dans le même groupe de ressources.

Ensuite, créez une application de fonction avec une identité managée affectée par le système, ainsi que les autres composants requis, puis déployez la fonction de rotation de mot de passe SQL Server.

L’application de fonction nécessite ces composants :

  • Un plan Azure App Service.
  • Application de fonction avec une fonction de rotation de mot de passe SQL qui a un déclencheur Event Grid et un déclencheur HTTP.
  • Un compte de stockage pour la gestion des déclencheurs d’application de fonction.
  • Attribution de rôle Azure qui permet à l’identité d’une application de fonctions d’accéder aux secrets du coffre de clés.
  • Un abonnement aux événements Event Grid pour l’événement SecretNearExpiry .
  1. Sélectionnez le lien de déploiement de modèle Azure :

    Image affichant un bouton intitulé « Déployer sur Azure ».

  2. Dans la liste des groupes de ressources, sélectionnez akvrotation.

  3. Dans SQL Server Nom, entrez le nom de l’instance SQL Server dont vous souhaitez faire pivoter le mot de passe.

  4. Dans Nom du coffre de clés, entrez le nom du coffre de clés.

  5. Dans Nom de l’application de fonction, entrez le nom de l’application de fonction.

  6. Dans Nom du secret, entrez le nom du secret qui stocke le mot de passe.

  7. Dans l’URL du dépôt, entrez l’emplacement GitHub du code de fonction : https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Sélectionnez Vérifier + créer.

  9. Cliquez sur Créer.

Remarque

Ce modèle ARM utilise le déploiement de contrôle de code source App Service (Kudu) pour extraire le code de fonction de GitHub. Pour une charge de travail en production, nous vous recommandons plutôt d’utiliser un déploiement basé sur un package, tel que func azure functionapp publish ou le déploiement zip avec WEBSITE_RUN_FROM_PACKAGE.

Sélectionnez Vérifier + créer.

Une fois les étapes précédentes effectuées, vous disposez d’un compte de stockage, d’une batterie de serveurs et d’une application de fonction. Vérifiez cette configuration dans la Azure CLI :

az resource list -o table -g akvrotation

Le résultat ressemble à la sortie suivante :

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

Pour plus d’informations sur la création d’une application de fonction et l’utilisation d’une identité managée pour accéder à Key Vault, consultez Créer une application de fonction à partir du portail Azure, Comment utiliser l’identité managée pour App Service et Azure Functions et fournir l’accès à Key Vault avec Azure RBAC.

Remarque

L’exemple de fonction cible le modèle .NET in-process pour Azure Functions. Pour tout nouveau développement, utilisez le modèle de processus de travail isolé .NET, qui est le modèle pris en charge désormais.

Fonction de rotation

La fonction déployée à l’étape précédente utilise un événement pour déclencher la rotation des secrets. Il met à jour Key Vault et la base de données SQL.

Événement de déclenchement de fonction

Cette fonction lit les données d’événement et exécute la logique de rotation :

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);
   }
}

Logique de permutation du secret

Cette méthode de rotation lit les informations de base de données à partir du secret, crée une nouvelle version du secret et met à jour la base de données avec le nouveau secret :

    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");
        }
}

Vous trouverez le code complet sur GitHub.

Ajouter le secret à Key Vault

Attribuez-vous le rôle Agent des secrets Key Vault afin de pouvoir gérer les secrets dans le coffre :

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

Créez un secret avec des balises qui contiennent l’ID de ressource SQL Server, le nom de connexion SQL Server et la période de validité du secret en jours. Définissez le nom du secret, le mot de passe initial de la base de données SQL (Simple123 dans cet exemple) et une date d’expiration définie sur demain afin que la rotation se déclenche immédiatement.

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

Définir une date d’expiration courte publie un événement SecretNearExpiry dans un délai de 15 minutes, ce qui déclenche la fonction chargée d’effectuer la rotation du secret.

Tester et vérifier

Pour vérifier que le secret a été renouvelé, accédez à Key Vault>Secrets :

Capture d'écran qui montre comment accéder aux Secrets de Key Vault>.

Ouvrez le secret sqlPassword et affichez les versions d’origine et pivotées :

Accéder à Secrets

Créer une application web

Pour vérifier les informations d’identification SQL, créez une application web. L’application web récupère le secret de Key Vault, extrait les informations et informations d’identification de la base de données SQL à partir du secret et teste la connexion à SQL Server.

L’application web nécessite ces composants :

  • Une application web avec une identité managée affectée par le système.
  • Une attribution de rôle qui permet à l’identité gérée de l’application Web de lire les secrets du coffre de clés.
  1. Sélectionnez le lien de déploiement de modèle Azure :

    Image affichant un bouton intitulé « Déployer sur Azure ».

  2. Sélectionnez le groupe de ressources akvrotation .

  3. Dans Nom du serveur SQL, saisissez le nom du serveur SQL dont vous avez modifié le mot de passe.

  4. Dans Nom du coffre de clés, entrez le nom du coffre de clés.

  5. Dans Nom du secret, entrez le nom du secret qui stocke le mot de passe.

  6. Dans l’URL du dépôt, entrez l’emplacement GitHub du code de l’application web : https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Sélectionnez Vérifier + créer.

  8. Cliquez sur Créer.

Ouvrir l’application web

Accédez à l’URL de l’application déployée : https://akvrotation-app.azurewebsites.net/.

Lorsque l’application s’ouvre dans le navigateur, la page affiche la valeur secrète générée et une valeur connectée à la base de données de true.

Utiliser l’IA pour personnaliser la fonction de rotation de votre base de données

Ce tutoriel montre la rotation de secrets pour SQL Server, mais vous pouvez adapter la fonction de rotation des secrets pour d’autres types de bases de données. GitHub Copilot peut vous aider à modifier le code de la fonction de rotation pour fonctionner avec votre base de données ou votre type d’identifiants.

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 pouvez également vous aider à adapter ce modèle pour d’autres types d’informations d’identification tels que les clés API, les chaînes de connexion ou les mots de passe de compte de service.

GitHub Copilot est alimenté par l’IA, donc les surprises et les erreurs sont possibles. Pour plus d’informations, consultez Copilot FAQ.

Pour en savoir plus