Delegar permissões de agente de serviço a uma conta serviço gerenciado pelo usuário

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 em todas as transferências de um projeto, ele tem permissões em todos os buckets envolvidos em cada transferência.

Como alternativa, é possível 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.

Abra cada seção para conferir 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 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 é um usuário confiável para os dados em todos os buckets e pode configurar os jobs de transferência corretamente para evitar a transferência de dados para o 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 1 recebe permissões nos buckets A e B.
  • A conta de serviço gerenciado pelo usuário 2 recebe permissões nos buckets C e D.

Além disso:

  • O usuário Alfa tem acesso à conta de serviço 1.
  • O usuário Bravo tem acesso à conta de serviço 2.
  • O usuário Charlie tem acesso às contas de serviço 1 e 2.

Nesse caso:

  • Alpha 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 buckets 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, o projeto contém 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 1 recebe permissões somente leitura no bucket C e permissões de gravação no bucket D.
  • O usuário Alfa tem acesso à conta de serviço gerenciado pelo usuário 1.

Nesse caso:

  • Qualquer usuário com as permissões corretas para criar um job de transferência pode transferir para ou dos buckets A e B. Não é possível transferir para ou sair do bucket C ou D.
  • O usuário Alfa pode transferir para ou dos buckets A e B.
  • O Alpha pode transferir para fora do bucket C para o bucket D.
  • O Alpha não pode transferir do bucket C para os buckets A ou B.

Visão geral da implementação

A implementação é a seguinte:

  • Crie uma conta serviço gerenciado pelo usuário ou use uma já existente.
  • Você concede permissões:
    • Para que um usuário acesse a conta de serviço gerenciado pelo usuário.
    • 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.
  • 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 tiverem sido 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 nova conta de serviço gerenciado pelo usuário, você precisa ter a 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

Você pode criar uma nova 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 de 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

  1. No console Google Cloud , acesse a página Contas de serviço.

    Acessar a página "Contas de serviço"

  2. Selecione um projeto.

  3. Clique no endereço de e-mail da conta serviço gerenciado pelo usuário.

  4. Selecione a guia Permissões.

  5. Clique em CONCEDER ACESSO.

  6. Insira o endereço de e-mail do usuário. Por exemplo, user1@example.com

  7. Na lista suspensa Papel, selecione Usuário da conta de serviço.

  8. 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 formulário 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 ao agente de serviço acesso a essa conta e atribua o papel de Criador do 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:

  1. Acesse a página de referência de googleServiceAccounts.get.

    Você verá um painel interativo com o título Testar este método.

  2. 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.

  3. Clique em Executar.

    O e-mail do agente de serviço é retornado como o valor de accountEmail. Ele usa o formato project-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

  1. No console Google Cloud , acesse a página Contas de serviço.

    Acessar a página "Contas de serviço"

  2. Selecione um projeto.

  3. Clique no endereço de e-mail da conta serviço gerenciado pelo usuário.

  4. Selecione a guia Permissões.

  5. Clique em CONCEDER ACESSO.

  6. Insira o endereço de e-mail do agente de serviço.

  7. Na lista suspensa Papel, selecione Criador de token de conta de serviço.

  8. 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 formulário SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • SERVICE_AGENT_EMAIL: o endereço de e-mail do agente de serviço.

Conceder permissões do 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, é possível especificar a conta de serviço gerenciada pelo usuário ao criar um novo 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:

  1. Na página Escolher configurações, encontre a seção Tipo de conta de serviço.
  2. Selecione Conta de serviço gerenciado pelo usuário.
  3. Insira o e-mail da conta de serviço gerenciado pelo usuário usando o formato SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com.
  4. 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 usar o 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": {
    ...
  }
}