Share via


Ligar à Base de Dados do Azure para PostgreSQL com a Identidade Gerida

APLICA-SE A: Banco de Dados do Azure para PostgreSQL - Servidor Único

Importante

O Banco de Dados do Azure para PostgreSQL - Servidor Único está no caminho da desativação. É altamente recomendável que você atualize para o Banco de Dados do Azure para PostgreSQL - Servidor Flexível. Para obter mais informações sobre como migrar para o Banco de Dados do Azure para PostgreSQL - Servidor Flexível, consulte O que está acontecendo com o Banco de Dados do Azure para Servidor Único PostgreSQL?.

Pode utilizar identidades geridas atribuídas tanto pelo sistema como pelo utilizador para fazer a autenticação na Base de Dados do Azure para PostgreSQL. Este artigo mostra como usar uma identidade gerenciada atribuída pelo sistema para uma máquina virtual (VM) do Azure para acessar um banco de dados do Azure para servidor PostgreSQL. As identidades geridas são geridas automaticamente pelo Azure e permitem-lhe fazer a autenticação em serviços que suportam a autenticação do Microsoft Entra, sem ser necessário inserir credenciais no seu código.

Sabe como:

  • Conceda à sua VM acesso a um Banco de Dados do Azure para servidor PostgreSQL
  • Criar um usuário no banco de dados que representa a identidade atribuída ao sistema da VM
  • Obter um token de acesso usando a identidade da VM e usá-lo para consultar um Banco de Dados do Azure para o servidor PostgreSQL
  • Implementar a recuperação de token em um aplicativo de exemplo em C#

Pré-requisitos

  • Se não estiver familiarizado com a funcionalidade das identidades geridas para os recursos do Azure, veja esta descrição geral. Se não tiver uma conta do Azure, inscreva-se numa conta gratuita antes de continuar.
  • Para fazer a criação de recursos e o gerenciamento de funções necessários, sua conta precisa de permissões de "Proprietário" no escopo apropriado (sua assinatura ou grupo de recursos). Se precisar de ajuda com a atribuição de funções, consulte Atribuir funções do Azure para gerir o acesso aos seus recursos de subscrição do Azure.
  • Você precisa de uma VM do Azure (por exemplo, executando o Ubuntu Linux) que gostaria de usar para acessar seu banco de dados usando a Identidade Gerenciada
  • Você precisa de um banco de dados do Azure para servidor de banco de dados PostgreSQL que tenha a autenticação do Microsoft Entra configurada
  • Para seguir o exemplo de C#, primeiro preencha o guia de como conectar-se com C#

Criando uma identidade gerenciada atribuída ao sistema para sua VM

Use az vm identity assign com o identity assign comando enable the system-assigned identity to an existing VM:

az vm identity assign -g myResourceGroup -n myVm

Recupere o ID do aplicativo para a identidade gerenciada atribuída ao sistema, que você precisará nas próximas etapas:

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

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

Criando um usuário PostgreSQL para sua identidade gerenciada

Agora, conecte-se como o usuário administrador do Microsoft Entra ao seu banco de dados PostgreSQL e execute as seguintes instruções SQL, substituindo CLIENT_ID pelo ID do cliente recuperado para sua identidade gerenciada atribuída ao sistema:

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

A identidade gerenciada agora tem acesso ao autenticar com o nome myuser de usuário (substitua por um nome de sua escolha).

Recuperando o token de acesso do serviço de Metadados de Instância do Azure

Seu aplicativo agora pode recuperar um token de acesso do serviço de Metadados de Instância do Azure e usá-lo para autenticação com o banco de dados.

Essa recuperação de token é feita fazendo uma solicitação HTTP e http://169.254.169.254/metadata/identity/oauth2/token passando os seguintes parâmetros:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (que você recuperou anteriormente)

Você receberá de volta um resultado JSON que contém um access_token campo - esse valor de texto longo é o token de acesso da Identidade Gerenciada, que você deve usar como senha ao se conectar ao banco de dados.

Para fins de teste, você pode executar os seguintes comandos em seu shell. Observe que você precisa de curl, jqe o psql cliente instalado.

# 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

Agora você está conectado ao banco de dados que configurou anteriormente.

Conectando-se usando a identidade gerenciada em C#

Esta seção mostra como obter um token de acesso usando a identidade gerenciada atribuída pelo usuário da VM e usá-lo para chamar o Banco de Dados do Azure para PostgreSQL. O Banco de Dados do Azure para PostgreSQL dá suporte nativo à autenticação do Microsoft Entra, para que ele possa aceitar diretamente tokens de acesso obtidos usando identidades gerenciadas para recursos do Azure. Ao criar uma conexão com o PostgreSQL, você passa o token de acesso no campo senha.

Aqui está um exemplo de código .NET de abrir uma conexão com o PostgreSQL usando um token de acesso. Esse código deve ser executado na VM para usar a identidade gerenciada atribuída ao sistema para obter um token de acesso do Microsoft Entra ID. Substitua os valores de HOST, USER, DATABASE e 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));
                    }
                }
            }
        }
    }
}

Quando executado, este comando dará uma saída como esta:

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

Próximos passos