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
, jq
e 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
- Analise os conceitos gerais de autenticação do Microsoft Entra com o Banco de Dados do Azure para PostgreSQL - Servidor Flexível