Partager via


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