Delegar permisos de agente de servicio en una cuenta de servicio gestionada por el usuario

En las transferencias sin agentes, el Servicio de transferencia de Storage usa de forma predeterminada un agente de servicio para transferir sus datos entre el origen y el destino. Concede permisos al agente de servicio para que acceda a tus segmentos de Cloud Storage.

Como todos los proyectos usan el mismo agente de servicio del Servicio de transferencia de Storage, este tiene permisos en todos los contenedores implicados en cada transferencia.

Como alternativa, puedes asignar permisos de contenedor a varias cuentas de servicio gestionadas por el usuario. Estas cuentas de servicio gestionadas por el usuario tienen permisos en los segmentos de origen y de destino específicos, y también están restringidas a cuentas de usuario concretas (las cuentas que crean o activan el trabajo de transferencia).

Casos de ejemplo

En los siguientes casos prácticos se muestran diferentes opciones de permisos mediante el agente de servicio y las cuentas de servicio gestionadas por el usuario.

Despliega cada sección para ver los detalles.

Situación 1: Solo agente de servicio

En este caso, se conceden todos los permisos al agente de servicio.

  • El agente de servicio tiene permisos de escritura en los segmentos A, B, C y D.

Cualquier usuario que tenga los permisos adecuados para crear un trabajo de transferencia puede transferir datos a los contenedores A, B, C y D, o desde ellos.

Esta opción es adecuada cuando el usuario del Servicio de transferencia de Storage es de confianza para los datos de todos los segmentos y puede configurar correctamente los trabajos de transferencia para evitar que los datos se muevan al segmento incorrecto o desde él.

Situación 2: Solo agentes de servicio gestionados por el usuario

En este caso, se conceden todos los permisos a las cuentas de servicio gestionadas por el usuario.

  • A la cuenta de servicio gestionada por el usuario n.º 1 se le conceden permisos en los segmentos A y B.
  • Se conceden permisos a la cuenta de servicio gestionada por el usuario n.º 2 en los contenedores C y D.

Además:

  • Se concede acceso a la cuenta de servicio n.º 1 al usuario Alpha.
  • Se concede acceso a la cuenta de servicio n.º 2 al usuario Bravo.
  • Se concede acceso a la cuenta de servicio 1 y a la cuenta de servicio 2 al usuario Charlie.

En ese caso, ocurrirá lo siguiente:

  • Alpha solo puede transferirse entre los contenedores A y B.
  • Bravo solo puede transferir datos entre los segmentos C y D.
  • Charlie solo puede transferir entre los contenedores A y B, y entre C y D. </0x0A>
  • Charlie no puede transferir entre A y C, A y D, B y C o B y D.

Situación 3: Permisos mixtos

En este caso, tu proyecto contiene una combinación de permisos de agente de servicio y permisos de cuenta de servicio gestionada por el usuario.

  • El agente de servicio tiene permisos de escritura en los segmentos A y B.
  • A la cuenta de servicio gestionada por el usuario n.º 1 se le conceden permisos de solo lectura en el segmento C y permisos de escritura en el segmento D.
  • Se concede acceso al usuario Alpha a la cuenta de servicio gestionada por el usuario n.º 1.

En ese caso, ocurrirá lo siguiente:

  • Cualquier usuario que tenga los permisos correctos para crear un trabajo de transferencia puede transferir datos a los contenedores A y B, o desde ellos. No se pueden transferir al segmento C ni al D, ni tampoco desde ellos.
  • El usuario Alfa puede transferir elementos a los contenedores A y B, o desde ellos.
  • Alpha puede transferir fuera del segmento C al segmento D.
  • Alpha no puede transferirse del contenedor C a los contenedores A o B.

Descripción general de la implementación

La implementación es la siguiente:

  • Crea una cuenta de servicio gestionada por el usuario o usa una que ya tengas.
  • Concedes permisos:
    • Para que un usuario acceda a la cuenta de servicio gestionada por el usuario.
    • Para que el agente de servicio genere un token de acceso desde la cuenta de servicio gestionada por el usuario.
    • Para que la cuenta de servicio gestionada por el usuario pueda acceder a tus contenedores.
  • El usuario crea un trabajo de transferencia que especifica la cuenta de servicio gestionada por el usuario.
  • Storage Transfer Service comprueba que el usuario tenga los permisos correctos en la cuenta de servicio. Si no se han concedido los permisos correctos, no se podrá crear el trabajo de transferencia.
  • El agente de servicio genera un token de OAuth en nombre de la cuenta de servicio gestionada por el usuario. El token OAuth permite que el Servicio de transferencia de Storage acceda a los segmentos implicados en la transferencia.
  • Se ejecuta la tarea de transferencia.
  • El token de OAuth tiene una duración breve y caduca. Si la tarea de transferencia está en curso cuando caduca el token, Storage Transfer Service genera uno nuevo y continúa la transferencia.

Configurar la delegación de permisos

Sigue las instrucciones para delegar el acceso del agente de servicio en una cuenta de servicio gestionada por el usuario.

