Conectar con identidad administrada al Servidor flexible de Azure Database for PostgreSQL
SE APLICA A: Azure Database for PostgreSQL con servidor flexible
Puede utilizar tanto identidades administradas asignadas por el sistema como asignadas por el usuario para autenticarse en el Servidor flexible Azure Database for PostgreSQL. En este artículo se muestra cómo utilizar 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 su máquina virtual acceso a una instancia de Servidor flexible Azure Database for PostgreSQL.
- Cree un usuario en la base de datos que represente la identidad asignada por el sistema a la máquina virtual.
- Obtenga un token de acceso utilizando la identidad de la máquina virtual y utilícelo para consultar una instancia de Servidor flexible de Azure Database for PostgreSQL.
- Implemente la recuperación de tokens en una aplicación de ejemplo en C#.
Requisitos previos
- Si no está familiarizado con la característica Managed Identities for Azure Resources, consulte esta introducción. Si no tiene una cuenta de Azure, regístrese para obtener una cuenta gratuita antes de continuar.
- Para realizar la creación de recursos necesarios y la administración de roles, la cuenta debe tener permisos de "Propietario" en el ámbito adecuado (su suscripción o grupo de recursos). Si necesita ayuda con la asignación de roles, consulte Asignación de roles de Azure para administrar el acceso a los recursos de una suscripción de Azure.
- Necesita una máquina virtual de Azure (que ejecute Ubuntu Linux, por ejemplo) que le gustaría usar para acceder a la base de datos mediante una identidad administrada.
- Necesita una instancia de servidor flexible Azure Database for PostgreSQL que tenga configurada la autenticación Microsoft Entra
- Para seguir el ejemplo de C#, complete primero la guía sobre la conexión con C#.
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 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 (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
Cree un usuario de servidor flexible Azure Database for PostgreSQL para su identidad administrada
Ahora, conéctese como usuario administrador de Microsoft Entra a su base de datos de servidor flexible Azure Database for PostgreSQL y ejecute las siguientes sentencias SQL, reemplazando <identity_name>
por el nombre de los recursos para los que creó una identidad administrada asignada por el sistema:
Tenga en cuenta que pgaadauth_create_principal debe ejecutarse en la base de datos de Postgres.
select * from pgaadauth_create_principal('<identity_name>', false, false);
El éxito se parece a:
pgaadauth_create_principal
-----------------------------------
Created role for "<identity_name>"
(1 row)
Para obtener más información sobre la administración de funciones de base de datos habilitadas para Microsoft Entra ID, consulte cómo administrar funciones del Servidor flexible de Azure Database for PostgreSQL habilitadas para Microsoft Entra ID
La identidad administrada ahora tiene acceso cuando se autentica con el nombre de identidad como nombre de rol y un token de Microsoft Entra como contraseña.
Nota:
Si la identidad administrada no es válida, se produce un error: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...]
.
Nota:
Si ve un error como "No hay coincidencias de función...", asegúrese de que se está conectando a la base de datos de postgres
, no a una base de datos diferente que también haya creado.
Recuperación del token de acceso del servicio de metadatos de instancias de Azure
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.
Nota
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 DBNAME
Ahora está conectado a la base de datos que configuró anteriormente.
Conexión mediante una identidad administrada
Esta sección muestra cómo obtener un token de acceso utilizando la identidad administrada asignada al usuario de la máquina virtual y utilizarlo para llamar al servidor flexible Azure Database for PostgreSQL. El servidor flexible Azure Database for PostgreSQL admite de forma nativa la autenticación Microsoft Entra, por lo que puede aceptar directamente tokens de acceso obtenidos mediante identidades administradas para recursos Azure. Al crear una conexión al servidor flexible Azure Database for PostgreSQL, se pasa el token de acceso en el campo de contraseña.
Conexión mediante una 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 (servidor flexible)
Conexión mediante una identidad administrada en Java
Para obtener un ejemplo de código Java, consulte el inicio rápido: Uso de Java y JDBC con Azure Database for PostgreSQL (servidor flexible)
Conexión mediante una identidad administrada en C#
A continuación se muestra un ejemplo de código .NET de apertura de una conexión al Servidor flexible Azure Database for PostgreSQL utilizando 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. Sustituya los valores de HOST, USER (por <identity_name>
) y 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));
}
}
}
}
}
}
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
- Revise los conceptos generales de Autenticación de Microsoft Entra con Azure Database for PostgreSQL: servidor flexible.