Agrega y administra usuarios que usan la autenticación de la base de datos de IAM

En esta página, se describe cómo agregar un usuario o una cuenta de servicio que usa la autenticación de la base de datos de IAM a una base de datos y cómo administrar esos usuarios y esas cuentas de servicio. Para obtener más información sobre la integración de IAM, consulta Descripción general de la autenticación de la base de datos de IAM.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. Instala e inicializa el SDK de Cloud.
  5. Habilita las Cloud Key Management Service API.

    Habilita la API

  6. Asegúrate de tener la función de administrador de Cloud SQL en tu cuenta de usuario.

    Ir a la página IAM

  7. Habilita la autenticación de la base de datos de IAM en tu instancia de Cloud SQL.
  8. Asegúrate de otorgar acceso de IAM a los usuarios que lo necesiten para cada proyecto que contenga bases de datos a las que los usuarios necesitan acceder. Consulta Otorga, cambia y revoca el acceso a recursos.
  9. Asegúrate de haber agregado una cuenta de servicio para cada servicio que requiera acceso a las bases de datos del proyecto.

Agrega una cuenta de servicio o un usuario de IAM a la base de datos

Debes crear un usuario de base de datos nuevo para cada usuario de IAM que desees tener acceso a la instancia de la base de datos. El nombre de usuario de la base de datos debe ser la dirección de correo electrónico del usuario de IAM, por ejemplo, test-user@gmail.com.

Cuando usas comandos de REST, el nombre de usuario debe usar comillas porque contiene caracteres especiales (@ y .).

Las cuentas de servicio usan el formato service-account-name@project-id.iam.gserviceaccount.com.

Para agregar una cuenta de servicio o un usuario de IAM, agrega un usuario de base de datos nuevo y selecciona IAM como método de autenticación:

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haz clic en el nombre de la instancia para abrir la página Descripción general de esa instancia.
  3. Selecciona Usuarios en el menú de navegación de SQL.
  4. Haz clic en Agregar cuenta de usuario. Se abrirá la pestaña Agregar una cuenta de usuario a la instancia instance_name.
  5. Haz clic en el botón de selección Cloud IAM.
  6. Agrega la dirección de correo electrónico del usuario o la cuenta de servicio que desees agregar en el campo Miembro.
  7. Haga clic en Add. El usuario ahora está en la lista de usuarios.
  8. Para otorgar privilegios de acceso al usuario, haz clic en triángulo y selecciona Agregar función de IAM. Esta acción asigna la función del usuario de instancia de Cloud SQL al usuario.

gcloud

Creación de usuarios

Usa el correo electrónico, como test-user@gmail.com, para identificar al usuario.

Reemplaza lo siguiente:

  • USERNAME: Es la dirección de correo electrónico del usuario.
  • INSTANCE_NAME: Es el nombre de la instancia a la que deseas que el usuario pueda acceder.
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

Creación de cuentas de servicio

Reemplaza lo siguiente:

  • USERNAME: Es la dirección de correo electrónico de la cuenta de servicio.
  • INSTANCE_NAME: Es el nombre de la instancia a la que deseas que la cuenta de servicio pueda acceder.
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

REST v1

Creación de usuarios

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: el ID de tu proyecto
  • instance-id es el ID de la instancia a la que le estás agregando el usuario
  • user-name es la dirección de correo electrónico del usuario
  • operation-id es el ID de la operación

Método HTTP y URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Cuerpo JSON de la solicitud:

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Creación de cuentas de servicio

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • service-account-id es el ID de tu cuenta de servicio
  • project-id: el ID de tu proyecto
  • instance-id es el ID de la instancia a la que agregarás la cuenta de servicio
  • operation-id es el ID de la operación

Método HTTP y URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Cuerpo JSON de la solicitud:

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

REST v1beta4

Creación de usuarios

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: el ID de tu proyecto
  • instance-id es el ID de la instancia a la que le estás agregando el usuario
  • user-name es la dirección de correo electrónico del usuario
  • operation-id es el ID de la operación

Método HTTP y URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Cuerpo JSON de la solicitud:

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Creación de cuentas de servicio

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • service-account-id es el ID de tu cuenta de servicio
  • project-id: el ID de tu proyecto
  • instance-id es el ID de la instancia a la que agregarás la cuenta de servicio
  • operation-id es el ID de la operación

Método HTTP y URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Cuerpo JSON de la solicitud:

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Agrega una vinculación de política de IAM a un usuario o una cuenta de servicio

En este procedimiento, se agrega una vinculación de política a la política de IAM de un proyecto específico, según el ID del proyecto y la vinculación. El comando de vinculación consta de un miembro, una función y una condición opcional. Para obtener una descripción general de la vinculación de políticas de IAM a la autenticación de bases de datos de IAM, consulta Diferencias entre la autenticación integrada y la autenticación de bases de datos de IAM.

El nombre de usuario de la base de datos debe ser la dirección de correo electrónico del usuario de IAM, por ejemplo, test-user@gmail.com. Debes usar comillas porque contiene caracteres especiales (@ y .).

Para agregar una vinculación de políticas a un usuario o una cuenta de servicio, haz lo siguiente:

Console

  1. En Google Cloud Console, ve a la página IAM.

    Ir a IAM

  2. Haga clic en Add.
  3. En Nuevos miembros, ingresa una dirección de correo electrónico. Puedes agregar personas o cuentas de servicio como miembros, pero cada proyecto debe tener al menos a una persona como miembro.
  4. EnFunción, navega aCloud SQL y selecciona Usuario de instancia de Cloud SQL y Cliente de Cloud SQL.
  5. Haz clic en Guardar.

gcloud

Ejecuta gcloud projects add-iam-policy-binding con la marca --role=roles/cloudsql.instanceUser.

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto que deseas que el usuario pueda usar.
  • USERNAME: Es la dirección de correo electrónico del usuario.
Para una cuenta de usuario, ejecuta el siguiente comando:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=user:USERNAME \
--role=roles/cloudsql.instanceUser
Para una cuenta de servicio, ejecuta el siguiente comando:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:USERNAME --role=roles/cloudsql.instanceUser

Además, para ambos tipos de cuentas, vuelve a ejecutar gcloud projects add-iam-policy-binding con la marca --role=roles/cloudsql.client.

REST

Para otorgar las funciones cloudsql.instanceUser y cloudsql.client a ambos tipos de cuentas, edita la política de vinculación JSON o YAML que muestra el comando get-iam-policy. Ten en cuenta que este cambio en la política se implementará una vez que hayas establecido la política actualizada.

    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
                   "user:user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

Otorga privilegios de base de datos al usuario de IAM

Cuando se agrega un usuario de IAM a una instancia de base de datos, a ese usuario nuevo no se le otorgan privilegios en ninguna base de datos de forma predeterminada.

Para otorgar al usuario acceso de acceso u otros privilegios, utiliza la instrucción GRANT. Consulta la página de referencia de GRANT para obtener una lista completa de privilegios que puedes otorgar a usuarios y cuentas de servicio. Ejecuta GRANT desde la línea de comandos mysql.