Requisitos

  • Para crear una cuenta de servicio gestionada por el usuario, necesitas el rol Crear cuentas de servicio (roles/iam.serviceAccountCreator) en el proyecto.
  • Para conceder acceso a la cuenta de servicio gestionada por el usuario al usuario y al agente de servicio, necesitas el rol Administrador de cuentas de servicio (roles/iam.serviceAccountAdmin) en la cuenta de servicio gestionada por el usuario o en el proyecto.

Crear o identificar una cuenta de servicio gestionada por el usuario

Puedes crear una cuenta de servicio gestionada por el usuario o usar una que ya tengas.

  • Para crear una cuenta de servicio gestionada por el usuario, sigue las instrucciones que se indican en el artículo Crear cuentas de servicio.

  • Para usar una cuenta de servicio gestionada por el usuario, necesitas su dirección de correo, que tiene el siguiente formato:

    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Si la cuenta de servicio está en un proyecto diferente al del trabajo de transferencia, consulta Habilitar la vinculación de cuentas de servicio entre proyectos.

Conceder acceso al usuario

Concede a la cuenta de usuario acceso a la nueva cuenta de servicio gestionada por el usuario y asigna el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser). La cuenta de usuario es la que se usa para crear o actualizar el trabajo de transferencia.

Google Cloud consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio gestionada por el usuario.

  4. Selecciona la pestaña Permisos.

  5. Haz clic en Conceder acceso.

  6. Introduce la dirección de correo electrónico del usuario. Por ejemplo, user1@example.com.

  7. En la lista desplegable Rol, selecciona Usuario de cuenta de servicio.

  8. Haz clic en Guardar. Se asigna el rol al principal en la cuenta de servicio.

gcloud

Para asignar un rol a una cuenta principal, ejecuta el comando add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=PRINCIPAL --role=roles/iam.serviceAccountUser

Sustituye las siguientes variables:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: la dirección de correo del servicio gestionado por el usuario con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • PRINCIPAL: la dirección de correo del usuario que ejecuta el trabajo de transferencia, con el formato user:name@example.com.

Conceder acceso al agente de servicio

Para permitir que el agente de servicio genere un token de acceso desde la cuenta de servicio gestionada por el usuario, dale acceso a la cuenta de servicio gestionada por el usuario y asigna el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).

Necesitas la dirección de correo del agente de servicio para conceder acceso. Para encontrar el correo del agente de servicio, sigue estos pasos:

  1. Ve a la página de referencia de googleServiceAccounts.get.

    Se abrirá un panel interactivo titulado Prueba este método.

  2. En el panel, en Parámetros de solicitud, introduce tu ID de proyecto. El proyecto que especifiques aquí debe ser el que utilices para gestionar el Servicio de transferencia de Storage.

  3. Haz clic en la opción para ejecutar.

    La dirección de correo de tu agente de asistencia se devuelve como el valor de accountEmail. Usa el formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

A continuación, para conceder acceso al agente de servicio a la cuenta de servicio gestionada por el usuario, sigue estos pasos:

Google Cloud consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio gestionada por el usuario.

  4. Selecciona la pestaña Permisos.

  5. Haz clic en Conceder acceso.

  6. Introduce la dirección de correo del agente de servicio.

  7. En la lista desplegable Rol, selecciona Creador de tokens de cuenta de servicio.

  8. Haz clic en Guardar. Se asigna el rol al principal en la cuenta de servicio.

gcloud

Para asignar un rol a una cuenta principal, ejecuta el comando add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/iam.serviceAccountTokenCreator

Sustituye las siguientes variables:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: la dirección de correo del servicio gestionado por el usuario con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • SERVICE_AGENT_EMAIL: la dirección de correo del agente de servicio.

Conceder permisos de segmento a la cuenta de servicio gestionada por el usuario

Concede los permisos que se indican en Permisos de agente de servicio gestionado por Google a la cuenta de servicio gestionada por el usuario, en lugar de al agente de servicio.

Crear un trabajo de transferencia con una cuenta de servicio gestionada por el usuario

Una vez que hayas concedido los permisos correctos, podrás especificar la cuenta de servicio gestionada por el usuario al crear un trabajo de transferencia.

Google Cloud consola

Sigue las instrucciones para crear una transferencia. Antes de finalizar la tarea de transferencia:

  1. En la página Elegir configuración, busca la sección Tipo de cuenta de servicio.
  2. Selecciona Cuenta de servicio gestionada por el usuario.
  3. Introduce el correo de la cuenta de servicio gestionada por el usuario con el formato SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com.
  4. Haz clic en Crear para crear la tarea de transferencia.

API REST

Especifica la cuenta de servicio gestionada por el usuario como valor del campo serviceAccount en la solicitud transferJobs.create.

El valor debe tener el formato projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID.

En la cadena se puede incluir la dirección de correo de la cuenta de servicio (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) o el ID único (123456789012345678901). Es obligatorio usar el carácter comodín -. No se puede sustituir por un ID de proyecto.

Por ejemplo:

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "A transfer using a user-managed service account for bucket permissions",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"serviceAccount": "projects/-/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
    ...
  }
}