Compartir a través de


Conexión con identidad administrada a Azure Database for MySQL

SE APLICA A: Azure Database for MySQL: servidor único

Importante

El servidor único de Azure Database for MySQL está en proceso de retirada. Es muy recomendable actualizar al servidor flexible de Azure Database for MySQL. Para obtener más información sobre la migración al servidor flexible de Azure Database for MySQL, consulte ¿Qué sucede con el servidor único de Azure Database for MySQL?

En este artículo se muestra cómo usar una identidad asignada por el usuario en una máquina virtual (VM) de Azure para acceder a un servidor de Azure Database for MySQL. Las identidades de MSI son administradas automáticamente por Azure y le permiten autenticar los servicios que admiten la autenticación de Microsoft Entra sin necesidad de insertar credenciales en el código.

Aprenderá a:

  • Conceder a la VM acceso a un servidor de Azure Database for MySQL.
  • Crear un usuario en la base de datos que represente la identidad asignada por el usuario de la VM.
  • Obtener un token de acceso mediante la identidad de la VM y usarlo para consultar un servidor de Azure Database for MySQL.
  • Implementar la recuperación del token en una aplicación de ejemplo de C#.

Importante

La conexión con Identidad administrada solo está disponible para MySQL 5.7 y versiones más recientes.

Requisitos previos

Creación de una identidad administrada asignada por el usuario para su VM

Cree una identidad en la suscripción con el comando az identity create. Puede usar el mismo grupo de recursos en el que se ejecuta la máquina virtual o uno diferente.

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

Para configurar la identidad en los pasos siguientes, use el comando az identity show para almacenar en variables el id. de cliente y el id. de recurso de la identidad.

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

Ahora podemos asignar la identidad asignada por el usuario a la VM con el comando az vm identity assign:

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

Para finalizar la connfiguración, muestre el valor del id. de cliente, que necesitará en los pasos siguientes:

echo $CLIENT_ID

Creación de un usuario de MySQL para la identidad administrada

Ahora, conéctese como usuario administrador de Microsoft Entra a la base de datos MySQL y ejecute las siguientes instrucciones SQL:

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

La identidad administrada ahora tiene acceso al autenticarse con el nombre de usuario myuser (reemplácelo por un nombre de su elección).

Recuperación del token de acceso desde Azure Instance Metadata Service

La aplicación ahora puede recuperar un token de acceso desde Azure Instance Metadata Service y usarlo para autenticarse en la base de datos.

Esta recuperación de token se realiza mediante una solicitud HTTP a http://169.254.169.254/metadata/identity/oauth2/token y el pase de los siguientes parámetros:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (que recuperó anteriormente)

Recibirá un resultado JSON que contiene un campo access_token: este valor de texto largo es el token de acceso de identidad administrada, que debe usar como contraseña al conectarse a la base de datos.

Con fines de prueba, puede ejecutar los siguientes comandos en el shell. Tenga en cuenta que necesita curl, jq y el cliente de mysql instalado.

# 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

Ahora está conectado a la base de datos que configuró anteriormente.

Conexión mediante identidad administrada en C#

En esta sección se muestra cómo obtener un token de acceso mediante la identidad administrada asignada por el usuario de la VM y cómo usarlo para llamar a Azure Database for MySQL. Azure Database for MySQL admite de forma nativa la autenticación de Microsoft Entra, por lo que puede aceptar directamente los tokens de acceso obtenidos con identidades administradas para recursos de Azure. Al crear una conexión a MySQL, se pasa el token de acceso en el campo de contraseña.

Este es un ejemplo de código de .NET para abrir una conexión a MySQL con un token de acceso. Este código se debe ejecutar en la VM para acceder al punto de conexión de la identidad administrada asignada por el usuario de la VM. Se requiere .NET Framework 4.6 o posterior, o bien .NET Core 2.2 o posterior, para usar el método de token de acceso. Reemplace los valores de HOST, USER, DATABASE y 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));
                        }
                    }
                }
            }
        }
    }
}

Cuando se ejecute, este comando proporcionará una salida similar a la siguiente:

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

Connected!

MySQL version: 5.7.27

Pasos siguientes