Freigeben über


Herstellen einer Verbindung mit Azure Database for PostgreSQL – Flexibler Server unter Verwendung einer verwalteten Identität

GILT FÜR: Azure Database for PostgreSQL – Flexible Server

Sie können sowohl systemseitig als auch benutzerseitig zugewiesene verwaltete Identitäten zur Authentifizierung bei Azure Database for PostgreSQL – Flexibler Server verwenden. In diesem Artikel erfahren Sie, wie Sie mit einer systemseitig zugewiesenen verwalteten Identität für einen virtuellen Azure-Computer (Virtual Machine, VM) auf eine Instanz von Azure Database for PostgreSQL – Flexibler Server zugreifen. Verwaltete Identitäten werden von Azure automatisch verwaltet und ermöglichen Ihnen die Authentifizierung bei Diensten, die die Microsoft Entra-Authentifizierung unterstützen, ohne dass Sie Anmeldeinformationen in Ihren Code einfügen müssen.

Folgendes wird vermittelt:

  • Erteilen Sie der VM Zugriff auf eine Instanz von Azure Database for PostgreSQL – Flexibler Server.
  • Erstellen Sie einen Benutzer oder eine Benutzerin in der Datenbank, die bzw. der die systemseitig zugewiesene Identität der VM darstellt.
  • Rufen Sie einen Zugriffstoken mithilfe der VM-Identität ab, und fragen Sie eine Instanz von Azure Database for PostgreSQL – Flexibler Server mit diesem Token ab.
  • Implementieren Sie den Tokenabruf in einer C#-Beispielanwendung.

Voraussetzungen

  • Wenn Sie mit der Funktion für verwaltete Identitäten für Azure-Ressourcen nicht vertraut sind, finden Sie hier eine Übersicht. Wenn Sie kein Azure-Konto haben, sollten Sie sich für ein kostenloses Konto registrieren, bevor Sie fortfahren.
  • Ihr Konto muss für den entsprechenden Gültigkeitsbereich (Ihr Abonnement oder die Ressourcengruppe) über die Berechtigung „Besitzer“ verfügen, um die erforderliche Ressourcenerstellung und eine Rollenverwaltung durchführen zu können. Wenn Sie Unterstützung bei einer Rollenzuweisung benötigen, finden Sie weitere Informationen unter Zuweisen von Azure-Rollen zum Verwalten des Zugriffs auf Ihre Azure-Abonnementressourcen.
  • Sie benötigen eine Azure-VM (z. B. unter Ubuntu Linux), mit der Sie mithilfe einer verwalteten Identität auf Ihre Datenbank zugreifen möchten.
  • Sie benötigen eine Instanz von Azure Database for PostgreSQL – Flexibler Server, auf der die Microsoft Entra-Authentifizierung konfiguriert ist.
  • Um dem C#-Beispiel zu folgen, sollten Sie zuerst den Leitfaden zur Verbindungsherstellung mit C# lesen.

Erstellen einer systemseitig zugewiesenen verwalteten Identität für Ihre VM

Verwenden Sie az vmss identity assign mit dem Befehl identity assign, um die systemseitig zugewiesene Identität auf einer vorhandenen VM zu aktivieren:

az vm identity assign -g myResourceGroup -n myVm

Rufen Sie die Anwendungs-ID für die systemseitig zugewiesene verwaltete Identität ab, die Sie für die nächsten Schritten benötigen:

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

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

Erstellen eines Benutzers oder einer Benutzerin in Azure Database for PostgreSQL – Flexible Server für eine verwaltete Identität

Stellen Sie nun als Microsoft Entra-Administratorbenutzer bzw. -benutzerin eine Verbindung mit Ihrer Datenbank in Azure Database for PostgreSQL – Flexibler Server her, und führen Sie die folgenden SQL-Anweisungen aus, wobei Sie <identity_name> durch den Namen der Ressourcen ersetzen, für die Sie eine systemseitig zugewiesene verwaltete Identität erstellt haben:

Bitte beachten Sie, dass pgaadauth_create_principal auf der Postgres-Datenbank ausgeführt werden müssen.

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

