Připojení se spravovanou identitou na flexibilní server Azure Database for PostgreSQL

PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL

Spravované identity přiřazené systémem i uživatelem můžete použít k ověření na flexibilním serveru Azure Database for PostgreSQL. V tomto článku se dozvíte, jak použít spravovanou identitu přiřazenou systémem pro virtuální počítač Azure pro přístup k instanci flexibilního serveru Azure Database for PostgreSQL. Spravované identity se automaticky spravují v Azure a umožňují ověřování ve službách, které podporují ověřování Microsoft Entra, aniž byste museli do kódu vkládat přihlašovací údaje.

Získáte informace pro:

  • Udělte virtuálnímu počítači přístup k instanci flexibilního serveru Azure Database for PostgreSQL.
  • Vytvořte uživatele v databázi, který představuje identitu přiřazenou systémem virtuálního počítače.
  • Získejte přístupový token pomocí identity virtuálního počítače a použijte ho k dotazování instance flexibilního serveru Azure Database for PostgreSQL.
  • Implementujte načtení tokenu v ukázkové aplikaci jazyka C#.

Požadavky

  • Pokud ještě neznáte funkci spravovaných identit pro prostředky Azure, podívejte se na tento přehled. Pokud nemáte účet Azure, zaregistrujte si bezplatný účet před tím, než budete pokračovat.
  • K vytvoření požadovaného prostředku a správě rolí váš účet potřebuje oprávnění Vlastník v příslušném oboru (vaše předplatné nebo skupina prostředků). Pokud potřebujete pomoc s přiřazením role, přečtěte si téma Přiřazení rolí Azure ke správě přístupu k prostředkům předplatného Azure.
  • Potřebujete virtuální počítač Azure (například s Ubuntu Linuxem), který chcete použít pro přístup k databázi pomocí spravované identity.
  • Potřebujete instanci flexibilního serveru Azure Database for PostgreSQL s nakonfigurovaným ověřováním Microsoft Entra.
  • Pokud chcete postupovat podle příkladu jazyka C#, nejprve dokončete průvodce Připojení pomocí jazyka C.#

Vytvoření spravované identity přiřazené systémem pro virtuální počítač

Pomocí příkazu az vm identity assignidentity assign povolíte identitu přiřazenou systémem k existujícímu virtuálnímu počítači:

az vm identity assign -g myResourceGroup -n myVm

Načtěte ID aplikace pro spravovanou identitu přiřazenou systémem, kterou budete potřebovat v několika dalších krocích:

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

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

Vytvoření uživatele flexibilního serveru Azure Database for PostgreSQL pro spravovanou identitu

Teď se připojte jako uživatel správce Microsoft Entra k flexibilní serverové databázi Azure Database for PostgreSQL a spusťte následující příkazy SQL, přičemž nahraďte <identity_name> názvem prostředků, pro které jste vytvořili spravovanou identitu přiřazenou systémem:

Upozorňujeme , že pgaadauth_create_principal musí být spuštěna v databázi Postgres.

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

Úspěch vypadá takto:

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

Další informace o správě databázových rolí s povoleným ID Microsoft Entra najdete v tématu o správě rolí flexibilního serveru Azure Database for PostgreSQL s podporou Microsoft Entra ID.

Spravovaná identita teď má přístup při ověřování s názvem identity jako názvem role a tokenem Microsoft Entra jako heslem.

Poznámka:

Pokud spravovaná identita není platná, vrátí se chyba: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Poznámka:

Pokud se zobrazí chyba typu Žádná funkce neodpovídá, ujistěte se, že se připojujete k postgres databázi, ne k jiné databázi, kterou jste vytvořili.

Načtení přístupového tokenu ze služby Azure Instance Metadata

Vaše aplikace teď může načíst přístupový token ze služby Azure Instance Metadata a použít ho k ověřování v databázi.

Toto načtení tokenu se provádí provedením požadavku HTTP na http://169.254.169.254/metadata/identity/oauth2/token následující parametry a předáním následujících parametrů:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (které jste získali dříve)

Vrátíte výsledek JSON obsahující access_token pole – tato dlouhá textová hodnota je přístupový token spravované identity, který byste měli použít jako heslo při připojování k databázi.

Pro účely testování můžete v prostředí spustit následující příkazy.

Poznámka:

Všimněte si, že potřebujete curl, jqa psql klient nainstalovaný.

# 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

Teď jste připojení k databázi, kterou jste nakonfigurovali dříve.

Připojení s využitím spravované identity v jazyce C#

Tato část ukazuje, jak získat přístupový token pomocí spravované identity přiřazené uživatelem virtuálního počítače a jak ho použít k volání flexibilního serveru Azure Database for PostgreSQL. Flexibilní server Azure Database for PostgreSQL nativně podporuje ověřování Microsoft Entra, takže může přímo přijímat přístupové tokeny získané pomocí spravovaných identit pro prostředky Azure. Při vytváření připojení k flexibilnímu serveru Azure Database for PostgreSQL předáte přístupový token do pole hesla.

Tady je příklad kódu .NET pro otevření připojení k flexibilnímu serveru Azure Database for PostgreSQL pomocí přístupového tokenu. Tento kód musí běžet na virtuálním počítači, aby pomocí spravované identity přiřazené systémem získal přístupový token z ID Microsoft Entra. Nahraďte hodnoty HOST, USER (with <identity_name>) a 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));
                    }
                }
            }
        }
    }
}

Při spuštění tento příkaz zobrazí výstup podobný tomuto:

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

Další kroky