Herstellen einer Verbindung zu Azure Database for MySQL mithilfe von verwalteten Identitäten

GILT FÜR: Azure-Datenbank für MySQL - Single Server

Wichtig

Azure Database for MySQL Single Server wird eingestellt. Es wird dringend empfohlen, ein Upgrade auf Azure Database for MySQL Flexible Server auszuführen. Weitere Informationen zum Migrieren zu Azure Database for MySQL Flexible Server finden Sie unter Was geschieht mit Azure Database for MySQL Single Server?

In diesem Artikel erfahren Sie, wie Sie mit einer benutzerseitig zugewiesenen Identität eines virtuellen Windows-Computers (Virtual Machine, VM) auf einen Azure Database for MySQL-Server zugreifen. Verwaltete Dienstidentitäten werden von Azure automatisch verwaltet und ermöglichen Ihnen die Authentifizierung für Dienste, die die Microsoft Entra-Authentifizierung unterstützen, ohne dass Sie Anmeldeinformationen in Ihren Code einfügen müssen.

Folgendes wird vermittelt:

  • Erteilen des VM-Zugriffs auf einen Azure Database for MySQL-Server
  • Erstellen eines Benutzers in der Datenbank, der die benutzerseitig zugewiesene Identität der VM darstellt
  • Abrufen eines Zugriffstokens mithilfe der VM-Identität und Abfragen Azure Database for MySQL-Servers mithilfe dieses Tokens
  • Implementieren des Tokenabrufs in einer C#-Beispielanwendung

Wichtig

Das Herstellen von Verbindungen mit verwalteten Identitäten ist nur für MySQL 5.7 und höher verfügbar.

Voraussetzungen

  • Wenn Sie mit der Funktion für verwaltete Identitäten für Azure-Ressourcen nicht vertraut sind, finden Sie hier eine Übersicht. Wenn Sie kein Azure-Konto haben, sollten Sie sich für ein kostenloses Konto registrieren, bevor Sie fortfahren.
  • Ihr Konto muss für den entsprechenden Gültigkeitsbereich (Ihr Abonnement oder die Ressourcengruppe) über die Berechtigung „Besitzer“ verfügen, um die erforderliche Ressourcenerstellung und eine Rollenverwaltung durchführen zu können. Wenn Sie Unterstützung bei der Rollenzuweisung benötigen, finden Sie weitere Informationen unter Zuweisen von Azure-Rollen zum Verwalten des Zugriffs auf Ihre Azure-Abonnementressourcen.
  • Sie benötigen eine Azure-VM (z. B. unter Ubuntu Linux), mit der Sie mithilfe von verwalteten Identitäten auf Ihre Datenbank zugreifen möchten.
  • Sie benötigen einen Azure Database for MySQL-Datenbankserver, auf dem die Microsoft Entra-Authentifizierung konfiguriert ist
  • Für das C#-Beispiel sollten Sie zuerst den Leitfaden zur Verbindungsherstellung mithilfe von C# lesen.

Erstellen einer benutzerseitig zugewiesenen verwalteten Identität für Ihre VM

Erstellen Sie mit dem Befehl az identity create eine Identität in Ihrem Abonnement. Sie können dazu dieselbe Ressourcengruppe verwenden, in der Ihre VM ausgeführt wird, oder auch eine andere.

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

In den folgenden Schritten werden Sie die Identität konfigurieren. Verwenden Sie den Befehl az identity show, um die Ressourcen- und die Client-ID der Identität in Variablen zu speichern.

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

Mit dem Befehl az vm identity assign können Sie nun die benutzerseitig zugewiesene Identität der VM zuweisen:

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

Zum Abschließen der Einrichtung müssen Sie den Wert der Client-ID abrufen, den Sie in den nächsten Schritten benötigen:

echo $CLIENT_ID

Erstellen eines MySQL-Benutzers für Ihre verwaltete Identität

Nun stellen Sie als Microsoft Entra-Administrator eine Verbindung zu Ihrer MySQL-Datenbank her und führen die folgenden SQL-Anweisungen aus:

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

Die verwaltete Identität hat jetzt Zugriff, wenn die Authentifizierung mit dem Benutzernamen myuser durchgeführt wird (durch einen Namen Ihrer Wahl ersetzbar).

Abrufen des Zugriffstokens aus dem Dienst „Azure Instance Metadata“

Ihre Anwendung kann nun ein Zugriffstoken aus dem Dienst „Azure Instance Metadata“ abrufen und sich damit bei der Datenbank authentifizieren.

Dieses Token wird abgerufen, indem eine HTTP-Anforderung an http://169.254.169.254/metadata/identity/oauth2/token gesendet wird und die folgenden Parameter übergeben werden:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (die Sie zuvor abgerufen haben)

Es wird ein JSON-Ergebnis zurückgegeben, das ein access_token-Feld enthält. Dieser lange Textwert ist das Zugriffstoken der verwalteten Identität, das bei der Verbindungsherstellung zur Datenbank als Kennwort verwenden werden soll.

Zu Testzwecken können Sie die folgenden Befehle in Ihrer Shell ausführen. Beachten Sie, dass der curl-, jq- und der mysql-Client installiert sein müssen.

# 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

Sie haben nun eine Verbindung zur Datenbank hergestellt, die Sie zuvor konfiguriert haben.

Herstellen einer Verbindung mithilfe einer verwalteten Identität in C#

In diesem Abschnitt wird gezeigt, wie Sie mithilfe der benutzerseitig zugewiesenen verwalteten Identität der VM ein Zugriffstoken abrufen und damit Azure Database for MySQL aufrufen. Azure Database for MySQL verfügt über eine native Unterstützung der Microsoft Entra-Authentifizierung, wodurch Zugriffstoken direkt angenommen werden können, die mit verwalteten Identitäten für Azure-Ressourcen abgerufen wurden. Bei der Verbindungsherstellung zu MySQL übergeben Sie das Zugriffstoken im Kennwortfeld.

Mit dem folgenden .NET-Codebeispiel wird eine Verbindung mit MySQL mithilfe eines Zugriffstokens hergestellt. Dieser Code muss auf der VM ausgeführt werden, um auf den Endpunkt der benutzerseitig zugewiesenen verwalteten Identität der VM zugreifen zu können. Für die Verwendung von Zugriffstoken ist .NET Framework 4.6 oder höher bzw. .NET Core 2.2 oder höher erforderlich. Ersetzen Sie die Werte von HOST, USER, DATABASE und 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));
                        }
                    }
                }
            }
        }
    }
}

Wenn Sie diesen Befehl ausführen, wird eine Ausgabe wie die folgende zurückgegeben:

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

Connected!

MySQL version: 5.7.27

Nächste Schritte