Delega permisos del agente de servicio a una cuenta de servicio administrada por el usuario

Para las transferencias sin agente, el Servicio de transferencia de almacenamiento usa de forma predeterminada un agente de servicio para transferir tus datos entre la fuente y el destino. Otorgas permisos al agente de servicio para acceder a tus buckets de Cloud Storage.

Dado que todas las transferencias de un proyecto usan el mismo agente de servicio de Servicio de transferencia de almacenamiento, este necesariamente tiene permisos en todos los buckets involucrados en cada transferencia.

Como alternativa, puedes asignar permisos de bucket a varias cuentas de servicio administradas por el usuario. A estas cuentas de servicio administradas por el usuario se les otorgan permisos en buckets de origen y destino específicos, y también se restringen a cuentas de usuario específicas (las cuentas que crean o activan el trabajo de transferencia).

Situaciones de ejemplo

En las siguientes situaciones, se muestran diferentes opciones de permisos con el agente de servicio y las cuentas de servicio administradas por el usuario.

Expande cada sección para ver los detalles.

Situación 1: Solo el agente de servicio

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

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

Cualquier usuario con los permisos correctos para crear un trabajo de transferencia puede transferir datos a los buckets A, B, C y D, o desde ellos.

Esto funciona bien cuando el usuario del Servicio de transferencia de almacenamiento es un usuario de confianza para los datos de todos los buckets y puede configurar los trabajos de transferencia correctamente para evitar mover datos hacia el bucket incorrecto o desde él.

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

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

  • A la cuenta de servicio #1 administrada por el usuario se le otorgan permisos en los buckets A y B.
  • A la cuenta de servicio administrada por el usuario núm. 2 se le otorgan permisos en los buckets C y D.

Además:

  • Se le otorga acceso al usuario alfa a la cuenta de servicio núm. 1.
  • Se le otorga acceso al usuario Bravo a la cuenta de servicio núm. 2.
  • Se le otorga acceso al usuario Charlie a las cuentas de servicio 1 y 2.

En este caso, ocurre lo siguiente:

  • Alpha solo se puede transferir entre los buckets A y B.
  • Bravo solo puede transferirse entre los buckets C y D.
  • Charlie solo puede transferirse entre buckets A y B, y entre C y D.
  • Charlie no puede transferirse entre A y C, A y D, B y C ni B y D.

Situación 3: Permisos combinados

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

  • El agente de servicio recibe permisos de escritura en los buckets A y B.
  • A la cuenta de servicio administrada por el usuario núm. 1 se le otorgan permisos de solo lectura en el bucket C y permisos de escritura en el bucket D.
  • Se le otorga acceso a Usuario alfa a la cuenta de servicio administrada por el usuario núm. 1.

En este caso, ocurre lo siguiente:

  • Cualquier usuario con los permisos correctos para crear un trabajo de transferencia puede transferir datos a los buckets A y B, o desde ellos. No se pueden transferir dentro ni fuera de bucket C o D.
  • El usuario Alfa puede transferir dinero a los buckets A y B, y viceversa.
  • Alpha puede transferir fuera del bucket C al bucket D.
  • Alpha no puede transferirse del bucket C a los buckets A o B.

Descripción general de la implementación

La implementación es la siguiente:

  • Creas una cuenta de servicio administrada por el usuario o usas una existente.
  • Otorga permisos:
    • Para que un usuario acceda a la cuenta de servicio administrada por el usuario
    • Para que el agente de servicio genere un token de acceso desde la cuenta de servicio administrada por el usuario.
    • Para que la cuenta de servicio administrada por el usuario acceda a tus buckets
  • El usuario crea un trabajo de transferencia que especifica la cuenta de servicio administrada por el usuario.
  • El Servicio de transferencia de almacenamiento verifica que el usuario tenga los permisos correctos en la cuenta de servicio. Si no se otorgaron los permisos correctos, fallará la creación del trabajo de transferencia.
  • El agente de servicio genera un token de OAuth en nombre de la cuenta de servicio administrada por el usuario. El token de OAuth permite que el Servicio de transferencia de almacenamiento acceda a los buckets involucrados en la transferencia.
  • Se ejecuta el trabajo de transferencia.
  • El token de OAuth es de corta duración y caduca. Si el trabajo de transferencia está en curso cuando vence el token, el Servicio de transferencia de almacenamiento genera uno nuevo y continúa con la transferencia.

