Udostępnij za pośrednictwem


Nawiązywanie połączenia za pomocą tożsamości zarządzanej z usługą Azure Database for MySQL

DOTYCZY: Azure Database for MySQL — pojedynczy serwer

Ważne

Pojedynczy serwer usługi Azure Database for MySQL znajduje się na ścieżce wycofania. Zdecydowanie zalecamy uaktualnienie do serwera elastycznego usługi Azure Database for MySQL. Aby uzyskać więcej informacji na temat migracji do serwera elastycznego usługi Azure Database for MySQL, zobacz Co się dzieje z usługą Azure Database for MySQL — pojedynczy serwer?

W tym artykule pokazano, jak używać tożsamości przypisanej przez użytkownika dla maszyny wirtualnej platformy Azure w celu uzyskania dostępu do serwera usługi Azure Database for MySQL. Tożsamości usługi zarządzanej są automatycznie zarządzane przez platformę Azure i umożliwiają uwierzytelnianie w usługach obsługujących uwierzytelnianie firmy Microsoft Entra bez konieczności wstawiania poświadczeń do kodu.

Dowiedz się, jak odbywa się:

  • Udzielanie maszynie wirtualnej dostępu do serwera usługi Azure Database for MySQL
  • Tworzenie użytkownika w bazie danych, który reprezentuje tożsamość przypisaną przez użytkownika maszyny wirtualnej
  • Uzyskiwanie tokenu dostępu przy użyciu tożsamości maszyny wirtualnej i używanie go do wykonywania zapytań względem serwera usługi Azure Database for MySQL
  • Implementowanie pobierania tokenu w przykładowej aplikacji w języku C#

Ważne

Nawiązywanie połączenia z tożsamością zarządzaną jest dostępne tylko dla programu MySQL 5.7 i nowszych.

Wymagania wstępne

  • Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zobacz to omówienie. Jeśli nie masz jeszcze konta platformy Azure, przed kontynuowaniem utwórz bezpłatne konto.
  • Aby wykonać wymagane tworzenie zasobów i zarządzanie rolami, twoje konto musi mieć uprawnienia "Właściciel" w odpowiednim zakresie (subskrypcja lub grupa zasobów). Jeśli potrzebujesz pomocy dotyczącej przypisywania ról, zobacz Przypisywanie ról platformy Azure w celu zarządzania dostępem do zasobów subskrypcji platformy Azure.
  • Potrzebna jest maszyna wirtualna platformy Azure (na przykład z systemem Ubuntu Linux), której chcesz użyć do uzyskiwania dostępu do bazy danych przy użyciu tożsamości zarządzanej
  • Potrzebny jest serwer bazy danych usługi Azure Database for MySQL ze skonfigurowanym uwierzytelnianiem firmy Microsoft Entra
  • Aby postępować zgodnie z przykładem języka C#, najpierw ukończ przewodnik dotyczący nawiązywania połączenia przy użyciu języka C#

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika dla maszyny wirtualnej

Utwórz tożsamość w subskrypcji przy użyciu polecenia az identity create . Możesz użyć tej samej grupy zasobów, w której działa maszyna wirtualna, lub innej.

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

Aby skonfigurować tożsamość w poniższych krokach, użyj polecenia az identity show , aby zapisać identyfikator zasobu tożsamości i identyfikator klienta w zmiennych.

# 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)

Teraz możemy przypisać tożsamość przypisaną przez użytkownika do maszyny wirtualnej za pomocą polecenia az vm identity assign :

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

Aby zakończyć instalację, pokaż wartość identyfikatora klienta, która będzie potrzebna w następnych kilku krokach:

echo $CLIENT_ID

Tworzenie użytkownika mySQL dla tożsamości zarządzanej

Teraz połącz się jako użytkownik administratora firmy Microsoft Entra z bazą danych MySQL i uruchom następujące instrukcje SQL:

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

Tożsamość zarządzana ma teraz dostęp podczas uwierzytelniania przy użyciu nazwy użytkownika myuser (zastąp wybraną nazwą).

Pobieranie tokenu dostępu z usługi Azure Instance Metadata Service

Aplikacja może teraz pobrać token dostępu z usługi Azure Instance Metadata i używać go do uwierzytelniania w bazie danych.

To pobieranie tokenu odbywa się przez utworzenie żądania HTTP do http://169.254.169.254/metadata/identity/oauth2/token i przekazanie następujących parametrów:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (które pobrano wcześniej)

Otrzymasz wynik JSON zawierający access_token pole — ta długa wartość tekstowa to token dostępu tożsamości zarządzanej, którego należy użyć jako hasła podczas nawiązywania połączenia z bazą danych.

Na potrzeby testowania możesz uruchomić następujące polecenia w powłoce. Należy pamiętać, że konieczne curljest zainstalowanie programu , jqi mysql klienta.

# 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

Masz teraz połączenie ze skonfigurowaną wcześniej bazą danych.

Nawiązywanie połączenia przy użyciu tożsamości zarządzanej w języku C#

W tej sekcji pokazano, jak uzyskać token dostępu przy użyciu przypisanej przez użytkownika tożsamości zarządzanej maszyny wirtualnej i użyć go do wywołania usługi Azure Database for MySQL. Usługa Azure Database for MySQL natywnie obsługuje uwierzytelnianie firmy Microsoft Entra, dzięki czemu może bezpośrednio akceptować tokeny dostępu uzyskane przy użyciu tożsamości zarządzanych dla zasobów platformy Azure. Podczas tworzenia połączenia z bazą danych MySQL przekazujesz token dostępu w polu hasła.

Oto przykładowy kod platformy .NET podczas otwierania połączenia z bazą danych MySQL przy użyciu tokenu dostępu. Ten kod musi zostać uruchomiony na maszynie wirtualnej, aby uzyskać dostęp do punktu końcowego tożsamości zarządzanej przypisanej przez użytkownika maszyny wirtualnej. Do korzystania z metody tokenu dostępu wymagany jest program .NET Framework 4.6 lub nowszy lub .NET Core 2.2 lub nowszy. Zastąp wartości HOST, USER, DATABASE i 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));
                        }
                    }
                }
            }
        }
    }
}

Po uruchomieniu to polecenie da dane wyjściowe w następujący sposób:

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

Connected!

MySQL version: 5.7.27

Następne kroki