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


Подключение к Базе данных Azure для MySQL с помощью управляемого удостоверения

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — отдельный сервер

Внимание

База данных Azure для MySQL один сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для MySQL гибкого сервера. Дополнительные сведения о миграции на гибкий сервер База данных Azure для MySQL см. в статье "Что происходит с одним сервером База данных Azure для MySQL?"

В этой статье показано, как использовать назначаемое пользователем удостоверение для виртуальной машины Azure в целях доступа к серверу базы данных Azure для MySQL. Управляемые удостоверения служб автоматически управляются Azure и позволяют выполнять проверку подлинности в службах, поддерживающих проверку подлинности Microsoft Entra, без необходимости вставлять учетные данные в код.

Узнайте следующие темы:

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

Внимание

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

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

Создание управляемого удостоверения, назначаемого пользователем, для виртуальной машины

Создайте в подписке удостоверение, используя команду az identity create. Вы можете использовать ту же группу ресурсов, в которой работает ваша виртуальная машина, или другую.

az identity create --resource-group myResourceGroup --name myManagedIdentity

Чтобы настроить удостоверение на следующих шагах, выполните команду az identity show для сохранения идентификаторов ресурса и клиента удостоверения в переменных.

# Get resource ID of the user-assigned identity

RESOURCE_ID=$(az identity show --resource-group myResourceGroup --name myManagedIdentity --query id --output tsv)

# Get client ID of the user-assigned identity


CLIENT_ID=$(az identity show --resource-group myResourceGroup --name myManagedIdentity --query clientId --output tsv)

Теперь можно назначить виртуальной машине удостоверение, назначаемое пользователем, с помощью команды az vm identity assign:

az vm identity assign --resource-group myResourceGroup --name myVM --identities $RESOURCE_ID

Чтобы завершить установку, отобразите значение идентификатора клиента, которое потребуется в следующих шагах:

echo $CLIENT_ID

Создание пользователя MySQL для управляемого удостоверения

Теперь подключитесь к базе данных MySQL от имени администратора Microsoft Entra и выполните следующие инструкции SQL:

SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER 'myuser' IDENTIFIED BY 'CLIENT_ID';

Теперь управляемое удостоверение имеет доступ при проверке подлинности с помощью имени пользователя myuser (замените другим именем по своему усмотрению).

Получение маркера доступа из Службы метаданных экземпляров Azure

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

Получение маркера осуществляется посредством отправки HTTP-запроса на адрес http://169.254.169.254/metadata/identity/oauth2/token и передачи следующих параметров:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (получено ранее)

В результате вы получите JSON с полем access_token — это длинное текстовое значение является маркером доступа управляемого удостоверения, который следует использовать в качестве пароля при подключении к базе данных.

В целях проверки можно выполнить в оболочке приведенные ниже команды. Обратите внимание, что требуется curl, jq и установленный клиент mysql.

# Retrieve the access token


ACCESS_TOKEN=$(curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token)

# Connect to the database


mysql -h SERVER --user USER@SERVER --enable-cleartext-plugin --password=$accessToken

Теперь вы подключены к настроенной ранее базе данных.

Подключение с использованием управляемого удостоверения в C#

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

Ниже приведен пример кода .NET для установки подключения к MySQL с помощью маркера доступа. Этот код должен выполняться на виртуальной машине, чтобы получить доступ к конечной точке назначаемого пользователем управляемого удостоверения виртуальной машины. Для использования метода с маркером доступа требуется .NET Framework 4.6 или более поздней версии либо .NET Core 2.2 или более поздней версии. Замените значения HOST, USER, DATABASE и CLIENT_ID.

using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace Driver
{
    class Script
    {
        // Obtain connection string information from the portal
        //
        private static string Host = "HOST";
        private static string User = "USER";
        private static string Database = "DATABASE";
        private static string ClientId = "CLIENT_ID";

        static async Task Main(string[] args)
        {
            //
            // Get an access token for MySQL.
            //
            Console.Out.WriteLine("Getting access token from Azure Instance Metadata service...");

            // Azure AD resource ID for Azure Database for MySQL is https://ossrdbms-aad.database.windows.net/
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=" + ClientId);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";
            string accessToken = null;

            try
            {
                // Call managed identities for Azure resources endpoint.
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader and extract access token.
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                var list = JsonSerializer.Deserialize<Dictionary<string, string>>(stringResponse);
                accessToken = list["access_token"];
            }
            catch (Exception e)
            {
                Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                System.Environment.Exit(1);
            }

            //
            // Open a connection to the MySQL server using the access token.
            //
            var builder = new MySqlConnectionStringBuilder
            {
                Server = Host,
                Database = Database,
                UserID = User,
                Password = accessToken,
                SslMode = MySqlSslMode.Required,
            };

            using (var conn = new MySqlConnection(builder.ConnectionString))
            {
                Console.Out.WriteLine("Opening connection using access token...");
                await conn.OpenAsync();

                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT VERSION()";

                    using (var reader = await command.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            Console.WriteLine("\nConnected!\n\nMySQL version: {0}", reader.GetString(0));
                        }
                    }
                }
            }
        }
    }
}

При выполнении эта команда выдает следующий результат:

Getting access token from Azure Instance Metadata service...
Opening connection using access token...

Connected!

MySQL version: 5.7.27

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