Cómo configurar la delegación de permisos

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

Requisitos

  • Para crear una cuenta de servicio administrada por el usuario nueva, necesitas el rol de Creador de cuentas de servicio (roles/iam.serviceAccountCreator) en el proyecto.
  • Para otorgar acceso al usuario y al agente de servicio a la cuenta de servicio administrada por el usuario, necesitas el rol de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) en la cuenta de servicio administrada por el usuario o en el proyecto.

Crea o identifica una cuenta de servicio administrada por el usuario

Puedes crear una cuenta de servicio administrada por el usuario nueva o usar una existente.

  • Para crear una cuenta de servicio administrada por el usuario, sigue las instrucciones en Crea cuentas de servicio.

  • Para usar una cuenta de servicio existente administrada por el usuario, necesitas su dirección de correo electrónico, que usa 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 Habilita cuentas de servicio para conectarlas entre proyectos.

Otorga acceso al usuario

Otorga acceso a la cuenta de usuario a la nueva cuenta de servicio administrada por el usuario y asigna el rol de 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.

Consola de Google Cloud

  1. En la consola de Google Cloud , 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 electrónico de la cuenta de servicio administrada por el usuario.

  4. Selecciona la pestaña Permisos.

  5. Haz clic en Grant access.

  6. Ingresa 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. La función se otorgó a la principal en la cuenta de servicio.

gcloud

Para otorgarle un rol a una 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

Reemplaza las siguientes variables:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio administrada por el usuario en el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • PRINCIPAL: Es la dirección de correo electrónico del usuario que ejecuta el trabajo de transferencia, en el formato user:name@example.com.

Otorga acceso al agente de servicio

Para permitir que el agente de servicio genere un token de acceso desde la cuenta de servicio administrada por el usuario, otórgale acceso a la cuenta de servicio administrada por el usuario y asígnale el rol de Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).

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

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

    Se abrirá un panel interactivo con el título Prueba este método.

  2. En el panel, en Parámetros de solicitud, ingresa el ID del proyecto. El proyecto que especifiques aquí debe ser el proyecto que usas para administrar el Servicio de transferencia de almacenamiento.

  3. Haz clic en Ejecutar.

    El correo electrónico del agente de servicio se muestra como el valor de accountEmail. Usa el formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

Luego, para otorgar acceso al agente de servicio a la cuenta de servicio administrada por el usuario, haz lo siguiente:

Consola de Google Cloud

  1. En la consola de Google Cloud , 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 electrónico de la cuenta de servicio administrada por el usuario.

  4. Selecciona la pestaña Permisos.

  5. Haz clic en Grant access.

  6. Ingresa la dirección de correo electrónico del agente de servicio.

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

  8. Haz clic en Guardar. La función se otorgó a la principal en la cuenta de servicio.

gcloud

Para otorgarle un rol a una 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

Reemplaza las siguientes variables:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio administrada por el usuario en el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • SERVICE_AGENT_EMAIL: Es la dirección de correo electrónico del agente de servicio.

Otorga permisos de bucket a la cuenta de servicio administrada por el usuario

Otorga los permisos que se indican en Permisos de los agentes de servicio administrados por Google a la cuenta de servicio administrada por el usuario, en lugar de al agente de servicio.

Crea un trabajo de transferencia con una cuenta de servicio administrada por el usuario

Una vez que hayas otorgado los permisos correctos, podrás especificar la cuenta de servicio administrada por el usuario cuando crees un trabajo de transferencia nuevo.

Consola de Google Cloud

Sigue las instrucciones para crear una transferencia. Antes de finalizar el trabajo de transferencia, haz lo siguiente:

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

API de REST

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

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

Se acepta la dirección de correo electrónico de la cuenta de servicio (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) o el ID único (123456789012345678901) en la cadena. Se requiere el carácter comodín -; reemplazarlo por un ID del proyecto no es válido.

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": {
    ...
  }
}