Подключение к Базе данных Azure для PostgreSQL с помощью управляемого удостоверения

Область применения: отдельный сервер Базы данных Azure для PostgreSQL

Внимание

База данных Azure для PostgreSQL — одиночный сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для PostgreSQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для PostgreSQL — гибкий сервер см. в статье "Что происходит с одним сервером База данных Azure для PostgreSQL?".

Для проверки подлинности в службе «База данных Azure для PostgreSQL» можно использовать как управляемые системой, так и назначенные пользователем управляемые удостоверения. В этой статье показано, как использовать назначаемое системой управляемое удостоверение для виртуальной машины Azure в целях доступа к серверу базы данных Azure для PostgreSQL. Управляемыми удостоверениями автоматически управляет Azure. Они позволяют проходить проверку подлинности в службах, поддерживающих аутентификацию Microsoft Entra, без указания учетных данных в коде.

Узнайте следующие темы:

  • Предоставление виртуальной машине доступа к серверу базы данных Azure для PostgreSQL
  • Создание в базе данных пользователя, который представляет назначаемое системой удостоверение виртуальной машины
  • Получение маркера доступа с использованием идентификатора виртуальной машины и отправка запроса на сервер базы данных Azure для PostgreSQL с его помощью
  • Реализация получения маркера в примере приложения C#

Необходимые компоненты

Создание управляемого удостоверения, назначаемого системой, для виртуальной машины

Чтобы включить удостоверение, назначаемое системой на имеющейся виртуальной машине, используйте команду az vm identity assign с параметром identity assign.

az vm identity assign -g myResourceGroup -n myVm

Получите идентификатор приложения для управляемого системой удостоверения, которое вам потребуется в следующих шагах:

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

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

Создание пользователя PostgreSQL для управляемого удостоверения

Теперь подключитесь к базе данных PostgreSQL от имени администратора Microsoft Entra и выполните следующие инструкции SQL, заменив CLIENT_ID идентификатор клиента, полученный для управляемого удостоверения, назначаемого системой:

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

Теперь управляемое удостоверение имеет доступ при проверке подлинности с помощью имени пользователя myuser (замените другим именем по своему усмотрению).

Получение маркера доступа из Службы метаданных экземпляров Azure

Теперь приложение может получить маркер доступа из Службы метаданных экземпляров Azure и использовать его для проверки подлинности в базе данных.

Получение маркера осуществляется посредством отправки HTTP-запроса на адрес http://169.254.169.254/metadata/identity/oauth2/token и передачи следующих параметров:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (получено ранее)

В результате вы получите JSON с полем access_token — это длинное текстовое значение является маркером доступа управляемого удостоверения, который следует использовать в качестве пароля при подключении к базе данных.

В целях проверки можно выполнить в оболочке приведенные ниже команды. Обратите внимание, что требуется curl, jq и установленный клиент 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@SERVER DBNAME

Теперь вы подключены к настроенной ранее базе данных.

Подключение с использованием управляемого удостоверения в C#

В этом разделе показано, как получить маркер доступа с помощью назначаемого пользователем управляемого удостоверения виртуальной машины и использовать этот маркер для обращения к базе данных Azure для PostgreSQL. База данных Azure для PostgreSQL изначально поддерживает проверку подлинности Microsoft Entra, поэтому он может напрямую принимать маркеры доступа, полученные с помощью управляемых удостоверений для ресурсов Azure. При создании подключения к PostgreSQL вы передаете маркер доступа в поле пароля.

Ниже приведен пример кода .NET для установки подключения к PostgreSQL с помощью маркера доступа. Этот код должен выполняться на виртуальной машине, чтобы использовать управляемое удостоверение, назначаемое системой, для получения маркера доступа из идентификатора Microsoft Entra. Замените значения HOST, USER, DATABASE и 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));
                    }
                }
            }
        }
    }
}

При выполнении эта команда выдает следующий результат:

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

Следующие шаги