Бөлісу құралы:


Руководство по созданию бессерверного подключения к службе базы данных с помощью соединителя служб

Для доступа к службам Azure используются управляемые удостоверения без пароля. С помощью этого подхода вам не нужно вручную отслеживать секреты для управляемых удостоверений и управлять ими. Эти задачи безопасно обрабатываются Azure.

Соединитель служб включает управляемые удостоверения в службах размещения приложений, таких как Azure Spring Apps, приложение Azure Service и приложения контейнеров Azure. Соединитель служб также настраивает службы баз данных, такие как База данных Azure для PostgreSQL, База данных Azure для MySQL и База данных SQL Azure, для принятия управляемых удостоверений.

В этом учебнике используется Azure CLI для выполнения следующих задач:

  • Проверьте исходную среду с помощью Azure CLI.
  • Создайте подключение без пароля с помощью соединителя службы.
  • Используйте переменные среды или конфигурации, созданные соединителем службы, для доступа к службе базы данных.

Необходимые компоненты

Настройка среды

Учетная запись

Войдите с помощью Azure CLI.az login Если вы используете Azure Cloud Shell или уже вошли в систему, подтвердите проверку подлинности учетной записи.az account show

Установка расширения без пароля соединителя службы

Установите последнее расширение соединителя службы без пароля для Azure CLI:

az extension add --name serviceconnector-passwordless --upgrade

Примечание.

Проверьте расширение serviceconnector-passwordless версии 2.0.2 или более поздней.az version Чтобы обновить версию расширения, может потребоваться сначала обновить Azure CLI.

Создание подключения без пароля

Далее мы используем службу приложение Azure в качестве примера для создания подключения с помощью управляемого удостоверения.

Если вы используете:

Примечание.

Если вы используете портал Azure, перейдите в колонку соединителя служб приложение Azure, Azure Spring Apps или приложения контейнеров Azure и выберите "Создать", чтобы создать подключение. Портал Azure автоматически создадут команду и активируют выполнение команды в Cloud Shell.

Следующая команда Azure CLI использует --client-type параметр, он может быть java, dotnet, python и т. д. Запустите az webapp connection create postgres-flexible -h файл, чтобы получить поддерживаемые типы клиентов, и выбрать тот, который соответствует приложению.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

База данных Azure для MySQL . Гибкий сервер требует управляемого удостоверения, назначаемого пользователем, для включения проверки подлинности Microsoft Entra. Дополнительные сведения см. в статье Настройка проверки подлинности Microsoft Entra для База данных Azure для MySQL — гибкий сервер. Для создания управляемого удостоверения, назначаемого пользователем, можно использовать следующую команду:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Внимание

После создания управляемого удостоверения, назначаемого пользователем, попросите глобального администратора или администратора привилегированных ролей предоставить следующие разрешения для этого удостоверения:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Дополнительные сведения см. в разделе "Разрешения" проверки подлинности Active Directory.

Затем подключите приложение к базе данных MySQL с помощью управляемого удостоверения, назначаемого системой, с помощью соединителя службы.

Следующая команда Azure CLI использует --client-type параметр. az webapp connection create mysql-flexible -h Запустите файл, чтобы получить поддерживаемые типы клиентов и выберите тот, который соответствует приложению.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

Следующая команда Azure CLI использует --client-type параметр. az webapp connection create sql -h Запустите файл, чтобы получить поддерживаемые типы клиентов и выберите тот, который соответствует приложению.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Эта команда Соединителя служб выполняет следующие задачи в фоновом режиме:

  • Включите управляемое удостоверение, назначаемое системой, или назначьте удостоверение пользователя для приложения$APPSERVICE_NAME, размещенного приложение Azure Service/Azure Spring Apps/Azure Container Apps.
  • Включите проверку подлинности Microsoft Entra для сервера базы данных, если она не включена раньше.
  • Задайте администратору Microsoft Entra текущий пользователь, выполнившего вход.
  • Добавьте пользователя базы данных для управляемого удостоверения, назначаемого системой, назначаемого пользователем управляемого удостоверения или субъекта-службы. Предоставьте этому пользователю все права доступа к базе данных $DATABASE_NAME . Имя пользователя можно найти в строка подключения в предыдущих выходных данных команды.
  • Задайте конфигурации с именем AZURE_MYSQL_CONNECTIONSTRINGили AZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_SQL_CONNECTIONSTRING ресурсом Azure на основе типа базы данных.
    • Для Служба приложений конфигурации задаются в колонке "Параметры приложения".
    • Для Spring Apps конфигурации задаются при запуске приложения.
    • Для контейнерных приложений конфигурации задаются переменными среды. Все конфигурации и их значения можно получить в колонке "Соединитель службы" в портал Azure.

Соединитель служб назначит пользователю следующие привилегии, вы можете отозвать их и настроить привилегии на основе ваших требований.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

Подключение к базе данных с помощью проверки подлинности Microsoft Entra

После создания подключения можно использовать строка подключения в приложении для подключения к базе данных с проверкой подлинности Microsoft Entra. Например, можно использовать следующие решения для подключения к базе данных с проверкой подлинности Microsoft Entra.

Для .NET нет подключаемого модуля или библиотеки для поддержки подключений без пароля. Маркер доступа для управляемого удостоверения или субъекта-службы можно получить с помощью клиентской библиотеки, такой как Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 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();
}

Затем, если вы создали таблицы и последовательности в гибком сервере 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

