Compartir a través de


Tutorial: Creación de una conexión sin contraseña en un servicio de base de datos mediante el conector de servicio

Las conexiones sin contraseña usan identidades administradas para acceder a los servicios de Azure. Con este enfoque, no es necesario realizar un seguimiento manual y administrar secretos para identidades administradas. Azure controla de forma segura estas tareas internamente.

El conector de servicio permite identidades administradas en servicios de hospedaje de aplicaciones como Azure Spring Apps, Azure App Service y Azure Container Apps. El conector de servicio también configura servicios de base de datos, como Azure Database for PostgreSQL, Azure Database for MySQL y Azure SQL Database, para aceptar identidades administradas.

En este tutorial, se usa la CLI de Azure para completar las siguientes tareas:

  • Compruebe el entorno inicial con la CLI de Azure.
  • Cree una conexión sin contraseña con el conector de servicio.
  • Use las variables de entorno o las configuraciones generadas por el conector de servicio para acceder a un servicio de base de datos.

Requisitos previos

Configuración del entorno

Cuenta

Inicie sesión con la CLI de Azure mediante az login. Si usa Azure Cloud Shell o ya ha iniciado sesión, confirme la cuenta autenticada con az account show.

Instalar la extensión sin contraseña del conector de servicio

Instale la extensión sin contraseña más reciente del Conector de servicio para la CLI de Azure:

az extension add --name serviceconnector-passwordless --upgrade

Nota:

Para comprobar que la versión de "serviceconnector-passwordless" es "2.0.2" o posterior, ejecute az version. Es posible que tenga que actualizar primero la CLI de Azure para actualizar la versión de la extensión.

Creación de una conexión sin contraseña

A continuación, usamos Azure App Service como ejemplo para crear una conexión mediante la identidad administrada.

Si utiliza:

Nota

Si usa Azure Portal, vaya a la hoja Conector de servicio de Azure App Service, Azure Spring Apps o Azure Container Apps y seleccione Crear para crear una conexión. Azure Portal redactará automáticamente el comando y desencadenará la ejecución del comando en Cloud Shell.

El siguiente comando de la CLI de Azure usa un parámetro --client-type, puede ser java, dotnet, python, etc. Ejecute az webapp connection create postgres-flexible -h para obtener los tipos de cliente admitidos y elija el que coincida con la aplicación.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

Azure Database for MySQL: servidor flexible requiere una identidad administrada asignada por el usuario para habilitar la autenticación de Microsoft Entra. Para obtener más información, consulte Configuración de la autenticación de Microsoft Entra para Azure Database for MySQL: servidor flexible. Puede usar el siguiente comando para crear una identidad administrada asignada por el usuario:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Importante

Después de crear la identidad administrada asignada por el usuario, pida al administrador global o administrador de roles con privilegios que conceda los siguientes permisos para esta identidad:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Para obtener más información, consulte la sección Permisos de autenticación de Active Directory.

Después, conecte la aplicación a una base de datos de MySQL con una identidad administrada asignada por el sistema mediante el conector de servicio.

El siguiente comando de la CLI de Azure usa un parámetro --client-type. Ejecute az webapp connection create mysql-flexible -h para obtener los tipos de cliente admitidos y elija el que coincida con la aplicación.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

El siguiente comando de la CLI de Azure usa un parámetro --client-type. Ejecute az webapp connection create sql -h para obtener los tipos de cliente admitidos y elija el que coincida con la aplicación.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Este comando del conector de servicio completa las siguientes tareas en segundo plano:

  • Habilite la identidad administrada asignada por el sistema o asigne una identidad de usuario para la aplicación $APPSERVICE_NAME hospedada por Azure App Service/Azure Spring Apps/Azure Container Apps.
  • Habilite la autenticación de Microsoft Entra para el servidor de bases de datos si no está habilitada antes.
  • Establezca el administrador de Microsoft Entra en el usuario que tiene actualmente la sesión iniciada.
  • Agregue un usuario de base de datos para la identidad administrada asignada por el sistema, la identidad administrada asignada por el usuario o la entidad de servicio. Conceda todos los privilegios de la base de datos $DATABASE_NAME a este usuario. El nombre de usuario se puede encontrar en la cadena de conexión en la salida del comando anterior.
  • Establezca configuraciones denominadas AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING o AZURE_SQL_CONNECTIONSTRING en el recurso de Azure en función del tipo de base de datos.
    • Para App Service, las configuraciones se establecen en la hoja Configuración de la aplicación.
    • Para Spring Apps, las configuraciones se establecen cuando se inicia la aplicación.
    • Para Container Apps, las configuraciones se establecen en las variables de entorno. Puede obtener todas las configuraciones y sus valores en la hoja Conector de servicio de Azure Portal.

