Tutorial: Conectar-se a bancos de dados do Azure a partir do Serviço de Aplicativo sem segredos usando uma identidade gerenciada
Artigo
O Serviço de Aplicações oferece um serviço de alojamento na Web altamente dimensionável e com correção automática no Azure. Ele também fornece uma identidade gerenciada para seu aplicativo, que é uma solução pronta para uso para proteger o acesso aos bancos de dados do Azure, incluindo:
As identidades geridas no Serviço de Aplicações retiram a necessidade de ter segredos nas suas aplicações, como credenciais nas cadeias de ligação, o que as torna mais seguras. Este tutorial mostra como se conectar aos bancos de dados mencionados acima a partir do Serviço de Aplicativo usando identidades gerenciadas.
O que você vai aprender:
Configure um usuário do Microsoft Entra como administrador para seu banco de dados do Azure.
Conecte-se ao seu banco de dados como o usuário do Microsoft Entra.
Configure uma identidade gerenciada atribuída pelo sistema ou pelo usuário para um aplicativo do Serviço de Aplicativo.
Conceda acesso ao banco de dados à identidade gerenciada.
Conecte-se ao banco de dados do Azure a partir do seu código (.NET Framework 4.8, .NET 6, Node.js, Python, Java) usando uma identidade gerenciada.
Conecte-se ao banco de dados do Azure a partir do seu ambiente de desenvolvimento usando o usuário do Microsoft Entra.
Crie um aplicativo no Serviço de Aplicativo baseado em .NET, Node.js, Python ou Java.
Crie um servidor de banco de dados com o Banco de Dados SQL do Azure, o Banco de Dados do Azure para MySQL ou o Banco de Dados do Azure para PostgreSQL.
Você deve estar familiarizado com o padrão de conectividade padrão (com nome de usuário e senha) e ser capaz de se conectar com êxito do seu aplicativo do Serviço de Aplicativo ao banco de dados de sua escolha.
Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.
Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.
Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.
1. Instale a extensão sem senha do Service Connector
Instale a extensão sem senha mais recente do Service Connector para a CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade
Nota
Verifique se a extensão "serviceconnector-passwordless" versão é "2.0.2" ou superior executando az version. Talvez seja necessário atualizar a CLI do Azure primeiro para atualizar a versão da extensão.
2. Crie uma conexão sem senha
Em seguida, crie uma conexão sem senha com o Service Connector.
Gorjeta
O portal do Azure pode ajudá-lo a compor os comandos abaixo. No portal do Azure, vá para o recurso do Serviço de Aplicativo do Azure, selecione Conector de Serviço no menu esquerdo e selecione Criar. Preencha o formulário com todos os parâmetros necessários. O Azure gera automaticamente o comando de criação de conexão, que você pode copiar para usar na CLI ou executar no Azure Cloud Shell.
Para o Banco de Dados do Azure para MySQL - Servidor Flexível, você deve primeiro configurar manualmente a autenticação do Microsoft Entra, que requer uma identidade gerenciada atribuída ao usuário separada e permissões específicas do Microsoft Graph. Esta etapa não pode ser automatizada.
Em seguida, se você criou tabelas e sequências no servidor flexível PostgreSQL antes de usar o Service Connector, precisará se conectar como proprietário e conceder permissão para <aad-username> criar pelo Service Connector. O nome de usuário da cadeia de conexão ou configuração definida pelo Service Connector deve se parecer com aad_<connection name>. Se você usar o portal do Azure, selecione o botão de expansão ao lado da Service Type coluna e obtenha o valor. Se você usar a CLI do Azure, verifique configurations a saída do comando CLI.
Em seguida, execute a consulta para conceder permissão
az extension add --name rdbms-connect
az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"
O <owner-username> e <owner-password> é o proprietário da tabela existente que pode conceder permissões a outras pessoas. <aad-username> é o usuário criado pelo Service Connector. Substitua-os pelo valor real.
Valide o resultado com o comando:
az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table
Este comando do Service Connector conclui as seguintes tarefas em segundo plano:
Habilite a identidade gerenciada atribuída ao sistema ou atribua uma identidade de usuário para o aplicativo <server-name> hospedado pelo Serviço de Aplicativo do Azure.
Defina o administrador do Microsoft Entra como o usuário conectado atual.
Adicione um usuário de banco de dados para a identidade gerenciada atribuída pelo sistema ou a identidade gerenciada atribuída pelo usuário. Conceda todos os privilégios do banco de dados <database-name> a esse usuário. O nome de usuário pode ser encontrado na cadeia de conexão na saída do comando anterior.
Defina configurações nomeadas AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGou AZURE_SQL_CONNECTIONSTRING para o recurso do Azure com base no tipo de banco de dados.
Para o Serviço de Aplicativo, as configurações são definidas na folha Configurações do aplicativo.
Se você encontrar algum problema ao criar uma conexão, consulte Solução de problemas para obter ajuda.
Obtenha a cadeia de conexão do Banco de Dados SQL do Azure da variável de ambiente adicionada pelo Service Connector.
using Microsoft.Data.SqlClient;
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
// For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
Para obter mais informações, consulte Usando a autenticação de identidade gerenciada do Ative Directory.
Adicione as seguintes dependências no arquivo pom.xml :
Obtenha as configurações de conexão do Banco de Dados SQL do Azure da variável de ambiente adicionada pelo Service Connector. Descomente a parte do trecho de código do tipo de autenticação que você deseja usar.
import os;
import pyodbc
server = os.getenv('AZURE_SQL_SERVER')
port = os.getenv('AZURE_SQL_PORT')
database = os.getenv('AZURE_SQL_DATABASE')
authentication = os.getenv('AZURE_SQL_AUTHENTICATION') # The value should be 'ActiveDirectoryMsi'
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};Authentication={authentication};Encrypt=yes;'
# For user-assigned managed identity.
# client_id = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};UID={client_id};Authentication={authentication};Encrypt=yes;'
conn = pyodbc.connect(connString)
Obtenha as configurações de conexão do Banco de Dados SQL do Azure das variáveis de ambiente adicionadas pelo Service Connector. Descomente a parte do trecho de código do tipo de autenticação que você deseja usar.
A conectividade com o Banco de Dados do Azure para MySQL em seu código segue o DefaultAzureCredential padrão para todas as pilhas de idiomas. DefaultAzureCredential é flexível o suficiente para se adaptar ao ambiente de desenvolvimento e ao ambiente do Azure. Quando executado localmente, ele pode recuperar o usuário do Azure conectado do ambiente de sua escolha (Visual Studio, Visual Studio Code, CLI do Azure ou Azure PowerShell). Ao ser executado no Azure, ele recupera a identidade gerenciada. Assim, é possível ter conectividade com o banco de dados tanto no momento do desenvolvimento quanto na produção. O padrão é o seguinte:
Instancie um DefaultAzureCredential a partir da biblioteca de cliente do Azure Identity. Se você estiver usando uma identidade atribuída pelo usuário, especifique a ID do cliente da identidade.
Obtenha um token de acesso para o Banco de Dados do Azure para MySQL: https://ossrdbms-aad.database.windows.net/.default.
Para .NET, obtenha um token de acesso para a identidade gerenciada usando uma biblioteca de cliente como Azure.Identity. Em seguida, use o token de acesso como uma senha para se conectar ao banco de dados. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
using Azure.Core;
using Azure.Identity;
using MySqlConnector;
// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();
// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// });
var tokenRequestContext = new TokenRequestContext(
new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";
using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();
// do something
Adicione as seguintes dependências no arquivo pom.xml :
Autentique-se com um token de acesso da azure-identity biblioteca. Obtenha as informações de conexão da variável de ambiente adicionada pelo Service Connector. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import mysql.connector
import os
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# cred = ManagedIdentityCredential()
# For user-assigned managed identity.
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# open connect to Azure MySQL with the access token.
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token
cnx = mysql.connector.connect(user=user,
password=password,
host=host,
database=database)
cnx.close()
Obtenha um token de acesso usando @azure/identity e as informações do banco de dados MySQL do Azure das variáveis de ambiente adicionadas pelo Service Connector. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
import { DefaultAzureCredential,ClientSecretCredential } from "@azure/identity";
const mysql = require('mysql2');
// Uncomment the following lines according to the authentication type.
// for system-assigned managed identity
// const credential = new DefaultAzureCredential();
// for user-assigned managed identity
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// acquire token
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
const connection = mysql.createConnection({
host: process.env.AZURE_MYSQL_HOST,
user: process.env.AZURE_MYSQL_USER,
password: accessToken.token,
database: process.env.AZURE_MYSQL_DATABASE,
port: process.env.AZURE_MYSQL_PORT,
ssl: process.env.AZURE_MYSQL_SSL
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL database: ' + err.stack);
return;
}
console.log('Connected to MySQL database');
});
A conectividade com o Banco de Dados do Azure para PostgreSQL em seu código segue o DefaultAzureCredential padrão para todas as pilhas de idiomas. DefaultAzureCredential é flexível o suficiente para se adaptar ao ambiente de desenvolvimento e ao ambiente do Azure. Quando executado localmente, ele pode recuperar o usuário do Azure conectado do ambiente de sua escolha (Visual Studio, Visual Studio Code, CLI do Azure ou Azure PowerShell). Ao ser executado no Azure, ele recupera a identidade gerenciada. Assim, é possível ter conectividade com o banco de dados tanto no momento do desenvolvimento quanto na produção. O padrão é o seguinte:
Instancie um DefaultAzureCredential a partir da biblioteca de cliente do Azure Identity. Se você estiver usando uma identidade atribuída pelo usuário, especifique a ID do cliente da identidade.
Obtenha um token de acesso para o Banco de Dados do Azure para PostgreSQL: https://ossrdbms-aad.database.windows.net/.default.
Para .NET, obtenha um token de acesso para a identidade gerenciada usando uma biblioteca de cliente como Azure.Identity. Em seguida, use o token de acesso como uma senha para se conectar ao banco de dados. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
using Azure.Identity;
using Azure.Core;
using Npgsql;
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// }
// );
// Acquire the access token.
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]
{
"https://ossrdbms-aad.database.windows.net/.default"
}));
// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";
// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
Console.WriteLine("Opening connection using access token...");
connection.Open();
}
Adicione as seguintes dependências no arquivo pom.xml :
Autentique-se com um token de acesso da azure-identity biblioteca e use o token como senha. Obtenha as informações de conexão das variáveis de ambiente adicionadas pelo Service Connector. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# For system-assigned identity.
# cred = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# Acquire the access token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# Combine the token with the connection string from the environment variables added by Service Connector to establish the connection.
conn_string = os.getenv('AZURE_POSTGRESQL_CONNECTIONSTRING')
conn = psycopg2.connect(conn_string + ' password=' + accessToken.token)
Para obter mais informações, consulte os seguintes recursos:
No código, obtenha o token de acesso via @azure/identity e informações de conexão PostgreSQL de variáveis de ambiente adicionadas pelo serviço Service Connector. Combine-os para estabelecer a conexão. Ao usar o código abaixo, certifique-se de descomentar a parte do trecho de código que corresponde ao tipo de autenticação que você deseja usar.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// const credential = new DefaultAzureCredential();
// For user-assigned identity.
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// Acquire the access token.
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
// Use the token and the connection information from the environment variables added by Service Connector to establish the connection.
(async () => {
const client = new Client({
host: process.env.AZURE_POSTGRESQL_HOST,
user: process.env.AZURE_POSTGRESQL_USER,
password: accesstoken.token,
database: process.env.AZURE_POSTGRESQL_DATABASE,
port: Number(process.env.AZURE_POSTGRESQL_PORT) ,
ssl: process.env.AZURE_POSTGRESQL_SSL
});
await client.connect();
await client.end();
})();
Este código de exemplo usa DefaultAzureCredential para obter um token utilizável para seu banco de dados do Azure do Microsoft Entra ID e, em seguida, adiciona-o à conexão de banco de dados. Embora você possa personalizar DefaultAzureCredential, ele já é versátil por padrão. Ele obtém um token do usuário conectado ao Microsoft Entra ou de uma identidade gerenciada, dependendo se você o executa localmente em seu ambiente de desenvolvimento ou no Serviço de Aplicativo.
Sem mais alterações, seu código está pronto para ser executado no Azure. Para depurar seu código localmente, no entanto, seu ambiente de desenvolvimento precisa de um usuário conectado ao Microsoft Entra. Nesta etapa, você configura seu ambiente de escolha entrando com seu usuário do Microsoft Entra.
O Visual Studio para Windows está integrado com a autenticação do Microsoft Entra. Para habilitar o desenvolvimento e a depuração no Visual Studio, adicione seu usuário do Microsoft Entra no Visual Studio selecionando Configurações de Conta de Arquivo>no menu e selecione Entrar ou Adicionar.
Para definir o usuário do Microsoft Entra para autenticação de serviço do Azure, selecione Opções de Ferramentas>no menu e, em seguida, selecione Seleção de Conta de Autenticação>de Serviço do Azure. Selecione o usuário do Microsoft Entra que você adicionou e selecione OK.
O Visual Studio para Mac não está integrado com a autenticação do Microsoft Entra. No entanto, a biblioteca de cliente do Azure Identity que você usará mais tarde também pode recuperar tokens da CLI do Azure. Para habilitar o desenvolvimento e a depuração no Visual Studio, instale a CLI do Azure em sua máquina local.
Entre na CLI do Azure com o seguinte comando usando seu usuário do Microsoft Entra:
az login --allow-no-subscriptions
O Visual Studio Code é integrado com a autenticação do Microsoft Entra por meio da extensão do Azure. Instale a extensão Ferramentas do Azure no Visual Studio Code.
No Visual Studio Code, na Barra de Atividades, selecione o logotipo do Azure.
No explorador do Serviço de Aplicações , selecione Iniciar sessão no Azure... e siga as instruções.
A biblioteca de cliente do Azure Identity que você usará mais tarde pode usar tokens da CLI do Azure. Para habilitar o desenvolvimento baseado em linha de comando, instale a CLI do Azure em sua máquina local.
Entre no Azure com o seguinte comando usando seu usuário do Microsoft Entra:
az login --allow-no-subscriptions
A biblioteca de cliente do Azure Identity que você usará mais tarde pode usar tokens do Azure PowerShell. Para habilitar o desenvolvimento baseado em linha de comando, instale o Azure PowerShell em sua máquina local.
Entre na CLI do Azure com o seguinte cmdlet usando seu usuário do Microsoft Entra:
Agora você está pronto para desenvolver e depurar seu aplicativo com o Banco de dados SQL como back-end, usando a autenticação do Microsoft Entra.
5. Teste e publique
Execute seu código em seu ambiente de desenvolvimento. Seu código usa o usuário conectado do Microsoft Entra em seu ambiente para se conectar ao banco de dados back-end. O usuário pode acessar o banco de dados porque ele está configurado como um administrador do Microsoft Entra para o banco de dados.
Publique seu código no Azure usando o método de publicação preferido. No Serviço de Aplicativo, seu código usa a identidade gerenciada do aplicativo para se conectar ao banco de dados back-end.
Recebo o erro Login failed for user '<token-identified principal>'.
A identidade gerenciada para a qual você está tentando solicitar um token não está autorizada a acessar o banco de dados do Azure.
Fiz alterações na autenticação do Serviço de Aplicativo ou no registro do aplicativo associado. Por que ainda recebo o token antigo?
Os serviços back-end de identidades gerenciadas também mantêm um cache de token que atualiza o token para um recurso de destino somente quando ele expira. Se você modificar a configuração depois de tentar obter um token com seu aplicativo, não obterá um novo token com as permissões atualizadas até que o token armazenado em cache expire. A melhor maneira de contornar isso é testar suas alterações com uma nova janela InPrivate (Edge)/private (Safari)/Incognito (Chrome). Dessa forma, você certamente começará a partir de uma nova sessão autenticada.
Como adiciono a identidade gerenciada a um grupo do Microsoft Entra?
Se desejar, você pode adicionar a identidade a um grupo do Microsoft Entra e, em seguida, conceder acesso ao grupo do Microsoft Entra em vez da identidade. Por exemplo, os comandos a seguir adicionam a identidade gerenciada da etapa anterior a um novo grupo chamado myAzureSQLDBAccessGroup:
groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
Para conceder permissões de banco de dados para um grupo do Microsoft Entra, consulte a documentação do respetivo tipo de banco de dados.
Eu recebo o erro SSL connection is required. Please specify SSL options and retry.
A conexão com o banco de dados do Azure requer configurações adicionais e está além do escopo deste tutorial. Para obter mais informações, consulte um dos seguintes links:
Criei meu aplicativo com o modelo Aplicativo Web + Banco de Dados e agora não consigo configurar uma conexão de identidade gerenciada com os comandos do Service Connector.
O Service Connector precisa de acesso à rede para o banco de dados para conceder acesso à identidade do aplicativo. Quando você cria um aplicativo seguro por padrão e uma arquitetura de banco de dados no portal do Azure com o modelo Aplicativo Web + Banco de Dados, a arquitetura bloqueia o acesso de rede ao banco de dados e só permite conexões de dentro da rede virtual. Também é verdade para o Azure Cloud Shell. No entanto, você pode implantar o Cloud Shell na rede virtual e, em seguida, executar o comando Service Connector nesse Cloud Shell.
Próximos passos
O que aprendeu:
Configure um usuário do Microsoft Entra como administrador para seu banco de dados do Azure.
Conecte-se ao seu banco de dados como o usuário do Microsoft Entra.
Configure uma identidade gerenciada atribuída pelo sistema ou pelo usuário para um aplicativo do Serviço de Aplicativo.
Conceda acesso ao banco de dados à identidade gerenciada.
Conecte-se ao banco de dados do Azure a partir do seu código (.NET Framework 4.8, .NET 6, Node.js, Python, Java) usando uma identidade gerenciada.
Conecte-se ao banco de dados do Azure a partir do seu ambiente de desenvolvimento usando o usuário do Microsoft Entra.