Подключение к Базе данных 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 и более новых версий.
Необходимые компоненты
- См. дополнительные сведения об управляемых удостоверениях для ресурсов Azure. Если у вас нет учетной записи Azure, зарегистрируйтесь для получения бесплатной учетной записи, прежде чем продолжить.
- Для выполнения требуемых операций создания ресурсов и управления ролями учетной записи нужно предоставить разрешения роли "Владелец" в соответствующей области (подписка или группа ресурсов). Если нуждаетесь в помощи с назначением ролей, прочитайте статью Назначение ролей Azure с помощью портала Azure.
- Вам потребуется виртуальная машина Azure (например, на базе Ubuntu Linux), которую вы хотите использовать для доступа к базе данных с помощью управляемого удостоверения.
- Вам нужен сервер базы данных База данных Azure для MySQL с настроенной проверкой подлинности Microsoft Entra
- Для выполнения примера C# сначала завершите руководство по подключению к C#
Создание управляемого удостоверения, назначаемого пользователем, для виртуальной машины
Создайте в подписке удостоверение, используя команду 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
Следующие шаги
- Ознакомьтесь с общими понятиями проверки подлинности Microsoft Entra с помощью База данных Azure для MySQL