Service Connector asignará los siguientes privilegios al usuario, puede revocarlos y ajustarlos en función de sus requisitos.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

Conexión a una base de datos con la autenticación de Microsoft Entra

Después de crear la conexión, puede usar la cadena de conexión de la aplicación para conectarse a la base de datos con la autenticación de Microsoft Entra. Por ejemplo, puede usar las siguientes soluciones para conectarse a la base de datos con la autenticación de Microsoft Entra.

Para .NET, no hay un complemento ni una biblioteca que admita las conexiones sin contraseña. Puede obtener un token de acceso para la identidad administrada o la entidad de servicio utilizando una biblioteca de cliente como Azure.Identity. Luego puede usar el token de acceso como contraseña para conectarse a la base de datos. Al usar el código siguiente, quite la marca de comentario de la parte del fragmento de código para el tipo de autenticación que desea usar.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

A continuación, si ha creado tablas y secuencias en el servidor flexible de PostgreSQL antes de usar el conector de servicio, debe conectarse como propietario y conceder permiso a <aad-username>, que se crea mediante el conector de servicio. El nombre de usuario de la cadena de conexión o la configuración establecida por el conector de servicio debería parecerse a aad_<connection name>. Si usa Azure Portal, seleccione el botón expandir situado junto a la columna Service Type y obtenga el valor. Si usa la CLI de Azure, compruebe configurations en la salida del comando de la CLI.

A continuación, ejecute la consulta para conceder permiso

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

<owner-username> y <owner-password> es el propietario de la tabla existente que puede conceder permisos a otros usuarios. <aad-username> es el usuario creado por Service Connector. Reemplácelos por el valor real.

Valide el resultado con el comando:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Para .NET, no hay un complemento ni una biblioteca que admita las conexiones sin contraseña. Puede obtener un token de acceso para la identidad administrada o la entidad de servicio utilizando una biblioteca de cliente como Azure.Identity. Luego puede usar el token de acceso como contraseña para conectarse a la base de datos. Al usar el código siguiente, quite la marca de comentario de la parte del fragmento de código para el tipo de autenticación que desea usar.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

Para obtener ejemplos de código, consulte Conexión a bases de datos de Azure desde App Service sin secretos mediante una identidad administrada.

  1. Instale las dependencias.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Obtenga la cadena de conexión de Azure SQL Database de la variable de entorno agregada por Service Connector.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Para obtener más información, consulte Uso de la autenticación de identidad administrada de Active Directory.

Para obtener más información, consulte Página principal de la programación de cliente en Microsoft SQL Server.

Implementación de la aplicación en un servicio de hospedaje de Azure

Por último, implemente la aplicación en un servicio de hospedaje de Azure. Ese servicio de origen puede usar una identidad administrada para conectarse a la base de datos de destino en Azure.

En cuanto a Azure App Service, puede consultar el documento para elegir una manera de implementación, consulte Inicio rápido: Implementar una aplicación web de ASP.NET.

A continuación, puede comprobar el registro o llamar a la aplicación para ver si puede conectarse a la base de datos en Azure correctamente.

Solución de problemas

Permiso

Si encuentra algún error relacionado con los permisos, confirme el usuario que ha iniciado sesión en la CLI de Azure con el comando az account show. Asegúrese de que ha iniciado sesión con la cuenta correcta. A continuación, confirme que tiene los siguientes permisos que pueden ser necesarios para crear una conexión sin contraseña con el conector de servicio.

