관리 ID를 사용하여 Azure Database for PostgreSQL 유연한 서버에 연결

적용 대상: Azure Database for PostgreSQL - 유연한 서버

시스템 할당 및 사용자 할당 관리 ID를 모두 사용하여 Azure Database for PostgreSQL 유연한 서버에 인증할 수 있습니다. 이 문서에서는 Azure VM(Virtual Machine)에 대한 시스템 할당 관리 ID를 사용하여 Azure Database for PostgreSQL 유연한 서버 인스턴스에 액세스하는 방법을 보여 줍니다. 관리 ID는 Azure에서 자동으로 관리되며 코드에 자격 증명을 삽입할 필요 없이 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

다음 방법에 대해 설명합니다.

  • VM에 Azure Database for PostgreSQL 유연한 서버 인스턴스에 대한 액세스 권한을 부여합니다.
  • 데이터베이스에 시스템이 할당한 VM ID를 나타내는 사용자를 만듭니다.
  • VM ID를 사용하여 액세스 토큰을 가져오고 이를 사용하여 Azure Database for PostgreSQL 유연한 서버 인스턴스를 쿼리합니다.
  • C# 예제 애플리케이션에서 토큰 검색을 구현합니다.

필수 조건

  • Azure 리소스에 대한 관리 ID 기능이 익숙하지 않은 경우 개요를 참조하세요. Azure 계정이 없으면 계속하기 전에 체험 계정에 등록합니다.
  • 필요한 리소스를 만들고 역할을 관리하려면 적절한 범위(사용자 구독 또는 리소스 그룹)의 "소유자" 권한이 계정에 필요합니다. 역할 할당에 관한 도움이 필요한 경우 Azure 역할을 할당하여 Azure 구독 리소스에 대한 액세스 관리를 참조하세요.
  • 관리 ID를 사용하여 데이터베이스에 액세스하는 데 사용할 Azure VM(예: Ubuntu Linux 실행)이 필요합니다.
  • Microsoft Entra 인증이 구성된 Azure Database for PostgreSQL 유연한 서버 인스턴스가 필요합니다.
  • C# 예를 따르려면 먼저 C#을 사용하여 연결하는 방법 가이드를 완료합니다.

VM에 대한 시스템 할당 관리 ID 만들기

az vm identity assignidentity assign 명령과 함께 사용하여 기존 VM에 시스템 할당 ID를 사용하도록 설정합니다.

az vm identity assign -g myResourceGroup -n myVm

시스템이 할당한 관리 ID의 애플리케이션 ID를 검색합니다. 이 ID는 다음 몇 단계에서 필요합니다.

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

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

관리 ID에 대한 Azure Database for PostgreSQL 유연한 서버 사용자 만들기

이제 Microsoft Entra 관리자 사용자로 Azure Database for PostgreSQL 유연한 서버 데이터베이스에 연결하고 다음 SQL 문을 실행합니다. 여기서 <identity_name>은 시스템 할당 관리 ID를 만든 리소스의 이름으로 바꿉니다.

pgaadauth_create_principal은 Postgres 데이터베이스에서 실행되어야 합니다.

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

다음과 같으면 성공한 것입니다.

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

Microsoft Entra ID 지원 데이터베이스 역할 관리에 대한 자세한 내용은 Microsoft Entra ID 지원 Azure Database for PostgreSQL - 유연한 서버 역할 관리 방법을 참조하세요.

이제 관리 ID는 ID 이름을 역할 이름으로, Microsoft Entra 토큰을 암호로 인증할 때 액세스할 수 있습니다.

참고 항목

관리 ID가 유효하지 않으면 ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...] 오류가 반환됩니다.

참고 항목

"일치하는 기능이 없음..."과 같은 오류가 표시되면 자신이 만든 다른 데이터베이스가 아닌 postgres 데이터베이스에 연결하고 있는지 확인합니다.

Azure 인스턴스 메타데이터 서비스에서 액세스 토큰 검색

이제 애플리케이션에서 Azure Instance Metadata Service를 통해 액세스 토큰을 검색하여 데이터베이스를 인증하는 데 사용할 수 있습니다.

이 토큰 검색은 http://169.254.169.254/metadata/identity/oauth2/token에 대한 HTTP 요청을 수행하고 다음 매개 변수를 전달하여 수행됩니다.

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID(이전에 검색한 항목)

access_token 필드가 포함된 JSON 결과를 반환합니다. 이 긴 텍스트 값은 데이터베이스에 연결할 때 암호로 사용해야 하는 관리 ID 액세스 토큰입니다.

테스트를 위해 셸에서 다음 명령을 실행할 수 있습니다.

참고 항목

curl, jqpsql 클라이언트를 설치해야 합니다.

# 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

이제 이전에 구성한 데이터베이스에 연결되었습니다.

관리 ID를 사용하여 연결

이 섹션에서는 VM의 사용자 할당 관리 ID를 사용하여 액세스 토큰을 가져오고 이를 사용하여 Azure Database for PostgreSQL 유연한 서버를 호출하는 방법을 보여 줍니다. Azure Database for PostgreSQL 유연한 서버는 기본적으로 Microsoft Entra 인증을 지원하므로 Azure 리소스에 대한 관리 ID를 사용하여 가져오는 액세스 토큰을 직접 수락할 수 있습니다. Azure Database for PostgreSQL 유연한 서버에 대한 연결을 만들 때 암호 필드에 액세스 토큰을 전달합니다.

Python에서 관리 ID를 사용하여 연결

Python 코드 예제는 빠른 시작: Python을 사용하여 Azure Database for PostgreSQL - 유연한 서버의 데이터 연결 및 쿼리를 참조하세요.

Java에서 관리 ID를 사용하여 연결

Java 코드 예제는 빠른 시작: Azure Database for PostgreSQL - 유연한 서버에서 Java 및 JDBC 사용을 참조하세요.

C#에서 관리 ID를 사용하여 연결

다음은 액세스 토큰을 사용하여 Azure Database for PostgreSQL 유연한 서버에 대한 연결을 여는 .NET 코드 예입니다. 시스템 할당 관리 ID를 사용하여 Microsoft Entra ID에서 액세스 토큰을 가져오려면 이 코드가 VM에서 실행되어야 합니다. HOST, USER(<identity_name> 사용) 및 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));
                    }
                }
            }
        }
    }
}

실행하면 이 명령은 다음과 같은 출력을 제공합니다.

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 

다음 단계