Se connecter avec une identité managée à Azure Database pour PostgreSQL : serveur flexible
S’APPLIQUE À : Azure Database pour PostgreSQL : serveur flexible
Vous pouvez utiliser des identités managées affectées par le système et par l’utilisateur pour l’authentification auprès de Azure Database pour PostgreSQL : serveur flexible. Cet article explique comment utiliser une identité managée affectée par le système à une machine virtuelle Azure pour accéder à une instance de serveur flexible Azure Database pour PostgreSQL. Les identités gérées sont automatiquement gérées par Azure et vous permettent de vous authentifier auprès des services prenant en charge l'authentification Microsoft Entra sans avoir besoin d'insérer des informations d'identification dans votre code.
Vous allez apprendre à effectuer les actions suivantes :
- Accorder à votre machine virtuelle l’accès à une instance de serveur flexible Azure Database pour PostgreSQL.
- Créer un utilisateur dans la base de données représentant l’identité affectée par le système de la machine virtuelle.
- Obtenir un jeton d’accès en utilisant l’identité de la machine virtuelle et s’en servir pour interroger une instance de serveur flexible Azure Database pour PostgreSQL.
- Implémenter la récupération de jetons dans un exemple d’application C#.
Prérequis
- Si vous n’êtes pas familiarisé de la fonctionnalité identités managées pour ressources Azure, consultez cette Vue d’ensemble. Si vous n’avez pas encore de compte Azure, Inscrivez-vous sur un compte gratuit avant de continuer.
- Pour effectuer les opérations nécessaires de création de ressources et de gestion de rôles, votre compte doit disposer des autorisations « Propriétaire » au niveau de l’étendue appropriée (votre abonnement ou groupe de ressources). Si vous avez besoin d’aide concernant l’attribution d’un rôle, consultez Attribuer des rôles Azure pour gérer l’accès aux ressources de votre abonnement Azure.
- Vous avez besoin d’une machine virtuelle Azure (exécutant Ubuntu Linux, par exemple) que vous souhaitez utiliser pour accéder à votre base de données avec une identité managée
- Vous avez besoin d'une instance de serveur flexible Azure Database pour PostgreSQL sur lequel l'authentification Microsoft Entra est configurée
- Pour suivre cet exemple C#, vous devez d’abord consulter le guide pratique Se connecter avec C#
Créer une identité managée affectée par le système pour votre machine virtuelle
Utilisez az vm identity assign avec la commande identity assign
pour activer l’identité affectée par le système sur une machine virtuelle existante :
az vm identity assign -g myResourceGroup -n myVm
Récupérez l’ID d’application de l’identité managée affectée par le système. Vous en aurez besoin dans les étapes suivantes :
# Get the client ID (application ID) of the system-assigned managed identity
az ad sp list --display-name vm-name --query [*].appId --out tsv
Créer un serveur flexible Azure Database pour PostgreSQL pour votre identité managée
Maintenant, connectez-vous en tant qu'utilisateur administrateur Microsoft Entra à votre base de données de serveur flexible Azure Database pour PostgreSQL et exécutez les instructions SQL suivantes, en remplaçant <identity_name>
par le nom des ressources pour lesquelles vous avez créé votre identité managée attribuée par le système :
Veuillez noter que pgaadauth_create_principal doit être exécuté sur la base de données Postgres.
select * from pgaadauth_create_principal('<identity_name>', false, false);
Le succès ressemble à :
pgaadauth_create_principal
-----------------------------------
Created role for "<identity_name>"
(1 row)
Pour plus d'informations sur la gestion des rôles de base de données activés par Microsoft Entra ID, consultez comment gérer les rôles des serveurs flexible Azure Database pour PostgreSQL activés par Microsoft Entra ID
L'identité gérée a désormais accès lors de l'authentification avec le nom d'identité comme nom de rôle et le jeton Microsoft Entra comme mot de passe.
Remarque
Si l’identité managée n’est pas valide, une erreur est renvoyée : ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...]
.
Remarque
Si vous voyez une erreur ressemblant à « Aucune fonction ne correspond... », vérifiez que vous vous connectez à la base de données postgres
et pas à une autre base de données que vous avez également créée.
Récupérer le jeton d’accès à partir d’Azure Instance Metadata Service
Votre application peut désormais récupérer un jeton d’accès à partir d’Azure Instance Metadata Service et l’utiliser pour l’authentification auprès de la base de données.
Vous effectuez cette récupération de jeton en envoyant une requête HTTP à http://169.254.169.254/metadata/identity/oauth2/token
et en transmettant les paramètres suivants :
api-version
=2018-02-01
resource
=https://ossrdbms-aad.database.windows.net
client_id
=CLIENT_ID
(que vous avez récupérés précédemment)
Vous obtenez un résultat JSON contenant un champ access_token
. Cette longue valeur de texte est le jeton d’accès de l’identité managée que vous devez utiliser comme mot de passe lors de la connexion à la base de données.
À des fins de test, vous pouvez exécuter les commandes suivantes dans votre interpréteur de commandes.
Notes
Notez que curl
, jq
et le client psql
doivent être installés.
# Retrieve the access token
export PGPASSWORD=`curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token`
# Connect to the database
psql -h SERVER --user USER DBNAME
Vous êtes maintenant connecté à la base de données que vous avez configurée précédemment.
Se connecter avec une identité managée
Cette section montre comment obtenir un jeton d’accès à l’aide de l’identité managée affectée par l’utilisateur de la machine virtuelle et comment l’utiliser pour appeler le serveur flexible Azure Database pour PostgreSQL. Le serveur flexible Azure Database pour PostgreSQL prend en charge de manière native l’authentification Microsoft Entra, de sorte qu’il peut accepter directement les jetons d’accès obtenus à l’aide d’identités managées pour les ressources Azure. Lors de la création d’une connexion au serveur flexible Azure Database pour PostgreSQL, vous transmettez le jeton d’accès dans le champ du mot de passe.
Se connecter avec une identité managée en Python
Pour obtenir un exemple de code Python, consultez le Guide de démarrage rapide : Utiliser Python pour se connecter et interroger des données dans un serveur flexible Azure Database pour PostgreSQL
Se connecter avec une identité managée en Java
Pour obtenir un exemple de code Java, consultez le Guide de démarrage rapide : Utiliser Java et JDBC avec un serveur flexible Azure Database pour PostgreSQL
Se connecter avec une identité managée dans C#
Voici un exemple de code .NET pour l’ouverture d’une connexion au serveur flexible Azure Database pour PostgreSQL à l’aide d’un jeton d’accès. Ce code doit s'exécuter sur la machine virtuelle pour utiliser l'identité managée attribuée par le système afin d'obtenir un jeton d'accès de Microsoft Entra ID. Remplacez les valeurs de HOST, USER (avec <identity_name>
) et DATABASE.
using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Npgsql;
using Azure.Identity;
namespace Driver
{
class Script
{
// Obtain connection string information from the portal for use in the following variables
private static string Host = "HOST";
private static string User = "USER";
private static string Database = "DATABASE";
static async Task Main(string[] args)
{
//
// Get an access token for PostgreSQL.
//
Console.Out.WriteLine("Getting access token from Azure AD...");
// Azure AD resource ID for Azure Database for PostgreSQL Flexible Server is https://ossrdbms-aad.database.windows.net/
string accessToken = null;
try
{
// Call managed identities for Azure resources endpoint.
var sqlServerTokenProvider = new DefaultAzureCredential();
accessToken = (await sqlServerTokenProvider.GetTokenAsync(
new Azure.Core.TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }) { })).Token;
}
catch (Exception e)
{
Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
System.Environment.Exit(1);
}
//
// Open a connection to the PostgreSQL server using the access token.
//
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4}; SSLMode=Prefer",
Host,
User,
Database,
5432,
accessToken);
using (var conn = new NpgsqlConnection(connString))
{
Console.Out.WriteLine("Opening connection using access token...");
conn.Open();
using (var command = new NpgsqlCommand("SELECT version()", conn))
{
var reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("\nConnected!\n\nPostgres version: {0}", reader.GetString(0));
}
}
}
}
}
}
Quand elle est exécutée, cette commande retourne une sortie semblable à celle-ci :
Getting access token from Azure AD...
Opening connection using access token...
Connected!
Postgres version: PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit
Étapes suivantes
- Passez en revue les concepts généraux de l'authentification Microsoft Entra avec Azure Database pour PostgreSQL – Serveur flexible