Partager via


Tutoriel : Créer une connexion sans mot de passe à un service de base de données par le biais de Service Connector

Les connexions sans mot de passe utilisent des identités managées pour accéder aux services Azure. Avec cette approche, vous n’avez pas besoin de suivre et de gérer manuellement les secrets pour les identités managées. Ces tâches sont gérées de manière sécurisée en interne par Azure.

Service Connector active les identités managées dans les services d’hébergement d’applications comme Azure Spring Apps, Azure App Service et Azure Container Apps. Service Connector configure également les services de base de données, tels qu’Azure Database pour PostgreSQL, Azure Database pour MySQL et Azure SQL Database, pour accepter les identités managées.

Ce tutoriel explique comment utiliser Azure CLI pour effectuer les tâches suivantes :

  • Vérifier votre environnement initial avec Azure CLI.
  • Créer une connexion sans mot de passe avec Service Connector.
  • Utiliser les variables d’environnement ou les configurations générées par Service Connector pour accéder à un service de base de données.

Prérequis

Configurer votre environnement

Compte

Connectez-vous avec Azure CLI par le biais de az login. Si vous utilisez Azure Cloud Shell ou si vous êtes déjà connecté, confirmez votre compte authentifié avec az account show.

Installer l’extension sans mot de passe Service Connector

Installez l’extension sans mot de passe Connecteur de services pour Azure CLI la plus récente :

az extension add --name serviceconnector-passwordless --upgrade

Remarque

Vérifiez que la version de l’extension « serviceconnector-passwordless » est « 2.0.2 » ou ultérieure en exécutant az version. Vous serez peut-être amené d’abord à mettre à niveau Azure CLI pour mettre à niveau la version de l’extension.

Créer une connexion sans mot de passe

Ensuite, nous utilisons Azure App Service comme exemple pour créer une connexion à l’aide d’une identité managée.

Si vous utilisez :

Notes

Si vous utilisez le portail Azure, accédez au panneau Service Connector d’Azure App Service, Azure Spring Apps ou Azure Container Apps, puis sélectionnez Créer pour créer une connexion. Le portail Azure compose automatiquement la commande à votre place et déclenche l’exécution de la commande sur Cloud Shell.

La commande Azure CLI suivante utilise un paramètre --client-type, il peut s’agir de java, de dotnet, de python, etc. Exécutez le az webapp connection create postgres-flexible -h pour obtenir les types de clients pris en charge, puis choisissez celui qui correspond à votre application.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

Azure Database pour MySQL : un serveur flexible nécessite une identité managée affectée par l’utilisateur pour activer l’authentification Microsoft Entra. Pour plus d’informations, consultez Configurer l’authentification Microsoft Entra pour Azure Database pour MySQL : Serveur flexible. Vous pouvez utiliser la commande suivante pour créer une identité managée affectée par l’utilisateur :

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Important

Après avoir créé l’identité managée affectée par l'utilisateur, demandez à votre administrateur général ou à votre administrateur de rôle privilégié d’accorder les autorisations suivantes pour cette identité :

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Pour plus d’informations, consultez la section Autorisations d’Authentification Active Directory.

Ensuite, connectez votre application à une base de données MySQL avec une identité managée affectée par le système à l’aide de Service Connector.

La commande Azure CLI suivante utilise un paramètre --client-type. Exécutez az webapp connection create mysql-flexible -h pour obtenir les types de clients pris en charge, puis choisissez celui qui correspond à votre application.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

La commande Azure CLI suivante utilise un paramètre --client-type. Exécutez az webapp connection create sql -h pour obtenir les types de clients pris en charge, puis choisissez celui qui correspond à votre application.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Cette commande Service Connector effectue les tâches suivantes en arrière-plan :

  • Activez l’identité managée affectée par le système ou affectez une identité utilisateur pour l’application $APPSERVICE_NAME hébergée par Azure App Service/Azure Spring Apps/Azure Container Apps.
  • Activez l’authentification Microsoft Entra pour le serveur de base de données si elle n’a pas été activée auparavant.
  • Définissez l’administrateur Microsoft Entra sur l’utilisateur connecté actuel.
  • Ajoutez un utilisateur de base de données pour l’identité managée affectée par le système, l’identité managée affectée par l’utilisateur ou le principal de service. Accordez tous les privilèges de la base de données $DATABASE_NAME à cet utilisateur. Le nom d’utilisateur se trouve dans la chaîne de connexion dans la sortie de commande précédente.
  • Définissez les configurations nommées AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING ou AZURE_SQL_CONNECTIONSTRING sur la ressource Azure en fonction du type de base de données.
    • Pour App Service, les configurations sont définies dans le panneau Paramètres de l’application.
    • Pour Spring Apps, les configurations sont définies lors du lancement de l’application.
    • Pour Container Apps, les configurations sont définies sur les variables d’environnement. Vous pouvez obtenir toutes les configurations et leurs valeurs dans le panneau Service Connector du portail Azure.

