En el caso de las transferencias sin agentes, el Servicio de transferencia de almacenamiento usa, de forma predeterminada, un agente de servicio para transferir tus datos entre la fuente y el destino. Otorga permisos al agente de servicio para acceder a tus buckets de Cloud Storage.
Debido a que todas las transferencias dentro de un proyecto usan el mismo agente de servicio de Servicio de transferencia de almacenamiento, este 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 la tarea 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 agente de servicio
En esta situación, 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 una tarea de transferencia puede transferir datos hacia o desde los buckets A, B, C y D.
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 o desde el bucket incorrecto.
Situación 2: Solo agentes de servicio administrados por el usuario
En esta situación, todos los permisos se otorgan a las cuentas de servicio administradas por el usuario.
- Se le otorgan permisos a la cuenta de servicio administrada por el usuario n° 1 en los buckets A y B.
- A la cuenta de servicio administrada por el usuario 2 se le otorgan permisos en los buckets C y D.
Además:
- Se le otorga acceso a la cuenta de servicio n° 1 al usuario Alfa.
- Se le otorga acceso a la cuenta de servicio n° 2 al usuario Bravo.
- Se le otorga acceso a las cuentas de servicio 1 y 2 al usuario Charlie.
En este caso, ocurre lo siguiente:
- Alpha solo puede transferir entre los buckets A y B.
- Bravo solo puede transferir entre los buckets C y D.
- Charlie solo puede transferir entre los buckets A y B, y entre C y D.
- Charlie no puede transferir entre A y C, A y D, B y C ni B y D.
Situación 3: Permisos mixtos
En esta situación, tu proyecto contiene una combinación de permisos de agente de servicio y permisos de cuenta de servicio administrados por el usuario.
- El agente de servicio tiene permisos de escritura en los buckets A y B.
- A la cuenta de servicio administrada por el usuario n° 1 se le otorgan permisos de solo lectura en el bucket C y permisos de escritura en el bucket D.
- Se le otorga acceso al usuario Alfa a la cuenta de servicio administrada por el usuario n° 1.
En este caso, ocurre lo siguiente:
- Cualquier usuario con los permisos correctos para crear una tarea de transferencia puede transferir datos hacia o desde los buckets A y B. No pueden transferirse dentro ni fuera del bucket C o D.
- El usuario Alfa puede transferir datos dentro o fuera de los buckets A y B.
- Alpha puede transferir datos del bucket C al bucket D.
- Alpha no puede transferir datos del bucket C al bucket 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 los siguientes 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 a partir de 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 una tarea 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, la creación del trabajo de transferencia fallará.
- 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 vence. Si la tarea 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 nueva cuenta de servicio administrada por el usuario, 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 cuentas 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 trabajo de transferencia, consulta Habilita cuentas de servicio para conectarlas entre proyectos.
Otorga acceso al usuario
Otorga a la cuenta de usuario acceso a la nueva cuenta de servicio administrada por el usuario y asigna el rol de usuario de la cuenta de servicio (roles/iam.serviceAccountUser
). La cuenta de usuario es la que se usa para crear o actualizar la tarea de transferencia.
Google Cloud console
En la Google Cloud consola, ve a la página Cuentas de servicio.
Selecciona un proyecto.
Haz clic en la dirección de correo electrónico de la cuenta de servicio administrada por el usuario.
Selecciona la pestaña Permisos.
Haz clic en
Grant access.Ingresa la dirección de correo electrónico del usuario. Por ejemplo,
user1@example.com
.En la lista desplegable Role, selecciona Service Account User.
Haz clic en Guardar. La función se otorgó a la principal en la cuenta de servicio.
gcloud
Para otorgarle un rol a un miembro, 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 la tarea 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, otorgue acceso al agente de servicio a la cuenta de servicio administrada por el usuario y asígnele 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, haz lo siguiente:
Ve a la página de referencia de
googleServiceAccounts.get
.Se abrirá un panel interactivo con el título Prueba este método.
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.
Haz clic en Ejecutar.
El correo electrónico del agente de servicio se muestra como el valor de
accountEmail
. Usa el formatoproject-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
.
Luego, para otorgarle acceso al agente de servicio a la cuenta de servicio administrada por el usuario, haz lo siguiente:
Google Cloud console
En la Google Cloud consola, ve a la página Cuentas de servicio.
Selecciona un proyecto.
Haz clic en la dirección de correo electrónico de la cuenta de servicio administrada por el usuario.
Selecciona la pestaña Permisos.
Haz clic en
Grant access.Ingresa la dirección de correo electrónico del agente de servicio.
En la lista desplegable Rol, selecciona Creador de tokens de cuenta de servicio.
Haz clic en Guardar. La función se otorgó a la principal en la cuenta de servicio.
gcloud
Para otorgarle un rol a un miembro, 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 del agente de servicio administrado por Google a la cuenta de servicio administrada por el usuario, en lugar del agente de servicio.
Crea una tarea de transferencia con una cuenta de servicio administrada por el usuario
Una vez que hayas otorgado los permisos correctos, puedes especificar la cuenta de servicio administrada por el usuario cuando crees un trabajo de transferencia nuevo.
Google Cloud console
Sigue las instrucciones para crear una transferencia. Antes de finalizar el trabajo de transferencia, haz lo siguiente:
- En la página Elegir configuración, busca la sección Tipo de cuenta de servicio.
- Selecciona Cuenta de servicio administrada por el usuario.
- 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
. - 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
.
En la cadena, se acepta el correo electrónico de la cuenta de servicio (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
) o el ID único (123456789012345678901
). El carácter comodín -
es obligatorio. No es válido reemplazarlo por un ID del 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": {
...
}
}