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.
Conecte-se usando 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 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.
Conecte-se usando identidade gerenciada em Python
Para obter um exemplo de código Python, consulte o Início Rápido: Use Python para conectar e consultar dados no Banco de Dados do Azure para PostgreSQL – Servidor Flexível
Conecte-se usando Identidade Gerenciada em Java
Para obter um exemplo de código Java, consulte o Início Rápido: Usar Java e JDBC com Banco de Dados do Azure para PostgreSQL – Servidor Flexível
Conectar usando a Identidade Gerenciada no C#
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
- Revise os conceitos gerais da Autenticação do Microsoft Entra no Banco de Dados do Azure para PostgreSQL – Servidor Flexível