Compartir vía


Conectar mediante identidad administrada a la base de datos Azure para PostgreSQL

Puede usar identidades administradas asignadas por el sistema y asignadas por el usuario para autenticarse en una instancia de servidor flexible de Azure Database for PostgreSQL. En este artículo se muestra cómo usar una identidad administrada asignada por el sistema para una máquina virtual (VM) de Azure para acceder a una instancia de servidor flexible de Azure Database for PostgreSQL. Azure administra automáticamente las identidades administradas y le permite autenticarse en los servicios que admiten la autenticación de Microsoft Entra sin necesidad de insertar credenciales en el código.

Aprenderá a:

  • Conceda a la máquina virtual acceso a una instancia de servidor flexible de Azure Database for PostgreSQL.
  • Cree un usuario en la base de datos que represente la identidad asignada por el sistema de la máquina virtual.
  • Obtenga un token de acceso mediante la identidad de máquina virtual y úselo para consultar una instancia de servidor flexible de Azure Database for PostgreSQL.
  • Implemente la recuperación de tokens en una aplicación de ejemplo de C#.

Prerrequisitos

Creación de una identidad administrada asignada por el sistema para la máquina virtual

Use az vm identity assign con el identity assign comando habilita la identidad asignada por el sistema a una máquina virtual existente:

az vm identity assign -g myResourceGroup -n myVm

Recupere el identificador de aplicación de la identidad administrada asignada por el sistema, que necesita en los pasos siguientes:

# Get the client ID (application ID) of the system-assigned managed identity

az ad sp list --display-name vm-name --query [*].appId --out tsv

Cree un usuario de Azure Database for PostgreSQL para su Identidad Administrada.

Ahora, conéctese como usuario administrador de Microsoft Entra a la base de datos de servidor flexible de Azure Database for PostgreSQL y ejecute las siguientes instrucciones SQL, reemplazando por <identity_name> el nombre de los recursos para los que creó una identidad administrada asignada por el sistema:

Tenga en cuenta pgaadauth_create_principal debe ejecutarse en la base de datos de Postgres.

select * from pgaadauth_create_principal('<identity_name>', false, false);

El éxito tiene el siguiente aspecto:

    pgaadauth_create_principal
-----------------------------------
 Created role for "<identity_name>"
(1 row)

Para obtener más información sobre cómo administrar roles de base de datos habilitados para el identificador de Entra de Microsoft, consulte Administración de roles de Microsoft Entra en Azure Database for PostgreSQL.

La identidad administrada ahora tiene acceso al autenticarse con el nombre de identidad como un nombre de rol y el token de Microsoft Entra como una contraseña.

Nota:

Si la identidad administrada no es válida, se devuelve un error: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Si ve un error como "No hay coincidencias de función...", asegúrese de que se está conectando a la postgres base de datos, no a una base de datos diferente que también ha creado.

Recuperación del token de acceso del servicio de metadatos de Azure Instance

La aplicación ahora puede recuperar un token de acceso del servicio de metadatos de Azure Instance y usarlo para autenticarse con la base de datos.

Esta recuperación de tokens se realiza realizando una HTTP solicitud a http://169.254.169.254/metadata/identity/oauth2/token y pasando los parámetros siguientes:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (que recuperó anteriormente)

Devuelve un resultado JSON que contiene un access_token campo: este valor de texto largo es el token de acceso de identidad administrada que debe usar como contraseña al conectarse a la base de datos.

Con fines de prueba, puede ejecutar los siguientes comandos en el shell.

Nota:

Tenga en cuenta que necesita curl, jqy el psql cliente instalado.

# 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

Ahora está conectado a la base de datos que configuró anteriormente.

Conexión mediante identidad administrada

En esta sección se muestra cómo obtener un token de acceso mediante la identidad administrada asignada por el usuario de la máquina virtual y usarlo para llamar a una instancia de servidor flexible de Azure Database for PostgreSQL. Azure Database for PostgreSQL admite de forma nativa la autenticación de Microsoft Entra, por lo que puede aceptar directamente tokens de acceso obtenidos mediante identidades administradas para recursos de Azure. Al crear una conexión a Azure Database for PostgreSQL, se pasa el token de acceso en el campo contraseña.

Conexión mediante identidad administrada en Python

Para obtener un ejemplo de código de Python, consulte el inicio rápido: Uso de Python para conectarse y consultar datos en Azure Database for PostgreSQL.

Conexión mediante identidad administrada en Java

Para obtener un ejemplo de código de Java, consulte inicio rápido: Uso de Java y JDBC con Azure Database for PostgreSQL.

Conexión mediante identidad administrada en C#

Este es un ejemplo de código de .NET para abrir una conexión a una instancia de servidor flexible de Azure Database for PostgreSQL mediante un token de acceso. Este código debe ejecutarse en la máquina virtual para usar la identidad administrada asignada por el sistema para obtener un token de acceso de Microsoft Entra ID. Reemplace los valores de HOST, USER (por <identity_name>) y DATABASE.

using Azure.Identity;
using Npgsql;
using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Obtain an access token using the system-assigned managed identity
            var tokenCredential = new DefaultAzureCredential();
            var accessToken = tokenCredential.GetToken(
                new Azure.Core.TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })
            );

            // Build the connection string
            string host = "your-server-name.postgres.database.azure.com"; // Replace with your flexible server's host
            string database = "your-database-name";                      // Replace with your database name
            string user = "<identity_name>";                             // Replace with your identity name (e.g., "myManagedIdentity")

            var connectionString = $"Host={host};Database={database};Username={user};Password={accessToken.Token};SSL Mode=Require;Trust Server Certificate=true";

            // Open a connection to the database
            using var connection = new NpgsqlConnection(connectionString);
            connection.Open();

            Console.WriteLine("Connection successful!");

            // Optional: Perform a simple query
            using var command = new NpgsqlCommand("SELECT version();", connection);
            using var reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine($"PostgreSQL version: {reader.GetString(0)}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

Debe rellenar los siguientes marcadores de posición:

  • HOST: reemplace your-server-name.postgres.database.azure.com por el nombre de host de la instancia.
  • USUARIO: reemplace <identity_name> por el nombre de la identidad administrada.
  • DATABASE: reemplace your-database-name por el nombre de la instancia de Azure Database for PostgreSQL.
  • Autenticación de Microsoft Entra: el código usa la identidad administrada asignada por el sistema de la máquina virtual para capturar un token de acceso de Microsoft Entra ID.

Cuando se ejecuta, este comando proporciona una salida similar a la siguiente:

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