Permiso Operación
Microsoft.DBforPostgreSQL/flexibleServers/read Necesario para obtener información del servidor de bases de datos
Microsoft.DBforPostgreSQL/flexibleServers/write Necesario para habilitar la autenticación de Microsoft Entra para el servidor de bases de datos
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Necesario para crear una regla de firewall en caso de que se bloquee la dirección IP local
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Necesario para revertir la regla de firewall creada por el conector de servicio para evitar problemas de seguridad
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Necesario para comprobar si el usuario de inicio de sesión de la CLI de Azure es un administrador de Microsoft Entra del servidor de bases de datos
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Necesario para agregar el usuario de inicio de sesión de la CLI de Azure como administrador de Microsoft Entra del servidor de bases de datos
Permiso Operación
Microsoft.DBforMySQL/flexibleServers/read Necesario para obtener información del servidor de bases de datos
Microsoft.DBforMySQL/flexibleServers/write Necesario para agregar la identidad administrada asignada por el usuario proporcionada al servidor de bases de datos
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Necesario para crear una regla de firewall en caso de que se bloquee la dirección IP local
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Necesario para revertir la regla de firewall creada por el conector de servicio para evitar problemas de seguridad
Microsoft.DBforMySQL/flexibleServers/administrators/read Necesario para comprobar si el usuario de inicio de sesión de la CLI de Azure es un administrador de Microsoft Entra del servidor de bases de datos
Microsoft.DBforMySQL/flexibleServers/administrators/write Necesario para agregar el usuario de inicio de sesión de la CLI de Azure como administrador de Microsoft Entra del servidor de bases de datos
Permiso Operación
Microsoft.Sql/servers/read Necesario para obtener información del servidor de bases de datos
Microsoft.Sql/servers/firewallRules/write Necesario para crear una regla de firewall en caso de que se bloquee la dirección IP local
Microsoft.Sql/servers/firewallRules/delete Necesario para revertir la regla de firewall creada por el conector de servicio para evitar problemas de seguridad
Microsoft.Sql/servers/administrators/read Necesario para comprobar si el usuario de inicio de sesión de la CLI de Azure es un administrador de Microsoft Entra del servidor de bases de datos
Microsoft.Sql/servers/administrators/write Necesario para agregar el usuario de inicio de sesión de la CLI de Azure como administrador de Microsoft Entra del servidor de bases de datos

En algunos casos, los permisos no son necesarios. Por ejemplo, si el usuario autenticado por la CLI de Azure ya es un administrador de Active Directory en SQL Server, no es necesario tener el permiso Microsoft.Sql/servers/administrators/write.

Microsoft Entra ID

Si recibe un error ERROR: AADSTS530003: Your device is required to be managed to access this resource., pida a su departamento de TI ayuda para unir este dispositivo a Microsoft Entra ID. Para obtener más información, consulte Dispositivos unidos a Microsoft Entra.

El conector de servicio debe acceder a Microsoft Entra ID para obtener información de la cuenta y la identidad administrada del servicio de hospedaje. Puede usar el siguiente comando para comprobar si el dispositivo puede acceder a Microsoft Entra ID:

az ad signed-in-user show

Si no inicia sesión de forma interactiva, también puede obtener el error y Interactive authentication is needed. Para resolver el error, inicie sesión con el comando az login.

Conectividad de red

Si el servidor de bases de datos está en Virtual Network, asegúrese de que el entorno que ejecuta el comando de la CLI de Azure pueda acceder al servidor en Virtual Network.

Si el servidor de bases de datos está en Virtual Network, asegúrese de que el entorno que ejecuta el comando de la CLI de Azure pueda acceder al servidor en Virtual Network.

Si el servidor de bases de datos no permite el acceso público, asegúrese de que el entorno que ejecuta el comando de la CLI de Azure pueda acceder al servidor a través del punto de conexión privado.

Pasos siguientes

Para obtener más información sobre el conector de servicio y las conexiones sin contraseña, consulte los siguientes recursos: