Share via


Conexión con identidad administrada a Azure Database for PostgreSQL

Se aplica a: Azure Database for PostgreSQL: servidor único

Importante

El servicio de servidor único de Azure Database for PostgreSQL está en proceso de retirada. Es muy recomendable actualizar al servidor flexible de Azure Database for PostgreSQL: servidor flexible. Para más información sobre la migración al servidor flexible de Azure Database for PostgreSQL, consulte ¿Qué sucederá con el servicio de servidor único de Azure Database for PostgreSQL?

Puede usar identidades administradas asignadas por el sistema y asignadas por el usuario para autenticarse en Azure Database for PostgreSQL. En este artículo se muestra cómo usar una identidad administrada asignada por el sistema para permitir el acceso de una máquina virtual (VM) de Azure a un servidor 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:

  • Conceder a la VM acceso a un servidor de Azure Database for PostgreSQL.
  • Crear un usuario en la base de datos que represente la identidad asignada por el sistema de la máquina virtual.
  • Obtener un token de acceso mediante la identidad de la VM y usarlo para consultar un servidor de Azure Database for PostgreSQL.
  • Implementar la recuperación del token 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 comando identity assign para habilitar la identidad asignada por el sistema en una VM existente:

az vm identity assign -g myResourceGroup -n myVm

Recupere el identificador de aplicación de la identidad administrada asignada por el sistema (lo necesitará 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

Creación de un usuario de PostgreSQL para la identidad administrada

Ahora, conéctese como usuario administrador de Microsoft Entra a la base de datos PostgreSQL y ejecute las siguientes instrucciones SQL, pero reemplace CLIENT_ID por el identificador de cliente que recuperó para la identidad administrada asignada por el sistema:

SET aad_validate_oids_in_tenant = off;
CREATE ROLE myuser WITH LOGIN PASSWORD 'CLIENT_ID' IN ROLE azure_ad_user;

La identidad administrada ahora tiene acceso al autenticarse con el nombre de usuario myuser (reemplácelo por un nombre de su elección).

Recuperación del token de acceso desde Azure Instance Metadata Service

La aplicación ahora puede recuperar un token de acceso desde Azure Instance Metadata Service y usarlo para autenticarse en la base de datos.

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

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

Recibirá un resultado JSON que contiene un campo access_token: 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. Tenga en cuenta que necesita curl, jq y el cliente de psql 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@SERVER DBNAME

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

Conexión mediante identidad administrada en C#

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

Este es un ejemplo de código .NET para abrir una conexión a PostgreSQL con 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, DATABASE y CLIENT_ID.

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

Cuando se ejecute, este comando proporcionará 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

Pasos siguientes