Sdílet prostřednictvím


Připojení ke službě Azure Database for MySQL s využitím spravované identity

PLATÍ PRO: Jednoúčelový server Azure Database for MySQL

Důležité

Jednoúčelový server Azure Database for MySQL je na cestě vyřazení. Důrazně doporučujeme upgradovat na flexibilní server Azure Database for MySQL. Další informace o migraci na flexibilní server Azure Database for MySQL najdete v tématu Co se děje s jednoúčelovým serverem Azure Database for MySQL?

V tomto článku se dozvíte, jak použít identitu přiřazenou uživatelem pro virtuální počítač Azure pro přístup k serveru Azure Database for MySQL. Identity spravované služby se automaticky spravují v Azure a umožňují ověřování ve službách, které podporují ověřování Microsoft Entra, aniž byste museli do kódu vkládat přihlašovací údaje.

Získáte informace pro:

  • Udělení přístupu k serveru Azure Database for MySQL virtuálnímu počítači
  • Vytvoření uživatele v databázi představující identitu přiřazenou uživatelem virtuálního počítače
  • Získání přístupového tokenu pomocí identity virtuálního počítače a jeho použití k dotazování serveru Azure Database for MySQL
  • Implementace načtení tokenu v ukázkové aplikaci jazyka C#

Důležité

Připojení pomocí spravované identity je dostupné jenom pro MySQL 5.7 a novější.

Požadavky

  • Pokud ještě neznáte funkci spravovaných identit pro prostředky Azure, podívejte se na tento přehled. Pokud nemáte účet Azure, zaregistrujte si bezplatný účet před tím, než budete pokračovat.
  • K vytvoření požadovaného prostředku a správě rolí váš účet potřebuje oprávnění Vlastník v příslušném oboru (vaše předplatné nebo skupina prostředků). Pokud potřebujete pomoc s přiřazením role, přečtěte si téma Přiřazení rolí Azure ke správě přístupu k prostředkům předplatného Azure.
  • Potřebujete virtuální počítač Azure (například s Ubuntu Linuxem), který chcete použít pro přístup k databázi pomocí spravované identity.
  • Potřebujete databázový server Azure Database for MySQL s nakonfigurovaným ověřováním Microsoft Entra.
  • Pokud chcete postupovat podle příkladu jazyka C#, nejprve dokončete průvodce připojením pomocí jazyka C.#

Vytvoření spravované identity přiřazené uživatelem pro virtuální počítač

Vytvořte ve svém předplatném identitu pomocí příkazu az identity create . Můžete použít stejnou skupinu prostředků, ve které běží váš virtuální počítač, nebo jinou.

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

Pokud chcete nakonfigurovat identitu v následujících krocích, pomocí příkazu az identity show uložte ID prostředku a ID klienta identity do proměnných.

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

Teď můžeme k virtuálnímu počítači přiřadit identitu přiřazenou uživatelem pomocí příkazu az vm identity assign :

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

Chcete-li dokončit instalaci, zobrazte hodnotu ID klienta, které budete potřebovat v několika dalších krocích:

echo $CLIENT_ID

Vytvoření uživatele MySQL pro spravovanou identitu

Nyní se připojte jako uživatel správce Microsoft Entra k databázi MySQL a spusťte následující příkazy SQL:

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

Spravovaná identita teď má přístup při ověřování pomocí uživatelského jména myuser (nahraďte názvem podle vašeho výběru).

Načtení přístupového tokenu ze služby Azure Instance Metadata Service

Vaše aplikace teď může načíst přístupový token ze služby Azure Instance Metadata a použít ho k ověřování v databázi.

Toto načtení tokenu se provádí provedením požadavku HTTP na http://169.254.169.254/metadata/identity/oauth2/token následující parametry a předáním následujících parametrů:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (které jste získali dříve)

Vrátíte výsledek JSON, který obsahuje access_token pole – tato dlouhá textová hodnota je přístupový token spravované identity, který byste měli použít jako heslo při připojování k databázi.

Pro účely testování můžete v prostředí spustit následující příkazy. Všimněte si, že potřebujete curl, jqa mysql klient nainstalovaný.

# 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

Teď jste připojení k databázi, kterou jste nakonfigurovali dříve.

Připojení pomocí spravované identity v jazyce C#

Tato část ukazuje, jak získat přístupový token pomocí spravované identity přiřazené uživatelem virtuálního počítače a jak ho použít k volání služby Azure Database for MySQL. Azure Database for MySQL nativně podporuje ověřování Microsoft Entra, takže může přímo přijímat přístupové tokeny získané pomocí spravovaných identit pro prostředky Azure. Při vytváření připojení k MySQL předáte přístupový token v poli heslo.

Tady je příklad kódu .NET pro otevření připojení k MySQL pomocí přístupového tokenu. Tento kód musí běžet na virtuálním počítači, aby měl přístup ke koncovému bodu spravované identity přiřazené uživatelem virtuálního počítače. K použití metody přístupového tokenu se vyžaduje rozhraní .NET Framework 4.6 nebo novější nebo .NET Core 2.2 nebo vyšší. Nahraďte hodnoty HOST, USER, DATABASE a 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 spuštění tento příkaz zobrazí výstup podobný tomuto:

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

Connected!

MySQL version: 5.7.27

Další kroky