Iniciar sesión mediante la autenticación de bases de datos de gestión de identidades y accesos

En esta página se describe cómo pueden iniciar sesión los usuarios y las cuentas de servicio en bases de datos de Cloud SQL mediante la autenticación de bases de datos de gestión de identidades y accesos de Cloud SQL. Para obtener más información, consulta Autenticación de gestión de identidades y accesos.

Antes de empezar

  • Configura la instancia para que use la autenticación de bases de datos de gestión de identidades y accesos. Para obtener más información, consulta el artículo sobre cómo configurar instancias nuevas para la autenticación de bases de datos de gestión de identidades y accesos.
  • Añade un usuario, una cuenta de servicio o un grupo de gestión de identidades y accesos a la base de datos. Para obtener más información, consulta los artículos Añadir un usuario o una cuenta de servicio de Gestión de Identidades y Accesos a la base de datos y Añadir un grupo a la base de datos.
  • Añade el rol de gestión de identidades y accesos roles/cloudsql.instanceUser a tu usuario, cuenta de servicio o grupo de gestión de identidades y accesos. Es un rol predefinido que contiene el permiso de gestión de identidades y accesos de Cloud SQL cloudsql.instances.login necesario. Necesitas este permiso para iniciar sesión en una instancia de base de datos con la autenticación de bases de datos de gestión de identidades y accesos. Para obtener más información, consulta Roles y permisos.
  • Si usas el proxy de autenticación de Cloud SQL, añade el rol de gestión de identidades y accesos roles/cloudsql.client a tu usuario, cuenta de servicio o grupo de gestión de identidades y accesos. Es un rol predefinido que contiene el permiso cloudsql.instances.connect de gestión de identidades y accesos de Cloud SQL necesario. Necesitas este permiso para iniciar sesión en una instancia de base de datos con el proxy de autenticación de Cloud SQL. Para obtener más información, consulta Roles y permisos.
  • Cuando se añade un usuario de gestión de identidades y accesos a una base de datos, el nuevo usuario de la base de datos no tiene privilegios en ninguna base de datos de forma predeterminada. Debes usar el comando GRANT para dar al usuario de la base de datos de gestión de identidades y accesos los permisos necesarios. Para obtener más información, consulta Conceder privilegios de base de datos al usuario de IAM y Conceder privilegios de base de datos a un grupo.

  • Si usas la autenticación de grupos de gestión de identidades y accesos, el usuario o la cuenta de servicio de gestión de identidades y accesos deben ser miembros de un grupo al que se le haya concedido un rol o permisos de gestión de identidades y accesos para iniciar sesión en la instancia de Cloud SQL. Cloud SQL crea una cuenta después de que el usuario o la cuenta de servicio inicie sesión en la instancia por primera vez.

Iniciar sesión con la autenticación automática de bases de datos de gestión de identidades y accesos

Puedes configurar un conector de Cloud SQL para que gestione automáticamente la autenticación en la instancia de Cloud SQL en nombre de un usuario o una aplicación. Entre los conectores se incluyen el proxy de autenticación de Cloud SQL, el conector Go, el conector Java y el conector Python, todos ellos compatibles con la autenticación automática de bases de datos de gestión de identidades y accesos. Cuando se usa un conector de Cloud SQL con la autenticación de bases de datos de gestión de identidades y accesos automática, la cuenta de gestión de identidades y accesos que se usa para iniciar el conector debe ser la misma que se usa para autenticar la base de datos.

Para iniciar sesión mediante la autenticación automática de bases de datos de gestión de identidades y accesos, sigue estos pasos:

Proxy de autenticación de Cloud SQL

.
  1. Autentícate en Google Cloud.

    Usuario

    Autentícate en Google Cloud mediante las credenciales de aplicación predeterminadas (ADC).

    Usa el comando gcloud auth application-default login. Para obtener más información, consulta Configurar credenciales predeterminadas de la aplicación.

    Cuenta de servicio

    Para autenticarte en Google Cloud mediante ADC con una cuenta de servicio, puedes usar la suplantación de identidad de la cuenta de servicio o configurar una clave de cuenta de servicio. Si quieres autenticarte con la suplantación de identidad de la cuenta de servicio, sustituye SERVICE_ACCOUNT_EMAIL_ADDRESS y ejecuta el siguiente comando:

    gcloud auth application-default login --impersonate-service-account SERVICE_ACCOUNT_EMAIL_ADDRESS

    Para obtener más información, consulta Configurar credenciales predeterminadas de la aplicación.

  2. Inicia el proxy de autenticación de Cloud SQL con la marca --auto-iam-authn. Sustituye INSTANCE_CONNECTION_NAME por la cadena de conexión que se usa para identificar la instancia de Cloud SQL. Si usas un puerto distinto del puerto MySQL predeterminado, especifica el número de puerto. Para obtener más información sobre cómo encontrar y crear esta cadena, consulta Opciones para autenticar el proxy de autenticación de Cloud SQL.

    ./cloud-sql-proxy --auto-iam-authn INSTANCE_CONNECTION_NAME

    Para obtener más información sobre cómo iniciar el proxy, consulta Iniciar el proxy de autenticación de Cloud SQL.

  3. Cuando quieras conectarte a la instancia mediante el proxy de autenticación de Cloud SQL, inicia sesión con el cliente mysql. Haz los cambios siguientes:

    • HOSTNAME: dirección IP que usa el proxy de autenticación de Cloud SQL. De forma predeterminada, el proxy de autenticación de Cloud SQL usa la dirección localhost 127.0.0.1, pero puedes asignar otra dirección IP al iniciar el proxy de autenticación de Cloud SQL.
    • USERNAME: en el caso de una cuenta de usuario de IAM, se trata de la dirección de correo del usuario, sin el símbolo @ ni el nombre de dominio. Por ejemplo, para test-user@example.com, escribe test-user. En el caso de las cuentas de servicio, es la dirección de correo de la cuenta de servicio sin el sufijo @project-id.iam.gserviceaccount.com.
    • PORT_NUMBER: opcional. Si has especificado otro puerto en la cadena de conexión de la instancia, indica ese número de puerto.

    Ejecuta el siguiente comando:

    mysql --host=HOSTNAME \
    --user=USERNAME \
    --port=PORT_NUMBER

    Para obtener más información sobre cómo conectarse al proxy de autenticación de Cloud SQL, consulta Conectarse con el cliente mysql.

Go

import (
	"context"
	"database/sql"
	"fmt"
	"log"
	"net"
	"os"

	"cloud.google.com/go/cloudsqlconn"
	"github.com/go-sql-driver/mysql"
)

func connectWithConnectorIAMAuthN() (*sql.DB, error) {
	mustGetenv := func(k string) string {
		v := os.Getenv(k)
		if v == "" {
			log.Fatalf("Warning: %s environment variable not set.", k)
		}
		return v
	}
	// Note: Saving credentials in environment variables is convenient, but not
	// secure - consider a more secure solution such as
	// Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
	// keep secrets safe.
	var (
		dbUser                 = mustGetenv("DB_IAM_USER")              // e.g. 'service-account-name'
		dbName                 = mustGetenv("DB_NAME")                  // e.g. 'my-database'
		instanceConnectionName = mustGetenv("INSTANCE_CONNECTION_NAME") // e.g. 'project:region:instance'
		usePrivate             = os.Getenv("PRIVATE_IP")
	)

	// WithLazyRefresh() Option is used to perform refresh
	// when needed, rather than on a scheduled interval.
	// This is recommended for serverless environments to
	// avoid background refreshes from throttling CPU.
	d, err := cloudsqlconn.NewDialer(
		context.Background(),
		cloudsqlconn.WithIAMAuthN(),
		cloudsqlconn.WithLazyRefresh(),
	)
	if err != nil {
		return nil, fmt.Errorf("cloudsqlconn.NewDialer: %w", err)
	}
	var opts []cloudsqlconn.DialOption
	if usePrivate != "" {
		opts = append(opts, cloudsqlconn.WithPrivateIP())
	}
	mysql.RegisterDialContext("cloudsqlconn",
		func(ctx context.Context, addr string) (net.Conn, error) {
			return d.Dial(ctx, instanceConnectionName, opts...)
		})

	dbURI := fmt.Sprintf("%s:empty@cloudsqlconn(localhost:3306)/%s?parseTime=true",
		dbUser, dbName)

	dbPool, err := sql.Open("mysql", dbURI)
	if err != nil {
		return nil, fmt.Errorf("sql.Open: %w", err)
	}
	return dbPool, nil
}

Java JDBC

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;

public class ConnectorIamAuthnConnectionPoolFactory extends ConnectionPoolFactory {

  // Note: Saving credentials in environment variables is convenient, but not
  // secure - consider a more secure solution such as
  // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  // keep secrets safe.
  private static final String INSTANCE_CONNECTION_NAME =
      System.getenv("INSTANCE_CONNECTION_NAME");
  private static final String INSTANCE_UNIX_SOCKET = System.getenv("INSTANCE_UNIX_SOCKET");
  private static final String DB_IAM_USER = System.getenv("DB_IAM_USER");
  private static final String DB_NAME = System.getenv("DB_NAME");


  public static DataSource createConnectionPool() {
    // The configuration object specifies behaviors for the connection pool.
    HikariConfig config = new HikariConfig();

    // The following URL is equivalent to setting the config options below:
    // jdbc:mysql:///<DB_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&
    // socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<DB_USER>&password=<DB_PASS>
    // See the link below for more info on building a JDBC URL for the Cloud SQL JDBC Socket Factory
    // https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory#creating-the-jdbc-url

    // Configure which instance and what database user to connect with.
    config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));

    config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
    config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME);

    // If connecting using automatic database authentication, follow the instructions for
    // connecting using the connector, but set the DB_IAM_USER value to an IAM user or
    // service account that has been given access to the database.
    // See https://cloud.google.com/sql/docs/postgres/iam-logins for more details.
    config.addDataSourceProperty("enableIamAuth", "true");
    config.addDataSourceProperty("user", DB_IAM_USER);
    // Explicitly set sslmode to disable to prevent driver from hanging.
    // The Java Connector will handle SSL so it is unneccesary to enable it at the driver level.
    config.addDataSourceProperty("sslmode", "disable");

    // cloudSqlRefreshStrategy set to "lazy" is used to perform a
    // refresh when needed, rather than on a scheduled interval.
    // This is recommended for serverless environments to
    // avoid background refreshes from throttling CPU.
    config.addDataSourceProperty("cloudSqlRefreshStrategy", "lazy");


    // ... Specify additional connection properties here.
    // ...

    // Initialize the connection pool using the configuration object.
    return new HikariDataSource(config);
  }
}

Java R2DBC

// Set up ConnectionFactoryOptions
ConnectionFactoryOptions options =
    ConnectionFactoryOptions.builder()
        .option(DRIVER, "gcp")
        .option(PROTOCOL, "mysql")
        .option(USER, DB_USER)
        .option(DATABASE, DB_NAME)
        .option(HOST, CONNECTION_NAME)
        .option(IP_TYPES, IP_TYPE)
        .option(ENABLE_IAM_AUTH, true)
        .build();

// Initialize connection pool
ConnectionFactory connectionFactory = ConnectionFactories.get(options);
ConnectionPoolConfiguration configuration =
    ConnectionPoolConfiguration.builder(connectionFactory).build();

this.connectionPool = new ConnectionPool(configuration);

Python

import os

from google.cloud.sql.connector import Connector, IPTypes
import pymysql

import sqlalchemy


