Учебник. Подключение к базам данных Azure из Службы приложений без секретов с помощью управляемого удостоверения
Статья
Служба приложений — это служба веб-размещения с самостоятельной установкой исправлений и высоким уровнем масштабируемости в Azure. Она также предоставляет управляемое удостоверение для вашего приложения, которое является готовым решением для защиты доступа к базам данных Azure:
Управляемые удостоверения в службе приложений делают ваше приложение более безопасным, устраняя из него секреты, такие как учетные данные в строках подключения. В этом руководстве показано, как подключиться к указанным выше базам данных из Службы приложений с помощью управляемых удостоверений.
Освещаются следующие темы:
Настройте пользователя Microsoft Entra в качестве администратора для базы данных Azure.
Подключитесь к базе данных как пользователь Microsoft Entra.
Настройка управляемого удостоверения, назначаемого системой или пользователем, для приложения Службы приложений.
Предоставление управляемому удостоверению доступа к базе данных.
Подключение к базе данных Azure из кода (.NET Framework 4.8, .NET 6, Node.js, Python, Java) с помощью управляемого удостоверения.
Подключитесь к базе данных Azure из среды разработки с помощью пользователя Microsoft Entra.
Создайте приложение в Службе приложений на основе .NET, Node.js, Python или Java.
Создайте сервер базы данных с Базой данных SQL Azure, Базой данных Azure для MySQL или Базой данных Azure для PostgreSQL.
Вы должны быть знакомы со стандартным шаблоном подключения (с именем пользователя и паролем) и иметь возможность успешно подключиться из приложения Службы приложений к выбранной базе данных.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
1. Установка расширения без пароля соединителя службы
Установите последнее расширение соединителя службы без пароля для Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Примечание.
Проверьте расширение serviceconnector-passwordless версии 2.0.2 или более поздней.az version Чтобы обновить версию расширения, может потребоваться сначала обновить Azure CLI.
2. Создание подключения без пароля
Затем создайте бессерверное подключение к соединителю службы.
Совет
Портал Azure поможет вам выполнить приведенные ниже команды. В портал Azure перейдите к ресурсу службы приложение Azure, выберите "Соединитель службы" в меню слева и нажмите кнопку "Создать". Заполните форму всеми необходимыми параметрами. Azure автоматически создает команду создания подключения, которую можно скопировать в ИНТЕРФЕЙС командной строки или выполнить в Azure Cloud Shell.
Для База данных Azure для MySQL — гибкий сервер необходимо сначала вручную настроить проверку подлинности Microsoft Entra, для которой требуется отдельное управляемое удостоверение, назначаемое пользователем, и определенные разрешения Microsoft Graph. Этот шаг не может быть автоматизирован.
Предоставление разрешения предварительно созданным таблицам
Затем, если вы создали таблицы и последовательности в гибком сервере PostgreSQL перед использованием соединителя служб, необходимо подключиться как владелец и предоставить разрешение, созданное <aad-username> соединителем службы. Имя пользователя из строка подключения или конфигурации, заданное соединителем службы, должно выглядеть следующим образомaad_<connection name>. Если вы используете портал Azure, нажмите кнопку развертывания рядом с столбцом Service Type и получите значение. Если вы используете Azure CLI, проверьте configurations выходные данные команды CLI.
Затем выполните запрос, чтобы предоставить разрешение
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-username><owner-password> является владельцем существующей таблицы, которая может предоставлять разрешения другим пользователям. <aad-username> — это пользователь, созданный с помощью соединителя службы. Замените их фактическим значением.
Проверьте результат с помощью команды:
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
Эта команда Соединителя служб выполняет следующие задачи в фоновом режиме:
Включите управляемое удостоверение, назначаемое системой, или назначьте удостоверение пользователя для приложения<server-name>, размещенного службой приложение Azure.
Задайте администратору Microsoft Entra текущий пользователь, выполнившего вход.
Добавьте пользователя базы данных для управляемого удостоверения, назначаемого системой, или управляемого удостоверения, назначаемого пользователем. Предоставьте этому пользователю все права доступа к базе данных <database-name> . Имя пользователя можно найти в строка подключения в предыдущих выходных данных команды.
Задайте конфигурации с именем AZURE_MYSQL_CONNECTIONSTRINGили AZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_SQL_CONNECTIONSTRING ресурсом Azure на основе типа базы данных.
Для Служба приложений конфигурации задаются в колонке "Параметры приложения".
Если при создании подключения возникла проблема, обратитесь к справке по устранению неполадок.
Получите База данных SQL Azure строка подключения из переменной среды, добавленной соединителем службы.
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();
Получите конфигурации подключения База данных SQL Azure из переменной среды, добавленной соединителем службы. Раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
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)
Получите конфигурации подключения База данных SQL Azure из переменных среды, добавленных соединителем службы. Раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
Подключение к База данных Azure для MySQL в коде следует шаблону DefaultAzureCredential для всех стеков языков. DefaultAzureCredential отличается достаточной гибкостью, чтобы адаптироваться как к среде разработки, так и к среде Azure. При локальном запуске пользователь Azure может получить вошедшего в систему пользователя Azure из выбранной среды (Visual Studio, Visual Studio Code, Azure CLI или Azure PowerShell). При запуске в Azure извлекается управляемое удостоверение. Таким образом, можно подключиться к базе данных как во время разработки, так и в рабочей среде. Шаблон выглядит следующим образом.
Создайте экземпляр DefaultAzureCredential из клиентской библиотеки удостоверений Azure. Если вы используете удостоверение, назначаемое пользователем, укажите идентификатор клиента удостоверения.
Получение маркера доступа для База данных Azure для MySQL: https://ossrdbms-aad.database.windows.net/.default
Для .NET получите маркер доступа для управляемого удостоверения с помощью клиентской библиотеки, такой как Azure.Identity. Затем используйте маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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
Проверка подлинности с помощью маркера доступа из библиотеки azure-identity . Получение сведений о подключении из переменной среды, добавленной соединителем службы. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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()
Получение маркера доступа с помощью @azure/identity и сведений о базе данных Azure MySQL из переменных среды, добавленных соединителем службы. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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');
});
Подключение к База данных Azure для PostgreSQL в коде следует шаблону DefaultAzureCredential для всех стеков языков. DefaultAzureCredential отличается достаточной гибкостью, чтобы адаптироваться как к среде разработки, так и к среде Azure. При локальном запуске пользователь Azure может получить вошедшего в систему пользователя Azure из выбранной среды (Visual Studio, Visual Studio Code, Azure CLI или Azure PowerShell). При запуске в Azure извлекается управляемое удостоверение. Таким образом, можно подключиться к базе данных как во время разработки, так и в рабочей среде. Шаблон выглядит следующим образом.
Создайте экземпляр DefaultAzureCredential из клиентской библиотеки удостоверений Azure. Если вы используете удостоверение, назначаемое пользователем, укажите идентификатор клиента удостоверения.
Получение маркера доступа для База данных Azure для PostgreSQL: https://ossrdbms-aad.database.windows.net/.default
Для .NET получите маркер доступа для управляемого удостоверения с помощью клиентской библиотеки, такой как Azure.Identity. Затем используйте маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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();
}
Проверка подлинности с помощью маркера доступа из библиотеки azure-identity и использование маркера в качестве пароля. Получение сведений о подключении из переменных среды, добавленных соединителем службы. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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)
Дополнительные сведения см. на следующих ресурсах:
В коде получите маркер доступа с помощью @azure/identity сведений о подключении PostgreSQL из переменных среды, добавленных службой Service Connector. Объедините их для установления соединения. При использовании приведенного ниже кода убедитесь, что вы раскомментируйте часть фрагмента кода, соответствующего типу проверки подлинности, который вы хотите использовать.
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();
})();
Этот пример кода используется DefaultAzureCredential для получения используемого маркера для базы данных Azure из идентификатора Microsoft Entra ID, а затем добавляет его в подключение к базе данных. Хотя вы можете настроить DefaultAzureCredential, по умолчанию он уже является универсальным. Он получает маркер от вошедшего пользователя Microsoft Entra или управляемого удостоверения в зависимости от того, выполняете ли он локально в среде разработки или в Служба приложений.
Код готов к запуску в Azure без дальнейших изменений. Однако для локальной отладки кода в среде разработки требуется пользователь Microsoft Entra, выполнившего вход. На этом шаге вы настраиваете среду, выполнив вход с помощью пользователя Microsoft Entra.
Visual Studio для Windows интегрирован с проверкой подлинности Microsoft Entra. Чтобы включить разработку и отладку в Visual Studio, добавьте пользователя Microsoft Entra в Visual Studio, выбрав пункт "Параметры учетной записи файла>" в меню, а затем нажмите кнопку "Войти" или "Добавить".
Чтобы задать пользователя Microsoft Entra для проверки подлинности службы Azure, выберите "Параметры инструментов>" в меню, а затем выберите пункт "Учетная запись проверки подлинности>службы Azure". Выберите добавленного пользователя Microsoft Entra и нажмите кнопку "ОК".
Visual Studio для Mac не интегрирована с проверкой подлинности Microsoft Entra. Однако клиентская библиотека удостоверений Azure, которая будет использоваться позже, также может извлекать маркеры из Azure CLI. Чтобы включить разработку и отладку в Visual Studio, необходимо установить Azure CLI на локальном компьютере.
Войдите в Azure CLI с помощью следующей команды с помощью пользователя Microsoft Entra:
az login --allow-no-subscriptions
Visual Studio Code интегрирован с проверкой подлинности Microsoft Entra через расширение Azure. Установите расширение Azure Tools в Visual Studio Code.
В Visual Studio Code на панели действий щелкните значок Azure.
В обозревателе Службы приложений выберите Войти в Azure... и следуйте инструкциям.
Клиентская библиотека удостоверений Azure, которая будет использоваться позже, может использовать маркеры из Azure CLI. Чтобы включить разработку на основе командной строки, установите Azure CLI на локальном компьютере.
Войдите в Azure с помощью следующей команды с помощью пользователя Microsoft Entra:
az login --allow-no-subscriptions
Клиентская библиотека удостоверений Azure, которая будет использоваться позже, может использовать маркеры из Azure PowerShell. Чтобы включить разработку на основе командной строки, установите Azure PowerShell на локальном компьютере.
Войдите в Azure CLI с помощью следующего командлета с помощью пользователя Microsoft Entra:
Теперь вы готовы разрабатывать и отлаживать приложение с помощью База данных SQL в качестве серверной части с помощью проверки подлинности Microsoft Entra.
5. Тестирование и публикация
Запустите код в среде разработки. Код использует вошедшего пользователя Microsoft Entra в вашей среде для подключения к внутренней базе данных. Пользователь может получить доступ к базе данных, так как он настроен как администратор Microsoft Entra для базы данных.
Опубликуйте код в Azure с помощью предпочтительного метода публикации. В Службе приложений код использует управляемое удостоверение приложения для подключения к внутренней базе данных.
Возникает ошибка Login failed for user '<token-identified principal>'.
Управляемое удостоверение, для которого вы пытаетесь запросить маркер, не авторизовано для доступа к базе данных Azure.
Я внес изменения в проверку подлинности Службы приложений или связанную регистрацию приложения. Почему я все равно получаю старый маркер?
Серверные службы управляемых удостоверений также поддерживают кэш маркеров, который обновляет маркер целевого ресурса только по истечении срока его действия. Если вы измените конфигурацию после попытки получить маркер в приложении, вы получите новый маркер с обновленными разрешениями только после того, как истечет срок действия кэшированного маркера. Лучшее обходное решение — проверить изменения с помощью нового окна в режиме InPrivate (Edge)/частный (Safari)/инкогнито (Chrome). Таким образом вы точно начнете работу с нового сеанса, прошедшего проверку подлинности.
Разделы справки добавить управляемое удостоверение в группу Microsoft Entra?
Если вы хотите, вы можете добавить удостоверение в группу Microsoft Entra, а затем предоставить доступ к группе Microsoft Entra вместо удостоверения. Например, следующие команды добавляют управляемое удостоверение из предыдущего шага в новую группу с именем 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
Чтобы предоставить разрешения базы данных для группы Microsoft Entra, ознакомьтесь с документацией по соответствующему типу базы данных.
Возникает ошибка SSL connection is required. Please specify SSL options and retry.
Подключение к базе данных Azure требует дополнительных параметров и выходит за рамки этого руководства. Дополнительные сведения см. в одном из следующих разделов:
Я создал приложение с помощью шаблона веб-приложения и базы данных, и теперь я не могу настроить подключение к управляемому удостоверению с помощью команд Service Connector.
Соединитель служб нуждается в сетевом доступе к базе данных для предоставления доступа к удостоверению приложения. При создании защищенного приложения и архитектуры базы данных по умолчанию в портал Azure с помощью шаблона веб-приложения и базы данных архитектура блокирует сетевой доступ к базе данных и разрешает подключения только из виртуальной сети. Это также верно для Azure Cloud Shell. Однако вы можете развернуть Cloud Shell в виртуальной сети, а затем запустить команду Service Connector в этой Cloud Shell.
Следующие шаги
Вы научились выполнять следующие задачи:
Настройте пользователя Microsoft Entra в качестве администратора для базы данных Azure.
Подключитесь к базе данных как пользователь Microsoft Entra.
Настройка управляемого удостоверения, назначаемого системой или пользователем, для приложения Службы приложений.
Предоставление управляемому удостоверению доступа к базе данных.
Подключение к базе данных Azure из кода (.NET Framework 4.8, .NET 6, Node.js, Python, Java) с помощью управляемого удостоверения.
Подключитесь к базе данных Azure из среды разработки с помощью пользователя Microsoft Entra.