Udostępnij za pomocą


Nawiązywanie połączenia za pomocą tożsamości zarządzanej z usługą Azure Database for PostgreSQL

Do uwierzytelniania w wystąpieniu elastycznego serwera usług Azure Database for PostgreSQL można używać zarówno tożsamości zarządzanych przypisywanych przez system, jak i przypisywanych przez użytkownika. W tym artykule pokazano, jak używać przypisanej przez system zarządzanej tożsamości dla maszyny wirtualnej platformy Azure w celu uzyskania dostępu do elastycznej instancji serwera bazodanowego Azure Database for PostgreSQL. Tożsamości zarządzane (Managed Identities) są automatycznie obsługiwane przez platformę Azure i umożliwiają uwierzytelnianie się w usługach obsługujących Microsoft Entra, bez konieczności wstawiania poświadczeń w kod.

Uczysz się, jak:

  • Udziel maszynie wirtualnej dostępu do elastycznego serwera w usłudze Azure Database for PostgreSQL.
  • Utwórz użytkownika w bazie danych, który reprezentuje tożsamość przypisaną przez system maszyny wirtualnej.
  • Uzyskaj token dostępu z użyciem tożsamości maszyny wirtualnej i użyj go, aby wykonać zapytanie do wystąpienia elastycznego serwera bazy danych Azure Database for PostgreSQL.
  • Zaimplementuj pobieranie tokenu w przykładowej aplikacji w języku C#.

Wymagania wstępne

  • Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zapoznaj się z tym omówieniem. Jeśli nie masz konta platformy Azure, utwórz bezpłatne konto przed kontynuowaniem.
  • Aby wykonać wymagane tworzenie zasobów i zarządzanie rolami, twoje konto musi mieć uprawnienia "Właściciel" w odpowiednim zakresie (subskrypcja lub grupa zasobów). Jeśli potrzebujesz pomocy dotyczącej przypisania roli, zobacz Przypisywanie ról platformy Azure do zarządzania dostępem do zasobów subskrypcji platformy Azure.
  • Potrzebna jest maszyna wirtualna platformy Azure (na przykład z systemem Ubuntu Linux), której chcesz użyć do uzyskiwania dostępu do bazy danych przy użyciu tożsamości zarządzanej
  • Potrzebujesz elastycznego wystąpienia serwera usługi Azure Database for PostgreSQL, które ma skonfigurowane uwierzytelnianie firmy Microsoft Entra
  • Aby postępować zgodnie z przykładem języka C#, najpierw ukończ przewodnik dotyczący nawiązywania połączenia z językiem C#

Tworzenie tożsamości zarządzanej przypisanej przez system dla maszyny wirtualnej

Użyj polecenia az vm identity assign razem z poleceniem identity assign, aby przypisać tożsamość nadaną przez system do istniejącej maszyny wirtualnej.

az vm identity assign -g myResourceGroup -n myVm

Pobierz identyfikator aplikacji dla tożsamości zarządzanej przypisanej przez system, która jest potrzebna w kilku następnych krokach:

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

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

Utwórz użytkownika Azure Database for PostgreSQL dla Twojej tożsamości zarządzanej

Teraz, jako użytkownik administratora usługi Microsoft Entra, połącz się z bazą danych elastycznego serwera Azure Database for PostgreSQL i uruchom następujące instrukcje SQL, zastępując <identity_name> nazwą zasobów, dla których utworzono tożsamość zarządzaną przypisaną przez system.

Uwaga pgaadauth_create_principal należy uruchomić w bazie danych Postgres.

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

Powodzenie wygląda następująco:

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

Aby uzyskać więcej informacji na temat zarządzania rolami bazy danych z włączoną obsługą identyfikatora Entra firmy Microsoft, zobacz Zarządzanie rolami firmy Microsoft w usłudze Azure Database for PostgreSQL.

Tożsamość zarządzana ma teraz dostęp po uwierzytelnieniu przy użyciu nazwy tożsamości jako nazwy roli oraz tokenu Microsoft Entra jako hasła.

Uwaga / Notatka

Jeśli tożsamość zarządzana jest nieprawidłowa, zwracany jest błąd: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Jeśli zostanie wyświetlony błąd taki jak "Żadna funkcja nie pasuje...", upewnij się, że łączysz się z postgres bazą danych, a nie z inną utworzoną bazą danych.

Pobieranie tokenu dostępu z usługi Azure Instance Metadata

Aplikacja może teraz pobrać token dostępu z usługi Azure Instance Metadata i używać go do uwierzytelniania w bazie danych.

To pobieranie tokenu odbywa się przez wysyłanie HTTP żądania do http://169.254.169.254/metadata/identity/oauth2/token i przekazywanie następujących parametrów:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (które pobrano wcześniej)

Otrzymasz wynik JSON zawierający access_token pole — ta długa wartość tekstowa jest tokenem dostępu tożsamości zarządzanej, którego należy użyć jako hasła podczas nawiązywania połączenia z bazą danych.

Na potrzeby testowania możesz uruchomić następujące polecenia w wierszu poleceń.

Uwaga / Notatka

Należy pamiętać, że konieczne jest zainstalowanie curl, jq oraz klienta psql.

# 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

Teraz masz połączenie ze skonfigurowaną wcześniej bazą danych.

Nawiązywanie połączenia przy użyciu tożsamości zarządzanej

W tej sekcji przedstawiono sposób uzyskiwania tokenu dostępu przy użyciu przypisanej przez użytkownika tożsamości zarządzanej maszyny wirtualnej i używania go do wywoływania wystąpienia serwera elastycznego usługi Azure Database for PostgreSQL. Usługa Azure Database for PostgreSQL natywnie obsługuje uwierzytelnianie firmy Microsoft Entra, dzięki czemu może bezpośrednio akceptować tokeny dostępu uzyskane przy użyciu tożsamości zarządzanych dla zasobów platformy Azure. Podczas tworzenia połączenia z usługą Azure Database for PostgreSQL przekazujesz token dostępu w polu hasła.

Nawiązywanie połączenia przy użyciu tożsamości zarządzanej w języku Python

Aby zapoznać się z przykładem kodu w języku Python, zapoznaj się z przewodnikiem Szybki start: nawiązywanie połączeń z danymi i wykonywanie zapytań względem nich w usłudze Azure Database for PostgreSQL przy użyciu języka Python

Nawiązywanie połączenia przy użyciu tożsamości zarządzanej w języku Java

Aby zapoznać się z przykładem kodu Java, zapoznaj się z przewodnikiem Szybki start: używanie języka Java i JDBC z usługą Azure Database for PostgreSQL

Nawiązywanie połączenia przy użyciu tożsamości zarządzanej w języku C#

Oto przykładowy kod platformy .NET do otwarcia połączenia z elastyczną instancją serwera usługi Azure Database for PostgreSQL przy użyciu tokenu dostępu. Ten kod musi zostać uruchomiony na maszynie wirtualnej, aby użyć przypisanej przez system tożsamości zarządzanej w celu uzyskania tokenu dostępu z identyfikatora Entra firmy Microsoft. Zastąp wartości HOST, USER (z <identity_name>), i 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}");
        }
    }
}

Należy wypełnić następujące pola zastępcze:

  • HOST: zastąp your-server-name.postgres.database.azure.com nazwą hosta wystąpienia.
  • UŻYTKOWNIK: zastąp <identity_name> nazwą tożsamości zarządzanej.
  • DATABASE: Zastąp your-database-name nazwą wystąpienia bazy danych Azure Database for PostgreSQL.
  • Microsoft Entra Authentication: kod używa przypisanej przez system tożsamości zarządzanej maszyny wirtualnej do pobierania tokenu dostępu z identyfikatora Entra firmy Microsoft.

Po uruchomieniu to polecenie daje dane wyjściowe w następujący sposób:

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