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
- Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zobacz to omówienie. Jeśli nie masz jeszcze konta platformy Azure, przed kontynuowaniem utwórz bezpłatne konto.
- 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 przypisywania ról, zobacz Przypisywanie ról platformy Azure w celu 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
- Potrzebny jest serwer bazy danych usługi Azure Database for PostgreSQL ze skonfigurowanym uwierzytelnianiem 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 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 curl
jest zainstalowanie programu , jq
i 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.
Nawiązywanie połączenia 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
- Zapoznaj się z ogólnymi pojęciami dotyczącymi uwierzytelniania w usłudze Microsoft Entra w usłudze Azure Database for PostgreSQL