Поделиться через


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

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

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

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

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

Предварительные условия

Чтобы начать использование Azure CLI, выполните следующие действия.

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в руководстве по быстрому началу работы с Bash в Azure Cloud Shell.

  • Если вы предпочитаете запускать справочные команды 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.

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

Установите безпарольное расширение последней версии коннектора сервиса для Azure CLI.

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

Примечание.

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

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

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

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

Примечание.

Если вы используете портал Azure, перейдите в область Service Connector службы Azure App Service, Azure Spring Apps или Azure Container Apps, и выберите Создать, чтобы создать подключение. Портал 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 - Flexible Server требует пользовательского управляющего удостоверения для включения аутентификации Microsoft Entra. Дополнительные сведения см. в статье Настройка проверки подлинности Microsoft Entra для гибкого сервера базы данных Azure для MySQL. Для создания управляемого удостоверения, назначаемого пользователем, можно использовать следующую команду:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGED_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_CONNECTIONSTRING или AZURE_SQL_CONNECTIONSTRING для ресурса Azure на основе типа базы данных.
    • Для App Service конфигурации задаются на вкладке "Параметры приложения".
    • Для Spring Apps конфигурации задаются при запуске приложения.
    • Для контейнерных приложений конфигурации задаются переменными среды. Все конфигурации и их значения можно получить на вкладке Service Connector в портале 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 из App Service без использования секретов с помощью управляемого удостоверения.

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

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

    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

  1. Разверните приложение в службе размещения Azure. Дополнительные сведения о развертывании этих ресурсов см. в приведенных ниже руководствах.

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

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

Разрешения

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

Разрешение Операция
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 ID, чтобы извлечь информацию из вашей учетной записи и управляемого удостоверения хостинговой службы. Чтобы проверить, может ли устройство получить доступ к идентификатору Microsoft Entra, можно использовать следующую команду:

az ad signed-in-user show

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

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

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

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

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

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

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