def connect_with_connector_auto_iam_authn() -> sqlalchemy.engine.base.Engine:
    """
    Initializes a connection pool for a Cloud SQL instance of MySQL.

    Uses the Cloud SQL Python Connector with Automatic IAM Database Authentication.
    """
    # Note: Saving credentials in environment variables is convenient, but not
    # secure - consider a more secure solution such as
    # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
    # keep secrets safe.
    instance_connection_name = os.environ[
        "INSTANCE_CONNECTION_NAME"
    ]  # e.g. 'project:region:instance'
    db_iam_user = os.environ["DB_IAM_USER"]  # e.g. 'service-account-name'
    db_name = os.environ["DB_NAME"]  # e.g. 'my-database'

    ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC

    # initialize Cloud SQL Python Connector object
    connector = Connector(refresh_strategy="LAZY")

    def getconn() -> pymysql.connections.Connection:
        conn: pymysql.connections.Connection = connector.connect(
            instance_connection_name,
            "pymysql",
            user=db_iam_user,
            db=db_name,
            enable_iam_auth=True,
            ip_type=ip_type,
        )
        return conn

    # The Cloud SQL Python Connector can be used with SQLAlchemy
    # using the 'creator' argument to 'create_engine'
    pool = sqlalchemy.create_engine(
        "mysql+pymysql://",
        creator=getconn,
        # ...
    )
    return pool

Iniciar sesión con la autenticación de bases de datos de gestión de identidades y accesos manual

Un usuario o una aplicación pueden autenticarse en la base de datos mediante IAM solicitando manualmente un token de acceso a Google Cloud y presentándolo a la base de datos. Con la CLI de gcloud, puedes solicitar explícitamente un token de OAuth 2.0 con el permiso de la API Cloud SQL Admin que se usa para iniciar sesión en la base de datos. Cuando inicias sesión como usuario de la base de datos con la autenticación de bases de datos de gestión de identidades y accesos manual, usas tu dirección de correo electrónico como nombre de usuario y el token de acceso como contraseña. Puedes usar este método con una conexión directa a la base de datos o con un conector de Cloud SQL.

En este procedimiento, te autenticas en Google Cloud, solicitas un token de acceso y, a continuación, te conectas a la base de datos pasando el token como contraseña del usuario de la base de datos de gestión de identidades y accesos. Sigue estos pasos para conectarte sin el proxy de autenticación de Cloud SQL.

Para estos pasos, debes hacer lo siguiente:

Para iniciar sesión mediante la autenticación de bases de datos de gestión de identidades y accesos manual, sigue estos pasos:

gcloud

  1. Autentícate en Google Cloud.

    Usuario

    Autentícate en IAM mediante gcloud auth login. Para obtener más información, consulta Autorizar con una cuenta de usuario.

    Cuenta de servicio

    Autentícate en IAM mediante gcloud auth activate-service-account. Para obtener más información, consulta el artículo Autorizar con una cuenta de servicio.

  2. Solicita el token de acceso e inicia sesión con un cliente.

    Haz los cambios siguientes:

    • HOSTNAME: la dirección IP de la instancia, ya sea la dirección IP pública o la privada.
    • USERNAME: en el caso de una cuenta de usuario de gestión de identidades y accesos, es la dirección de correo del usuario, sin el símbolo @ ni el nombre de dominio. Por ejemplo, para test-user@example.com, escribe test-user. En el caso de las cuentas de servicio, es la dirección de correo de la cuenta de servicio sin el sufijo @project-id.iam.gserviceaccount.com.

     MYSQL_PWD=`gcloud sql generate-login-token` \
     mysql --enable-cleartext-plugin \
     --ssl-mode=REQUIRED \
     --host=HOSTNAME \
     --user=USERNAME
     

    Si ssl_mode en tu instancia de Cloud SQL está configurado como TRUSTED_CLIENT_CERTIFICATE_REQUIRED, incluye un certificado y una clave de cliente al iniciar sesión. Además, para que el cliente verifique la identidad del servidor en la autenticación mutua, especifica el certificado del servidor server-ca.pem. Por ejemplo:

     MYSQL_PWD=`gcloud sql generate-login-token` \
     mysql --enable-cleartext-plugin \
     --ssl-mode=VERIFY_CA \
     --ssl-ca=server-ca.pem \
     --ssl-cert=client-cert.pem \
     --ssl-key=client-key.pem \
     --host=HOSTNAME \
     --user=USERNAME
     

    Para obtener información sobre cómo crear un certificado y una clave de cliente, consulta la sección Certificados de cliente.

Siguientes pasos