Reemplaza lo siguiente:

  • USERNAME: El nombre de la base de datos del usuario de IAM Para una cuenta de usuario, esta es la dirección de correo electrónico del usuario de IAM con @ y la string de dominio truncada. Por ejemplo, si la dirección de correo electrónico del usuario de IAM es test-user@gmail.com, el nombre de usuario sería test-user. Para una cuenta de servicio, esta es la dirección de correo electrónico de la cuenta de servicio sin el dominio @project-id.iam.gserviceaccount.com.
  • TABLE_NAME: el nombre de la tabla.
    mysql=> grant select on TABLE_NAME to "USERNAME";
    
  • Quita una cuenta de servicio o un usuario de IAM de la base de datos

    Para quitar un usuario o una cuenta de servicio de la base de datos, debes borrar la cuenta de la instancia:

    Console

    1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

      Ir a Instancias de Cloud SQL

    2. Haz clic en el nombre de la instancia para abrir la página Descripción general de esa instancia.
    3. Selecciona Usuarios en el menú de navegación de SQL.
    4. Haz clic en para encontrar el usuario que deseas quitar.
    5. Selecciona Quitar. Esto solo revoca el acceso a esta instancia.

    gcloud

    Revoca un usuario

    Usa el correo electrónico, como test-user@gmail.com, para identificar al usuario.

    Reemplaza lo siguiente:

    • USERNAME: La dirección de correo electrónico que omite el @nombre de dominio.
    • INSTANCE_NAME: El nombre de la instancia de la que deseas quitar al usuario.
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    Eliminación de cuentas de servicio

    Reemplaza lo siguiente:

    • USERNAME: Es la dirección de correo electrónico de la cuenta de servicio.
    • INSTANCE_NAME: El nombre de la instancia de la que deseas quitar al usuario.
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    REST v1beta4

    En la solicitud que se muestra a continuación, se usa el método users:delete para borrar la cuenta de usuario especificada.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: el ID de tu proyecto
    • instance-id: el ID de instancia deseado
    • user-id: el ID del usuario

    Método HTTP y URL:

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=&name=user-id

    Cuerpo JSON de la solicitud:

    {
      "name": "user-id",
      "host": ""
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

    Visualiza la información de acceso en los registros de auditoría

    Puedes habilitar los registros de auditoría para capturar los accesos de IAM a la base de datos. Cuando hay problemas de acceso, puedes usar los registros de auditoría para diagnosticar el problema.

    Nota: Audit Logging genera costos adicionales. Si deseas obtener más información, consulta Precios para registrar datos.

    Una vez configurado, puedes ver los registros de auditoría de acceso a los datos de los accesos exitosos mediante el Visor de registros.

    Por ejemplo, un registro puede contener información similar a la siguiente:

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    Solución de problemas de acceso

    Cuando falla un intento de acceso, MySQL muestra un mensaje de error mínimo por motivos de seguridad. Por ejemplo:

    $MYSQL_PWD=`gcloud-access-token mysql` --enable-cleartext-plugin --ssl-ca=server-ca.pem
    --ssl-cert=client-cert.pem --ssl-key=client-key.pem   --host=ip_address --user=testuser
    Access denied for user 'testuser'@'...' (using password: NO)
    

    Puedes revisar los registros de errores de MySQL para obtener más detalles sobre el error. Para obtener más información, consulta Visualiza los registros.

    Por ejemplo, en la siguiente entrada de registro se explica la acción que puedes realizar a fin de resolver el problema del error anterior.

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    Verifica el mensaje de error que recibes. Si el mensaje no indica que usaste la “autenticación de usuarios de IAM de Cloud SQL” o la “autenticación de cuentas de servicio de IAM de Cloud SQL”, verifica que el tipo de usuario de la base de datos que se usó para acceder sea CLOUD_IAM_USER o CLOUD_IAM_SERVICE_ACCOUNT. Para un usuario de IAM, verifica que el nombre de usuario de la base de datos sea la dirección de correo electrónico del usuario de IAM, sin @ ni el dominio. Para una cuenta de servicio, verifica que sea el correo electrónico de la cuenta de servicio sin el @project-id.iam.gserviceaccount.com.

    Si usaste la autenticación de la base de datos de IAM, verifica los detalles del mensaje de error. Puedes encontrar el mensaje de error en el registro de errores de la base de datos. Si indica que el token de acceso (OAuth 2.0) que enviaste como contraseña no es válido, puedes usar el comando gcloud de gcloud auth application-default print-access-token para encontrar detalles del token, de la siguiente manera:

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo
    

    Verifica que el token sea para la cuenta de servicio o el usuario de IAM previsto y que no haya vencido.

    Si los detalles indican que no tienen permiso, verifica que la cuenta de servicio o el usuario de IAM tenga el permiso cloudsql.instances.login mediante la función predefinida Cloud SQL Instance User o una función personalizada en la política de IAM del proyecto de la instancia. Usa el solucionador de problemas de políticas de IAM para obtener ayuda adicional.

    Si un acceso falla debido a la falta de disponibilidad de autenticación de la base de datos de IAM, el usuario puede acceder mediante el usuario y la contraseña predeterminados de MySQL. Este método de acceso aún permite que el usuario acceda a toda la base de datos. Verifica que la conexión sea segura.

    ¿Qué sigue?