Kurz: Připojení k databázím Azure ze služby App Service bez tajných kódů pomocí spravované identity
Článek
App Service je vysoce škálovatelná služba s automatickými opravami pro hostování webů v Azure. Poskytuje také spravovanou identitu pro vaši aplikaci, což je řešení pro zabezpečení přístupu k databázím Azure, včetně následujících:
Spravované identity ve službě App Service zvyšují zabezpečení vaší aplikace tím, že z aplikace odstraňují tajné kódy, jako jsou přihlašovací údaje v připojovacích řetězcích. V tomto kurzu se dozvíte, jak se z App Service připojit k výše uvedeným databázím pomocí spravovaných identit.
Co se naučíte:
Nakonfigurujte uživatele Microsoft Entra jako správce pro vaši databázi Azure.
Připojte se k databázi jako uživatel Microsoft Entra.
Nakonfigurujte spravovanou identitu přiřazenou systémem nebo přiřazenou uživatelem pro aplikaci app Service.
Udělte spravované identitě přístup k databázi.
Připojte se k databázi Azure z kódu (.NET Framework 4.8, .NET 6, Node.js, Python, Java) pomocí spravované identity.
Připojte se k databázi Azure z vývojového prostředí pomocí uživatele Microsoft Entra.
Vytvořte aplikaci ve službě App Service na základě .NET, Node.js, Pythonu nebo Javy.
Vytvořte databázový server pomocí Azure SQL Database, Azure Database for MySQL nebo Azure Database for PostgreSQL.
Měli byste být obeznámeni se standardním vzorem připojení (s uživatelským jménem a heslem) a úspěšně se připojit z aplikace App Service k databázi podle vašeho výběru.
Pokud dáváte přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, nainstalujte Azure CLI. Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Docker. Další informace najdete v tématu Jak spustit Azure CLI v kontejneru Dockeru.
Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí příkazu az login. Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených na terminálu. Další možnosti přihlášení najdete v tématu Přihlášení pomocí Azure CLI.
Po zobrazení výzvy nainstalujte rozšíření Azure CLI při prvním použití. Další informace o rozšířeních najdete v tématu Využití rozšíření v Azure CLI.
Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.
1. Instalace rozšíření Bez hesla konektoru Service Connector
Nainstalujte nejnovější rozšíření bez hesla konektoru Service Connector pro Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Poznámka:
Spuštěním příkazu az version zkontrolujte, jestli je verze serviceconnector-passwordless verze 2.0.2 nebo vyšší. Abyste mohli upgradovat verzi rozšíření, možná budete muset nejprve upgradovat Azure CLI.
2. Vytvoření připojení bez hesla
Dále vytvořte připojení bez hesla pomocí konektoru Service Connector.
Tip
S vytvářením příkazů níže vám může pomoct Azure Portal. Na webu Azure Portal přejděte na prostředek služby Aplikace Azure, v nabídce vlevo vyberte Konektor služby a vyberte Vytvořit. Vyplňte formulář všemi požadovanými parametry. Azure automaticky vygeneruje příkaz pro vytvoření připojení, který můžete zkopírovat do rozhraní příkazového řádku nebo spustit v Azure Cloud Shellu.
Pro flexibilní server Azure Database for MySQL musíte nejprve ručně nastavit ověřování Microsoft Entra, které vyžaduje samostatnou spravovanou identitu přiřazenou uživatelem a konkrétní oprávnění Microsoft Graphu. Tento krok nejde automatizovat.
Pokud jste vytvořili tabulky a sekvence na flexibilním serveru PostgreSQL před použitím konektoru služby, musíte se připojit jako vlastník a udělit oprávnění k <aad-username> vytvoření konektorem služby. Uživatelské jméno z připojovací řetězec nebo konfigurace nastavené konektorem služby by mělo vypadat taktoaad_<connection name>. Pokud používáte Azure Portal, vyberte tlačítko rozbalení vedle Service Type sloupce a získejte hodnotu. Pokud používáte Azure CLI, zkontrolujte configurations výstup příkazu rozhraní příkazového řádku.
Pak spusťte dotaz, který udělí oprávnění.
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>\";"
<owner-password> A <owner-username> je vlastníkem existující tabulky, která může udělit oprávnění ostatním. <aad-username> je uživatel vytvořený konektorem služby. Nahraďte je skutečnou hodnotou.
Pomocí příkazu ověřte výsledek:
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
Tento příkaz konektoru služby na pozadí dokončí následující úlohy:
Povolte spravovanou identitu přiřazenou systémem nebo přiřaďte identitu uživatele pro aplikaci <server-name> hostované službou Aplikace Azure Service.
Nastavte správce Microsoft Entra na aktuální přihlášeného uživatele.
Přidejte uživatele databáze pro spravovanou identitu přiřazenou systémem nebo spravovanou identitu přiřazenou uživatelem. Udělte tomuto uživateli všechna oprávnění databáze <database-name> . Uživatelské jméno najdete v připojovací řetězec v předchozím výstupu příkazu.
Nastavte konfigurace s názvem AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGnebo AZURE_SQL_CONNECTIONSTRING na prostředek Azure na základě typu databáze.
V případě služby App Service se konfigurace nastaví v okně Nastavení aplikace.
Získejte připojovací řetězec Azure SQL Database z proměnné prostředí přidané konektorem služby.
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();
Další informace najdete v tématu Použití ověřování spravované identity služby Active Directory.
Do souboru pom.xml přidejte následující závislosti:
Získejte konfigurace připojení ke službě Azure SQL Database z proměnné prostředí přidané konektorem služby. Odkomentujte část fragmentu kódu pro typ ověřování, který chcete použít.
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)
Získejte konfigurace připojení ke službě Azure SQL Database z proměnných prostředí přidaných konektorem služby. Odkomentujte část fragmentu kódu pro typ ověřování, který chcete použít.
Připojení ke službě Azure Database for MySQL ve vašem kódu se řídí vzorem DefaultAzureCredential pro všechny zásobníky jazyků. DefaultAzureCredential je dostatečně flexibilní, aby se přizpůsobila vývojovému prostředí i prostředí Azure. Při místním spuštění může načíst přihlášeného uživatele Azure z libovolného prostředí (Visual Studio, Visual Studio Code, Azure CLI nebo Azure PowerShell). Při spuštění v Azure načte spravovanou identitu. Proto je možné mít připojení k databázi v době vývoje i v produkčním prostředí. Vzor je následující:
Vytvořte instanci DefaultAzureCredential z klientské knihovny Azure Identity. Pokud používáte identitu přiřazenou uživatelem, zadejte ID klienta identity.
Získejte přístupový token pro Službu Azure Database for MySQL: https://ossrdbms-aad.database.windows.net/.default.
Pro .NET získejte přístupový token pro spravovanou identitu pomocí klientské knihovny, jako je Azure.Identity. Pak se pomocí přístupového tokenu připojte k databázi heslem. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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
Do souboru pom.xml přidejte následující závislosti:
Ověřte se pomocí přístupového tokenu azure-identity z knihovny. Získejte informace o připojení z proměnné prostředí přidané konektorem Service Connector. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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()
Získejte přístupový token pomocí @azure/identity a informace o databázi Azure MySQL z proměnných prostředí přidaných konektorem služby. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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');
});
Připojení ke službě Azure Database for PostgreSQL ve vašem kódu se řídí vzorem DefaultAzureCredential pro všechny zásobníky jazyků. DefaultAzureCredential je dostatečně flexibilní, aby se přizpůsobila vývojovému prostředí i prostředí Azure. Při místním spuštění může načíst přihlášeného uživatele Azure z libovolného prostředí (Visual Studio, Visual Studio Code, Azure CLI nebo Azure PowerShell). Při spuštění v Azure načte spravovanou identitu. Proto je možné mít připojení k databázi v době vývoje i v produkčním prostředí. Vzor je následující:
Vytvořte instanci DefaultAzureCredential z klientské knihovny Azure Identity. Pokud používáte identitu přiřazenou uživatelem, zadejte ID klienta identity.
Získejte přístupový token pro Azure Database for PostgreSQL: https://ossrdbms-aad.database.windows.net/.default.
Pro .NET získejte přístupový token pro spravovanou identitu pomocí klientské knihovny, jako je Azure.Identity. Pak se pomocí přístupového tokenu připojte k databázi heslem. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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();
}
Do souboru pom.xml přidejte následující závislosti:
Ověřte se pomocí přístupového tokenu azure-identity z knihovny a použijte token jako heslo. Získejte informace o připojení z proměnných prostředí, které přidal Service Connector. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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)
Další informace naleznete v následujících zdrojích:
V kódu získejte přístupový token prostřednictvím @azure/identity informací o připojení PostgreSQL z proměnných prostředí přidaných službou konektoru služby Service Connector. Zkombinujte je za účelem navázání připojení. Při použití následujícího kódu nezapomeňte odkomentovat část fragmentu kódu, která odpovídá typu ověřování, který chcete použít.
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();
})();
Tento ukázkový kód používá DefaultAzureCredential k získání použitelného tokenu pro databázi Azure z ID Microsoft Entra a pak ho přidá do připojení k databázi. I když můžete přizpůsobit DefaultAzureCredential, je to už ve výchozím nastavení všestranné. Získá token od přihlášeného uživatele Microsoft Entra nebo ze spravované identity v závislosti na tom, jestli ho spouštíte místně ve vývojovém prostředí nebo ve službě App Service.
Bez jakýchkoli dalších změn je váš kód připravený ke spuštění v Azure. K místnímu ladění kódu ale vaše vývojové prostředí potřebuje přihlášeného uživatele Microsoft Entra. V tomto kroku nakonfigurujete své prostředí podle vlastního výběru přihlášením pomocí uživatele Microsoft Entra.
Visual Studio pro Windows je integrované s ověřováním Microsoft Entra. Pokud chcete povolit vývoj a ladění v sadě Visual Studio, přidejte uživatele Microsoft Entra v sadě Visual Studio tak, že v nabídce vyberete Nastavení účtu souboru>a vyberete Přihlásit se nebo Přidat.
Pokud chcete nastavit uživatele Microsoft Entra pro ověřování služby Azure, v nabídce vyberte Možnosti nástrojů>a pak vyberte Výběr účtu ověřování>služby Azure. Vyberte uživatele Microsoft Entra, který jste přidali, a vyberte OK.
Visual Studio pro Mac není integrovaná s ověřováním Microsoft Entra. Klientská knihovna Azure Identity, kterou použijete později, ale může také načítat tokeny z Azure CLI. Pokud chcete povolit vývoj a ladění v sadě Visual Studio, nainstalujte Azure CLI na místní počítač.
Přihlaste se k Azure CLI pomocí následujícího příkazu pomocí uživatele Microsoft Entra:
az login --allow-no-subscriptions
Visual Studio Code je integrovaný s ověřováním Microsoft Entra prostřednictvím rozšíření Azure. Nainstalujte rozšíření Azure Tools v editoru Visual Studio Code.
V editoru Visual Studio Code na panelu aktivit vyberte logo Azure.
V Průzkumníku služby App Service vyberte Přihlásit se k Azure... a postupujte podle pokynů.
Klientská knihovna Azure Identity, kterou použijete později, může používat tokeny z Azure CLI. Pokud chcete povolit vývoj založený na příkazovém řádku, nainstalujte Azure CLI na místní počítač.
Přihlaste se k Azure pomocí následujícího příkazu pomocí uživatele Microsoft Entra:
az login --allow-no-subscriptions
Klientská knihovna Azure Identity, kterou použijete později, může používat tokeny z Azure PowerShellu. Pokud chcete povolit vývoj založený na příkazovém řádku, nainstalujte Azure PowerShell na místní počítač.
Přihlaste se k Azure CLI pomocí následující rutiny pomocí uživatele Microsoft Entra:
Teď jste připraveni vyvíjet a ladit aplikaci pomocí služby SQL Database jako back-endu pomocí ověřování Microsoft Entra.
5. Testování a publikování
Spusťte kód ve vývojovém prostředí. Váš kód používá přihlášeného uživatele Microsoft Entra ve vašem prostředí k připojení k back-endové databázi. Uživatel má přístup k databázi, protože je nakonfigurovaný jako správce Microsoft Entra pro databázi.
Publikujte svůj kód do Azure pomocí upřednostňované metody publikování. Ve službě App Service váš kód používá spravovanou identitu aplikace k připojení k back-endové databázi.
Zobrazuje se mi chyba Login failed for user '<token-identified principal>'.
Spravovaná identita, pro kterou se pokoušíte požádat o token, nemá oprávnění pro přístup k databázi Azure.
Provedl(a) jsem změny ověřování služby App Service nebo přidružené registrace aplikace. Proč stále získám starý token?
Back-endové služby spravovaných identit také udržují mezipaměť tokenů, která aktualizuje token pro cílový prostředek, pouze když vyprší jeho platnost. Pokud konfiguraci upravíte po pokusu o získání tokenu s vaší aplikací, ve skutečnosti nezískáte nový token s aktualizovanými oprávněními, dokud nevyprší platnost tokenu uloženého v mezipaměti. Nejlepší způsob, jak to obejít, je otestovat změny pomocí nového okna InPrivate (Edge)/private (Safari)/Anonymní okno (Chrome). Tímto způsobem určitě začínáte z nové ověřené relace.
Návody přidat spravovanou identitu do skupiny Microsoft Entra?
Pokud chcete, můžete přidat identitu do skupiny Microsoft Entra a pak místo identity udělit přístup ke skupině Microsoft Entra. Například následující příkazy přidají spravovanou identitu z předchozího kroku do nové skupiny 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
Pokud chcete udělit oprávnění k databázi pro skupinu Microsoft Entra, přečtěte si dokumentaci k příslušnému typu databáze.
Zobrazuje se mi chyba SSL connection is required. Please specify SSL options and retry.
Připojení k databázi Azure vyžaduje další nastavení a přesahuje rozsah tohoto kurzu. Další informace najdete na jednom z následujících odkazů:
Vytvořil(a) jsem aplikaci pomocí šablony Web App + Database a teď nemůžu nakonfigurovat připojení spravované identity s příkazy konektoru služby.
Service Connector potřebuje síťový přístup k databázi, aby mohl udělit přístup k identitě aplikace. Když vytvoříte na webu Azure Portal zabezpečenou architekturu aplikace a databáze pomocí šablony Web App + Database, architektura uzamkne síťový přístup k databázi a povolí připojení pouze z virtuální sítě. Platí to také pro Azure Cloud Shell. Cloud Shell ale můžete nasadit ve virtuální síti a pak v cloud Shellu spustit příkaz konektoru služby.
Další kroky
Naučili jste se:
Nakonfigurujte uživatele Microsoft Entra jako správce pro vaši databázi Azure.
Připojte se k databázi jako uživatel Microsoft Entra.
Nakonfigurujte spravovanou identitu přiřazenou systémem nebo přiřazenou uživatelem pro aplikaci app Service.
Udělte spravované identitě přístup k databázi.
Připojte se k databázi Azure z kódu (.NET Framework 4.8, .NET 6, Node.js, Python, Java) pomocí spravované identity.
Připojte se k databázi Azure z vývojového prostředí pomocí uživatele Microsoft Entra.