Ligar com uma identidade gerida à Base 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 pelo usuário para autenticar no Banco de Dados do Azure para servidor flexível PostgreSQL. Este artigo mostra como usar uma identidade gerenciada atribuída pelo sistema para uma máquina virtual (VM) 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 que você se autentique em serviços que oferecem suporte à autenticação do Microsoft Entra sem a necessidade de inserir credenciais em seu código.

Sabe como:

  • Conceda à 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 ao 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 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 uma atribuição de função, consulte Atribuir funções do Azure para gerenciar o acesso aos recursos de assinatura 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 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 de C#, primeiro, preencha o guia sobre como se conectar com C#

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

Use az vm identity assign com o identity assign comando habilita a identidade atribuída pelo sistema a uma VM existente:

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

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

Agora, conecte-se como o usuário administrador do Microsoft Entra ao seu banco de dados de 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 ao sistema:

Por favor, note pgaadauth_create_principal deve 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, consulte como gerenciar o Banco de Dados do Azure habilitado para Microsoft Entra ID para PostgreSQL - Funções de Servidor Flexíveis

A identidade gerenciada agora tem acesso ao autenticar com o nome da identidade como um nome de função e o token Microsoft Entra como uma senha.

Nota

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. [...].

Nota

Se vir um erro como "Nenhuma função corresponde...", certifique-se de que está a ligar à base de dados e não a postgres uma base de dados diferente que 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 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ê recebe de volta um resultado JSON contendo um access_token campo - esse valor de texto longo é o token de acesso de 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.

Nota

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 DBNAME

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

Conectar-se usando a Identidade Gerenciada

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 o servidor flexível PostgreSQL. O servidor flexível do 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 Banco de Dados do Azure para servidor flexível PostgreSQL, você passa o token de acesso no campo de senha.

Conectar-se usando Identidade Gerenciada em Python

Para obter um exemplo de código Python, consulte o Guia de início rápido: usar Python para conectar e consultar dados no Banco de Dados do Azure para PostgreSQL - Servidor Flexível

Conectar-se usando Identidade Gerenciada em Java

Para obter um exemplo de código Java, consulte Guia de início rápido: usar Java e JDBC com o Banco de Dados do Azure para PostgreSQL - Servidor Flexível

Conectar-se usando a identidade gerenciada em C#

Aqui está um exemplo de código .NET de abertura de uma conexão com o Banco de Dados do Azure para servidor flexível 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 (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, este comando dá 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