Para transferências sem agente, o Serviço de transferência do Cloud Storage usa por padrão um agente de serviço para transferir seus dados entre a origem e o destino. Você concede permissões ao agente de serviço para acessar seus buckets do Cloud Storage.
Como o mesmo agente de serviço do Serviço de transferência do Cloud Storage é usado por todas as transferências em um projeto, ele necessariamente tem permissões em todos os buckets envolvidos em cada transferência.
Como alternativa, você pode atribuir permissões de bucket a várias contas de serviço gerenciado pelo usuário. Essas contas de serviço gerenciado pelo usuário recebem permissões em buckets de origem e destino específicos e também são restritas a contas de usuário específicas (as contas que criam ou acionam o job de transferência).
Exemplos de cenários
Os cenários a seguir demonstram diferentes opções de permissão usando o agente de serviço e as contas de serviço gerenciado pelo usuário.
Expanda cada seção para ver os detalhes.
Cenário 1: somente agente de serviço
Nesse cenário, todas as permissões são concedidas ao agente de serviço.
- O agente de serviço recebe permissões de gravação nos buckets A, B, C e D.
Qualquer usuário com as permissões corretas para criar um job de transferência pode transferir dados para ou de buckets A, B, C e D.
Isso funciona bem quando o usuário do Serviço de transferência do Cloud Storage é confiável para os dados em todos os buckets e pode configurar jobs de transferência corretamente para evitar mover dados para dentro ou para fora do bucket errado.
Cenário 2: somente agentes de serviço gerenciado pelo usuário
Nesse cenário, todas as permissões são concedidas a contas de serviço gerenciado pelo usuário.
- A conta de serviço gerenciado pelo usuário nº 1 recebe permissões nos buckets A e B.
- A conta serviço gerenciado pelo usuário nº 2 recebe permissões nos buckets C e D.
Além disso:
- O usuário Alpha recebe acesso à conta de serviço nº 1.
- O usuário Bravo recebe acesso à conta de serviço nº 2.
- O usuário Charlie recebe acesso às contas de serviço 1 e 2.
Nesse caso:
- A versão Alfa só pode transferir entre os buckets A e B.
- O Bravo só pode transferir entre os buckets C e D.
- Charlie só pode transferir entre os grupos A e B, e entre C e D.
- Charlie não pode transferir entre A e C, A e D, B e C ou B e D.
Cenário 3: permissões mistas
Nesse cenário, seu projeto tem uma mistura de permissões de agente de serviço e permissões de conta de serviço gerenciado pelo usuário.
- O agente de serviço recebe permissões de gravação nos buckets A e B.
- A conta de serviço gerenciado pelo usuário nº 1 recebe permissões de somente leitura no bucket C e de gravação no bucket D.
- O usuário Alfa recebe acesso à conta serviço gerenciado pelo usuário nº 1.
Nesse caso:
- Qualquer usuário com as permissões corretas para criar um job de transferência pode transferir dados para dentro ou para fora dos buckets A e B. Não é possível transferir para dentro ou fora dos buckets C ou D.
- O usuário Alfa pode entrar ou sair dos grupos A e B.
- O Alpha pode transferir para fora do bucket C para o bucket D.
- O Alpha não pode ser transferido do bucket C para o A ou B.
Visão geral da implementação
A implementação é a seguinte:
- Você cria ou usa uma conta de serviço gerenciado pelo usuário.
- Você concede permissões:
- Para um usuário acessar a conta de serviço gerenciado por ele.
- Para que o agente de serviço gere um token de acesso da conta de serviço gerenciado pelo usuário.
- Para que a conta de serviço gerenciado pelo usuário acesse seus buckets.
- O usuário cria um job de transferência que especifica a conta de serviço gerenciado pelo usuário.
- O Serviço de transferência do Cloud Storage verifica se o usuário tem as permissões corretas na conta de serviço. Se as permissões corretas não forem concedidas, a criação do job de transferência vai falhar.
- O agente de serviço gera um token OAuth em nome da conta de serviço gerenciada pelo usuário. O token OAuth permite que o Serviço de transferência do Cloud Storage acesse os buckets envolvidos na transferência.
- O job de transferência é executado.
- O token OAuth é de curta duração e expira. Se o job de transferência estiver em andamento quando o token expirar, o serviço de transferência do Cloud Storage vai gerar um novo e continuar a transferência.
Configurar a delegação de permissões
Siga as instruções para delegar o acesso do agente de serviço a uma conta de serviço gerenciada pelo usuário.
Requisitos
- Para criar uma conta de serviço gerenciado pelo usuário, você precisa da função Criar contas de serviço (
roles/iam.serviceAccountCreator
) no projeto. - Para conceder acesso ao usuário e ao agente de serviço à conta de serviço gerenciada pelo usuário, você precisa do papel de administrador da conta de serviço (
roles/iam.serviceAccountAdmin
) na conta de serviço gerenciado pelo usuário ou no projeto.
Criar ou identificar uma conta de serviço gerenciado pelo usuário
É possível criar uma conta serviço gerenciado pelo usuário ou usar uma já existente.
Para criar uma conta serviço gerenciado pelo usuário, siga as instruções em Criar contas de serviço.
Para usar uma conta serviço gerenciado pelo usuário, você precisa do endereço de e-mail dela, que usa o seguinte formato:
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Se a conta de serviço estiver em um projeto diferente do job de transferência, consulte Ativar a vinculação de contas de serviço entre projetos.
Conceder acesso ao usuário
Conceda à conta de usuário acesso à nova conta de serviço gerenciado pelo usuário e
atribua o papel Usuário da conta de serviço (roles/iam.serviceAccountUser
).
A conta de usuário é a que está sendo usada para criar ou atualizar o job de transferência.
Console do Google Cloud
No console Google Cloud , acesse a página Contas de serviço.
Selecione um projeto.
Clique no endereço de e-mail da conta serviço gerenciado pelo usuário.
Selecione a guia Permissões.
Clique em
CONCEDER ACESSO.Insira o endereço de e-mail do usuário. Por exemplo,
user1@example.com
Na lista suspensa Papel, selecione Usuário da conta de serviço.
Clique em Salvar. O principal recebe o papel na conta de serviço.
gcloud
Para conceder um papel a um principal, execute o
comando add-iam-policy-binding
:
gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \ --member=PRINCIPAL --role=roles/iam.serviceAccountUser
Substitua as seguintes variáveis:
- USER_MANAGED_SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço gerenciado pelo usuário no formato
SA_NAME@PROJECT_ID.iam.gserviceaccount.com
. - PRINCIPAL: o endereço de e-mail do usuário que está executando o job de transferência, no formato
user:name@example.com
.
Conceder acesso ao agente de serviço
Para permitir que o agente de serviço gere um token de acesso da
conta de serviço gerenciado pelo usuário, conceda a ele acesso à
conta de serviço gerenciado pelo usuário e atribua o papel de Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator
).
Você precisa do endereço de e-mail do agente de serviço para conceder acesso. Para encontrar o e-mail do agente de serviço:
Acesse a página de referência de
googleServiceAccounts.get
.Você verá um painel interativo com o título Testar este método.
No painel, em Parâmetros de solicitação, insira o ID do projeto. O projeto especificado aqui precisa ser o que você está usando para gerenciar o Serviço de transferência do Cloud Storage.
Clique em Executar.
O e-mail do agente de serviço é retornado como o valor de
accountEmail
. Ele usa o formatoproject-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
.
Em seguida, para conceder ao agente de serviço acesso à conta de serviço gerenciado pelo usuário:
Console do Google Cloud
No console Google Cloud , acesse a página Contas de serviço.
Selecione um projeto.
Clique no endereço de e-mail da conta serviço gerenciado pelo usuário.
Selecione a guia Permissões.
Clique em
CONCEDER ACESSO.Digite o endereço de e-mail do agente de serviço.
Na lista suspensa Papel, selecione Criador de token de conta de serviço.
Clique em Salvar. O principal recebe o papel na conta de serviço.
gcloud
Para conceder um papel a um principal, execute o
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
Substitua as seguintes variáveis:
- USER_MANAGED_SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço gerenciado pelo usuário no formato
SA_NAME@PROJECT_ID.iam.gserviceaccount.com
. - SERVICE_AGENT_EMAIL: o endereço de e-mail do agente de serviço.
Conceder permissões de bucket à conta de serviço gerenciado pelo usuário
Conceda as permissões listadas em Permissões do agente de serviço gerenciado pelo Google à conta de serviço gerenciada pelo usuário, em vez de ao agente de serviço.
Criar um job de transferência usando uma conta serviço gerenciado pelo usuário
Depois de conceder as permissões corretas, você pode especificar a conta de serviço gerenciada pelo usuário ao criar um job de transferência.
Console do Google Cloud
Siga as instruções para criar uma transferência. Antes de finalizar o job de transferência:
- Na página Escolher configurações, encontre a seção Tipo de conta de serviço.
- Selecione Conta de serviço gerenciado pelo usuário.
- Insira o e-mail da conta de serviço gerenciado pelo usuário, usando o formato
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
. - Clique em Criar para criar o job de transferência.
API REST
Especifique a conta de serviço gerenciado pelo usuário como o valor do campo serviceAccount
na solicitação transferJobs.create
.
O valor precisa estar no formato projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID
.
O e-mail da conta de serviço (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
) ou o ID exclusivo (123456789012345678901
) são aceitos na string. O caractere curinga -
é obrigatório. Não é permitido substituí-lo por um ID do projeto.
Exemplo:
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": {
...
}
}