Compartilhar via


Conectar-se com a identidade gerenciada ao Banco de Dados do Azure para PostgreSQL – Servidor Flexível

APLICA-SE A: Banco de Dados do Azure para PostgreSQL – Servidor Flexível

Você pode usar identidades gerenciadas atribuídas pelo sistema e atribuídas pelo usuário para autenticar no servidor flexível do Banco de Dados do Azure para PostgreSQL. Este artigo mostra como usar uma identidade gerenciada atribuída pelo sistema para uma VM (Máquina Virtual) do Azure para acessar uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL. As Identidades Gerenciadas são gerenciadas automaticamente pelo Azure e permitem a você autenticar os serviços compatíveis com a autenticação do Microsoft Entra sem a necessidade de inserir as credenciais em seu código.

Você aprenderá como:

  • Conceda a sua VM acesso a uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL.
  • Crie um usuário no banco de dados que represente a identidade atribuída pelo sistema da VM.
  • Obtenha um token de acesso usando a identidade da VM e use-o para consultar uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL.
  • Implemente a recuperação de token em um aplicativo de exemplo em C#.

Pré-requisitos

  • Se você não estiver familiarizado com as identidades gerenciadas para funcionalidades de recursos do Azure, veja esta visão geral. Caso você ainda não tenha uma conta do Azure, inscreva-se em uma conta gratuita antes de continuar.
  • Para executar a criação de recursos e o gerenciamento de função necessários, sua conta precisa de permissões "Proprietário" no escopo apropriado (sua assinatura ou grupo de recursos). Se precisar de ajuda com a atribuição de função, confira Atribuir funções do Azure para gerenciar o acesso aos recursos de assinatura do Azure.
  • É necessário uma VM do Azure (por exemplo, ao executar Ubuntu Linux) que você gostaria de usar para acessar o banco de dados usando a Identidade Gerenciada
  • Você precisa de uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL que tenha a autenticação do Microsoft Entra configurada
  • Para seguir o exemplo C#, primeiro conclua o guia sobre como Conectar com C#

Criar uma identidade gerenciada atribuída pelo sistema para a VM

Use az vm identity assign com identity assign para habilitar a identidade atribuída ao sistema para uma VM existente:

az vm identity assign -g myResourceGroup -n myVm

Recupere a ID do aplicativo da identidade gerenciada atribuída pelo sistema, que será necessária 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

Criar um usuário de servidor flexível do Banco de Dados do Azure para PostgreSQL para sua Identidade Gerenciada

Agora, conecte-se como usuário administrador do Microsoft Entra ao banco de dados do servidor flexível do Banco de Dados do Azure para PostgreSQL e execute as seguintes instruções SQL, substituindo <identity_name> pelo nome dos recursos para os quais você criou uma identidade gerenciada atribuída pelo sistema:

Observe que pgaadauth_create_principal precisa ser executado no banco de dados Postgres.

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

O sucesso se parece com:

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

Para obter mais informações sobre como gerenciar funções de banco de dados habilitadas para Microsoft Entra ID, confira como gerenciar as funções do Servidor Flexível do Banco de Dados do Azure para PostgreSQL habilitada para Microsoft Entra ID

A identidade gerenciada agora tem acesso quando se autentica com o nome de identidade como nome de função e o token do Microsoft Entra como senha.

Observação

Se a identidade gerenciada não for válida, um erro será retornado: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Observação

Se você vir um erro como “Nenhuma correspondência de função...”, verifique se você está se conectando ao banco de dados postgres, não a um banco de dados diferente que você também criou.

Recuperar 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 da instância do Azure e usá-lo para autenticação com o banco de dados.

Essa recuperação de token é feita ao fazer uma solicitação HTTP para http://169.254.169.254/metadata/identity/oauth2/token e transmitir 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ê obterá um resultado JSON contendo um campo access_token – esse valor de texto longo é o token de acesso da Identidade Gerenciada, que você deve usar como a senha ao se conectar ao banco de dados.

Para fins de teste, execute os seguintes comandos no shell.

Observação

Observe que você precisa de curl, de jq e do cliente psql 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 DBNAME

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

Conectar usando a Identidade Gerenciada no 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 servidor flexível do Banco de Dados do Azure para PostgreSQL. O servidor flexível do Banco de Dados do Azure para PostgreSQL dá suporte nativo à autenticação do Microsoft Entra, portanto, ele pode aceitar diretamente tokens de acesso obtidos usando identidades gerenciadas para recursos do Azure. Ao criar uma conexão com o servidor flexível do Banco de Dados do Azure para PostgreSQL, você passa o token de acesso no campo senha.

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

Quando executado, esse comando fornece 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óximas etapas