Połączenie z tożsamością zarządzaną do usługi Azure Database for PostgreSQL — serwer elastyczny

DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny

Do uwierzytelniania na serwerze elastycznym usługi Azure Database for PostgreSQL można użyć 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 elastycznego wystąpienia serwera usługi Azure Database for PostgreSQL. Tożsamości zarządzane są automatycznie zarządzane przez platformę Azure i umożliwiają uwierzytelnianie w usługach obsługujących uwierzytelnianie firmy Microsoft Entra bez konieczności wstawiania poświadczeń do kodu.

Dowiedz się, jak odbywa się:

  • Udziel maszynie wirtualnej dostępu do wystąpienia elastycznego serwera usługi Azure Database for PostgreSQL.
  • Utwórz użytkownika w bazie danych, który reprezentuje 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ń względem wystąpienia serwera elastycznego usługi Azure Database for PostgreSQL.
  • Zaimplementuj pobieranie 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 umożliwia przypisaną przez system tożsamość 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 elastycznego serwera usługi Azure Database for PostgreSQL dla tożsamości zarządzanej

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

Należy pamiętać , 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 jak zarządzać usługą Azure Database for PostgreSQL — role serwera elastycznego

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

Uwaga

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. [...].

Uwaga

Jeśli zostanie wyświetlony błąd taki jak "Brak dopasowań funkcji...", 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 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 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 powłoce.

Uwaga

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 DBNAME

Teraz masz 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 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 serwera elastycznego usługi Azure Database for PostgreSQL. Elastyczny serwer usługi 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 serwerem elastycznym usługi Azure Database for PostgreSQL przekazujesz token dostępu w polu hasła.

Oto przykładowy kod platformy .NET dotyczący otwierania połączenia z serwerem elastycznym 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 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));
                    }
                }
            }
        }
    }
}

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

Następne kroki