Le connecteur de services affecte les privilèges suivants à l’utilisateur, vous pouvez les révoquer et ajuster les privilèges en fonction de vos besoins.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

Se connecter à une base de données avec l’authentification Microsoft Entra

Après avoir créé la connexion, vous pouvez utiliser la chaîne de connexion dans votre application pour vous connecter à la base de données avec l’authentification Microsoft Entra. Par exemple, vous pouvez utiliser les solutions suivantes pour vous connecter à la base de données avec l’authentification Microsoft Entra.

Pour .NET, il n’existe pas de plug-in ou de bibliothèque pour prendre en charge les connexions sans mot de passe. Vous pouvez obtenir un jeton d’accès pour l’identité managée ou le principal de service à l’aide d’une bibliothèque cliente telle que Azure.Identity. Vous pouvez ensuite utiliser le jeton d’accès comme mot de passe pour vous connecter à la base de données. Lorsque vous utilisez le code ci-dessous, supprimez les marques de commentaire de la partie de l’extrait de code pour le type d’authentification que vous souhaitez utiliser.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

Ensuite, si vous avez créé des tables et des séquences dans un serveur flexible PostgreSQL avant d’utiliser le connecteur de services, vous devez vous connecter en tant que propriétaire et accorder à <aad-username> l’autorisation créée par le connecteur de services. Le nom d’utilisateur de la chaîne de connexion ou de la configuration définie par le connecteur de service doit ressembler à aad_<connection name>. Si vous utilisez le Portail Azure, sélectionnez le bouton Développer à côté de la colonne Service Type et obtenez la valeur. Si vous utilisez Azure CLI, cochez configurations dans la sortie de la commande CLI.

Ensuite, exécutez la requête pour accorder l’autorisation

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

<owner-username> et <owner-password> est le propriétaire de la table existante qui peut accorder des autorisations à d’autres personnes. <aad-username> est l’utilisateur créé par Service Connector. Remplacez-les par la valeur réelle.

Validez le résultat avec la commande suivante :

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Pour .NET, il n’existe pas de plug-in ou de bibliothèque pour prendre en charge les connexions sans mot de passe. Vous pouvez obtenir un jeton d’accès pour l’identité managée ou le principal de service à l’aide d’une bibliothèque cliente telle que Azure.Identity. Vous pouvez ensuite utiliser le jeton d’accès comme mot de passe pour vous connecter à la base de données. Lorsque vous utilisez le code ci-dessous, supprimez les marques de commentaire de la partie de l’extrait de code pour le type d’authentification que vous souhaitez utiliser.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

Pour obtenir d’autres exemples de code, consultez la section Connexion à des bases de données Azure à partir d’App Service sans secrets à l’aide d’une identité managée.

  1. Installez des dépendances.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Obtenez la chaîne de connexion Azure SQL Database à partir de la variable d’environnement ajoutée par le connecteur de services.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Pour plus d’informations, consultez Utilisation de l’authentification d’identité managée Active Directory.

Pour plus d’informations, consultez Page d’accueil pour la programmation client sur Microsoft SQL Server.

Déployer l’application sur un service d’hébergement Azure

Enfin, déployez votre application sur un service d’hébergement Azure. Ce service source peut utiliser une identité managée pour se connecter à la base de données cible sur Azure.

Pour Azure App Service, vous pouvez vérifier le document pour choisir un moyen de déployer, consultez Démarrage rapide : Déployer une application web ASP.NET.

Vous pouvez ensuite consulter le journal ou appeler l’application pour déterminer si elle peut se connecter à la base de données Azure.

Résolution des problèmes

Autorisation