Для .NET нет подключаемого модуля или библиотеки для поддержки подключений без пароля. Маркер доступа для управляемого удостоверения или субъекта-службы можно получить с помощью клиентской библиотеки, такой как Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

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" из Служба приложений без секретов с помощью управляемого удостоверения.

  1. Установите зависимости.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Получите База данных SQL Azure строка подключения из переменной среды, добавленной соединителем службы.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Дополнительные сведения см. в разделе "Использование проверки подлинности управляемого удостоверения Active Directory".

Дополнительные сведения см . на домашней странице клиентского программирования в Microsoft SQL Server.

Развертывание приложения в службе размещения Azure

Наконец, разверните приложение в службе размещения Azure. Эта исходная служба может использовать управляемое удостоверение для подключения к целевой базе данных в Azure.

Сведения о службе приложение Azure можно проверить, чтобы выбрать способ развертывания, см. в кратком руководстве по развертыванию веб-приложения ASP.NET.

Затем вы можете проверить журнал или вызвать приложение, чтобы узнать, может ли он подключиться к базе данных Azure успешно.

Устранение неполадок

Разрешение

Если возникают ошибки, связанные с разрешениями, убедитесь, что пользователь Azure CLI вошел в систему с помощью команды az account show. Убедитесь, что вы войдите с помощью правильной учетной записи. Затем убедитесь, что у вас есть следующие разрешения, которые могут потребоваться для создания бессерверного подключения к соединителю службы.

Разрешение Операция
Microsoft.DBforPostgreSQL/flexibleServers/read Требуется для получения сведений о сервере базы данных
Microsoft.DBforPostgreSQL/flexibleServers/write Требуется для включения проверки подлинности Microsoft Entra для сервера базы данных
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Требуется для создания правила брандмауэра в случае блокировки локального IP-адреса
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Требуется для восстановления правила брандмауэра, созданного соединителем службы, чтобы избежать проблем безопасности
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Требуется проверить, является ли пользователь входа Azure CLI администратором Microsoft Entra сервера базы данных
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Требуется, чтобы добавить пользователя входа Azure CLI в качестве администратора сервера базы данных Microsoft Entra
Разрешение Операция
Microsoft.DBforMySQL/flexibleServers/read Требуется для получения сведений о сервере базы данных
Microsoft.DBforMySQL/flexibleServers/write Требуется для добавления предоставленного управляемого удостоверения, назначаемого пользователем, на сервер базы данных
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Требуется для создания правила брандмауэра в случае блокировки локального IP-адреса
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Требуется для восстановления правила брандмауэра, созданного соединителем службы, чтобы избежать проблем безопасности
Microsoft.DBforMySQL/flexibleServers/administrators/read Требуется проверить, является ли пользователь входа Azure CLI администратором Microsoft Entra сервера базы данных
Microsoft.DBforMySQL/flexibleServers/administrators/write Требуется, чтобы добавить пользователя входа Azure CLI в качестве администратора сервера базы данных Microsoft Entra
Разрешение Операция
Microsoft.Sql/servers/read Требуется для получения сведений о сервере базы данных
Microsoft.Sql/servers/firewallRules/write Требуется для создания правила брандмауэра в случае блокировки локального IP-адреса
Microsoft.Sql/servers/firewallRules/delete Требуется для восстановления правила брандмауэра, созданного соединителем службы, чтобы избежать проблем безопасности
Microsoft.Sql/servers/administrators/read Требуется проверить, является ли пользователь входа Azure CLI администратором Microsoft Entra сервера базы данных
Microsoft.Sql/servers/administrators/write Требуется, чтобы добавить пользователя входа Azure CLI в качестве администратора сервера базы данных Microsoft Entra

В некоторых случаях разрешения не требуются. Например, если пользователь, прошедший проверку подлинности Azure CLI, уже является администратором Active Directory на СЕРВЕРе SQL Server, у вас нет Microsoft.Sql/servers/administrators/write разрешения.

Microsoft Entra ID

Если возникает ошибка ERROR: AADSTS530003: Your device is required to be managed to access this resource., обратитесь к ИТ-отделу за помощью при присоединении этого устройства к идентификатору Microsoft Entra. Дополнительные сведения см. в разделе "Присоединенные к Microsoft Entra устройства".

Соединитель служб должен получить доступ к идентификатору Microsoft Entra, чтобы получить сведения о вашей учетной записи и управляемом удостоверении службы размещения. Чтобы проверить, может ли устройство получить доступ к идентификатору Microsoft Entra, можно использовать следующую команду:

az ad signed-in-user show

Если вы не входите в систему в интерактивном режиме, вы также можете получить ошибку и Interactive authentication is needed. Чтобы устранить ошибку, войдите в систему с помощью az login команды.

Сетевое соединение

Если сервер базы данных находится в виртуальная сеть, убедитесь, что среда, в которой выполняется команда Azure CLI, может получить доступ к серверу в виртуальная сеть.

Если сервер базы данных находится в виртуальная сеть, убедитесь, что среда, в которой выполняется команда Azure CLI, может получить доступ к серверу в виртуальная сеть.

Если сервер базы данных запрещает общедоступный доступ, убедитесь, что среда, которая выполняет команду Azure CLI, может получить доступ к серверу через частную конечную точку.

Следующие шаги

Дополнительные сведения о соединителе службы и бессерверных подключениях см. в следующих ресурсах: