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

DOTYCZY: Azure Database for PostgreSQL — pojedynczy serwer

Ważne

Usługa Azure Database for PostgreSQL — pojedynczy serwer znajduje się na ścieżce wycofania. Zdecydowanie zalecamy uaktualnienie do usługi Azure Database for PostgreSQL — serwer elastyczny. Aby uzyskać więcej informacji na temat migracji do usługi Azure Database for PostgreSQL — serwer elastyczny, zobacz Co się dzieje z usługą Azure Database for PostgreSQL — pojedynczy serwer?.

Do uwierzytelniania w usłudze Azure Database for PostgreSQL można używać tożsamości zarządzanych przypisanych przez system i przypisanych przez użytkownika. W tym artykule pokazano, jak używać przypisanej przez system tożsamości zarządzanej dla maszyny wirtualnej platformy Azure w celu uzyskania dostępu do serwera usługi Azure Database for PostgreSQL. Tożsamości zarządzane są automatycznie zarządzane przez platformę Azure. Umożliwiają uwierzytelnianie w usługach obsługujących uwierzytelnianie usługi Microsoft Entra bez potrzeby umieszczania poświadczeń w kodzie.

Dowiedz się, jak odbywa się:

  • Udzielanie maszynie wirtualnej dostępu do serwera usługi Azure Database for PostgreSQL
  • Tworzenie użytkownika w bazie danych reprezentującego tożsamość przypisaną przez system maszyny wirtualnej
  • Uzyskiwanie tokenu dostępu przy użyciu tożsamości maszyny wirtualnej i używanie go do wykonywania zapytań dotyczących serwera usługi Azure Database for PostgreSQL
  • Implementowanie pobierania tokenu w przykładowej aplikacji w języku C#

Wymagania wstępne

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

Użyj polecenia az vm identity assign z identity assign poleceniem włącz tożsamość przypisaną 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 będzie 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

Tworzenie użytkownika postgreSQL dla tożsamości zarządzanej

Teraz połącz się jako użytkownik administratora firmy Microsoft Entra z bazą danych PostgreSQL i uruchom następujące instrukcje SQL, zastępując CLIENT_ID element identyfikatorem klienta pobranym dla przypisanej przez system tożsamości zarządzanej:

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

Tożsamość zarządzana ma teraz dostęp podczas uwierzytelniania przy użyciu nazwy użytkownika myuser (zastąp wybraną nazwą).

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

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 utworzenie żądania HTTP do http://169.254.169.254/metadata/identity/oauth2/token i przekazanie 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 to token 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 powłoce. Należy pamiętać, że konieczne curljest zainstalowanie programu , jqi psql klienta.

# 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

Masz teraz połączenie ze skonfigurowaną wcześniej bazą danych.

Połączenie przy użyciu tożsamości zarządzanej w języku C#

W tej sekcji pokazano, jak uzyskać token dostępu przy użyciu przypisanej przez użytkownika tożsamości zarządzanej maszyny wirtualnej i użyć go do wywołania 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 bazą danych PostgreSQL przekazujesz token dostępu w polu hasła.

Oto przykład kodu platformy .NET otwierający połączenie z bazą danych 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, DATABASE i 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));
                    }
                }
            }
        }
    }
}

Po uruchomieniu to polecenie da 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

Następne kroki