Si vous rencontrez des erreurs liées aux autorisations, confirmez l’utilisateur connecté Azure CLI avec la commande az account show. Assurez-vous de vous connecter avec le bon compte. Ensuite, vérifiez que vous disposez des autorisations suivantes qui peuvent être demandées pour créer une connexion sans mot de passe avec le connecteur de services.

Autorisation Opération
Microsoft.DBforPostgreSQL/flexibleServers/read Requise pour obtenir les informations du serveur de base de données
Microsoft.DBforPostgreSQL/flexibleServers/write Requis pour activer l’authentification Microsoft Entra pour le serveur de base de données
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Requise pour créer une règle de pare-feu en cas de blocage de l’adresse IP
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Requise pour rétablir la règle de pare-feu créée par Service Connector pour éviter un problème de sécurité
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Requis pour vérifier si l’utilisateur de connexion Azure CLI est un administrateur de serveur de base de données Microsoft Entra
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Requis pour ajouter l’utilisateur de connexion Azure CLI en tant qu’administrateur Microsoft Entra du serveur de base de données
Autorisation Opération
Microsoft.DBforMySQL/flexibleServers/read Requise pour obtenir les informations du serveur de base de données
Microsoft.DBforMySQL/flexibleServers/write Requise pour ajouter l’identité managée affectée par l’utilisateur fournie au serveur de base de données
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Requise pour créer une règle de pare-feu en cas de blocage de l’adresse IP
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Requise pour rétablir la règle de pare-feu créée par Service Connector pour éviter un problème de sécurité
Microsoft.DBforMySQL/flexibleServers/administrators/read Requis pour vérifier si l’utilisateur de connexion Azure CLI est un administrateur de serveur de base de données Microsoft Entra
Microsoft.DBforMySQL/flexibleServers/administrators/write Requis pour ajouter l’utilisateur de connexion Azure CLI en tant qu’administrateur Microsoft Entra du serveur de base de données
Autorisation Opération
Microsoft.Sql/servers/read Requise pour obtenir les informations du serveur de base de données
Microsoft.Sql/servers/firewallRules/write Requise pour créer une règle de pare-feu en cas de blocage de l’adresse IP
Microsoft.Sql/servers/firewallRules/delete Requise pour rétablir la règle de pare-feu créée par Service Connector pour éviter un problème de sécurité
Microsoft.Sql/servers/administrators/read Requis pour vérifier si l’utilisateur de connexion Azure CLI est un administrateur de serveur de base de données Microsoft Entra
Microsoft.Sql/servers/administrators/write Requis pour ajouter l’utilisateur de connexion Azure CLI en tant qu’administrateur Microsoft Entra du serveur de base de données

Dans certains cas, les autorisations ne sont pas requises. Par exemple, si l’utilisateur authentifié par Azure CLI est déjà administrateur Active Directory sur SQL Server, vous n’avez pas besoin de l’autorisation Microsoft.Sql/servers/administrators/write.

Microsoft Entra ID

Si vous obtenez une erreur ERROR: AADSTS530003: Your device is required to be managed to access this resource., demandez de l’aide à votre service informatique pour joindre cet appareil à Microsoft Entra ID. Pour plus d’informations, consultez Appareils joints à Microsoft Entra.

Le connecteur de services doit accéder à Microsoft Entra ID pour obtenir les informations de votre compte et l’identité managée du service d’hébergement. Vous pouvez utiliser la commande suivante pour vérifier si votre appareil peut accéder Microsoft Entra ID :

az ad signed-in-user show

Si vous ne vous connectez pas de manière interactive, vous pouvez également obtenir l’erreur et le message Interactive authentication is needed. Pour résoudre l’erreur, connectez-vous avec la commande az login.

Connectivité réseau

Si votre serveur de base de données est dans un réseau virtuel, assurez-vous que votre environnement qui exécute la commande Azure CLI peut accéder au serveur dans le réseau virtuel.

Si votre serveur de base de données est dans un réseau virtuel, assurez-vous que votre environnement qui exécute la commande Azure CLI peut accéder au serveur dans le réseau virtuel.

Si votre serveur de base de données interdit l’accès public, assurez-vous que votre environnement qui exécute la commande Azure CLI peut accéder au serveur par le biais du point de terminaison privé.

Étapes suivantes

Pour plus d’informations sur Service Connector et les connexions sans mot de passe, consultez les ressources suivantes :