Bei erfolgreicher Ausführung sieht der Bildschirm etwa wie folgt aus:

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

Weitere Informationen zum Verwalten von Microsoft Entra ID-fähigen Datenbankrollen finden Sie unter Verwalten von Microsoft Entra ID-fähigen Rollen in Azure Database for PostgreSQL – Flexibler Server.

Die verwaltete Identität hat jetzt Zugriff, wenn sie sich mit dem Identitätsnamen als Rollennamen und dem Microsoft Entra-Token als Kennwort authentifiziert.

Hinweis

Wenn die verwaltete Identität ungültig ist, wird ein Fehler zurückgegeben: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Hinweis

Wenn ein Fehler wie „Keine Funktion stimmt überein …“ angezeigt wird, stellen Sie sicher, dass Sie sich mit der postgres-Datenbank verbinden und nicht mit einer anderen Datenbank, die Sie ebenfalls erstellt haben.

Abrufen des Zugriffstokens aus dem Dienst Azure Instance Metadata

Ihre Anwendung kann nun ein Zugriffstoken aus dem Dienst „Azure Instance Metadata“ abrufen und sich damit bei der Datenbank authentifizieren.

Dieses Token wird abgerufen, indem eine HTTP-Anforderung an http://169.254.169.254/metadata/identity/oauth2/token gesendet wird und die folgenden Parameter übergeben werden:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (die Sie zuvor abgerufen haben)

Es wird ein JSON-Ergebnis zurückgegeben, in dem das Feld access_token enthalten ist. Dieser lange Textwert ist das Zugriffstoken der verwalteten Identität, das Sie bei der Verbindungsherstellung mit der Datenbank als Kennwort verwenden müssen.

Zu Testzwecken können Sie die folgenden Befehle in Ihrer Shell ausführen.

Hinweis

Beachten Sie, dass der curl-, jq- und der psql-Client installiert sein müssen.

# 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

Sie haben nun eine Verbindung mit der Datenbank hergestellt, die Sie zuvor konfiguriert haben.

Herstellen einer Verbindung mithilfe einer verwalteten Identität

In diesem Abschnitt wird gezeigt, wie Sie mithilfe der benutzerseitig zugewiesenen verwalteten Identität der VM ein Zugriffstoken abrufen und damit Azure Database for PostgreSQL – Flexibler Server aufrufen. Azure Database for PostgreSQL – Flexibler Server unterstützt die Microsoft Entra-Authentifizierung nativ, wodurch Zugriffstoken direkt angenommen werden können, die mit verwalteten Identitäten für Azure-Ressourcen abgerufen wurden. Beim Erstellen einer Verbindung mit Azure Database for PostgreSQL – Flexibler Server übergeben Sie das Zugriffstoken im Kennwortfeld.

Herstellen einer Verbindung mithilfe einer verwalteten Identität in Python

Ein Python-Codebeispiel finden Sie unter Schnellstart: Verwenden von Python zum Herstellen einer Verbindung mit Azure Database for PostgreSQL – Flexibler Server sowie zum Abfragen von Daten.

Herstellen einer Verbindung mithilfe einer verwalteten Identität in Java

Ein Java-Codebeispiel finden Sie unter Schnellstart: Verwenden von Java und JDBC mit Azure Database for PostgreSQL – Flexibler Server.

Herstellen einer Verbindung mithilfe einer verwalteten Identität in C#

Hier ist ein .NET-Codebeispiel für das Öffnen einer Verbindung mit Azure Database for PostgreSQL – Flexibler Server mit einem Zugriffstoken. Dieser Code muss auf der VM ausgeführt werden, um die systemseitig zugewiesene verwaltete Identität zum Abrufen eines Zugriffstokens von Microsoft Entra ID zu verwenden. Ersetzen Sie die Werte von HOST, USER (durch <identity_name>) und 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));
                    }
                }
            }
        }
    }
}

Wenn Sie diesen Befehl ausführen, erhalten Sie in etwa die folgende Ausgabe:

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 

Nächste Schritte