Como proteger a configuração da fila

Nesta página, fornecemos sugestões para implementar as práticas recomendadas para proteger a criação e a configuração de filas, inclusive minimizando as armadilhas descritas em Como usar o gerenciamento de filas versus o queue.yaml. A chave é restringir os métodos de gerenciamento de filas a um pequeno conjunto de pessoas ou entidades. Para grandes organizações, pode ser necessário usar uma conta de serviço para executar o software que impõe a configuração adequada da fila.

A ideia geral é separar usuários e outras entidades em três categorias:

  1. Administradores de filas: os usuários neste grupo têm permissão para chamar métodos de gerenciamento de filas do Cloud Tasks ou fazer upload de arquivos queue.yaml. Esse grupo é restrito a um conjunto muito pequeno de usuários, a fim de reduzir o risco de destruição da configuração da fila, misturando inadvertidamente os métodos de gerenciamento de filas queue.yaml e Cloud Tasks.
  2. Workers do Cloud Tasks: os usuários deste grupo têm permissão para realizar interações comuns com o Cloud Tasks, como tarefas de enfileiramento e desenfileiramento. Eles não tem permissão para chamar os métodos de gerenciamento de filas do Cloud Tasks.
  3. Implantadores do App Engine: para projetos que têm aplicativos do App Engine, os usuários deste grupo têm permissão para implantar o aplicativo. Eles não têm permissão para fazer upload de arquivos queue.yaml ou fazer chamadas de API Cloud Tasks, permitindo, assim, que os administradores da fila apliquem as políticas adequadas.

Nesse esquema, os usuários que são administradores de filas não são também trabalhadores do Cloud Tasks, já que isso anularia a finalidade da separação.

Se o projeto usa exclusivamente métodos de gerenciamento de filas do Cloud Tasks, talvez os administradores de filas também não devam ser implantadores do App Engine, já que isso permite o upload de um arquivo queue.yaml incorreto.

Pequenos projetos e organizações

Os pequenos projetos e organizações podem atribuir papéis do gerenciamento de identidade e acesso (IAM, na sigla em inglês) diretamente aos usuários para inseri-los nos grupos acima. Isso faz sentido para as equipes que preferem a simplicidade de configuração ou que fazem mudanças de configuração de filas ou implantações manuais de aplicativos do App Engine.

Adicione usuários a esses grupos da seguinte maneira:

Administrador de filas

  1. Como administrador do projeto, conceda o papel cloudtasks.queueAdmin aos usuários que têm permissão para fazer chamadas de API de gerenciamento de filas do Cloud Tasks ou fazer upload de arquivos queue.yaml.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/cloudtasks.queueAdmin
    
  2. Como um usuário com o papel cloudtasks.queueAdmin, seguindo as práticas recomendadas acima, escolha um dos seguintes métodos para alterar a configuração da fila.

    1. Altere a configuração da fila com a API Cloud Tasks.

    2. Faça upload de queue.yaml com gcloud:

      gcloud app deploy queue.yaml
      

Worker do Cloud Tasks

Como geralmente há muitos usuários autorizados a interagir com o Cloud Tasks, é possível atribuir papéis a contas de serviço em vez de usuários individuais. Esse tipo de uso é comum na produção. Para mais informações, consulte Grandes projetos e organizações.

  1. Como administrador do projeto, atribua papéis aos usuários que têm permissão para interagir com o Cloud Tasks, mas não podem alterar a configuração de filas:

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    

Um usuário com um ou mais dos papéis acima poderá interagir com a API Cloud Tasks.

Implantador do App Engine

  1. Como administrador do projeto, atribua papéis aos usuários que têm permissão para implantar aplicativos do App Engine, mas que não têm permissão para modificar a configuração de filas ou interagir com tarefas:

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/storage.admin
    
  2. Como um usuário com os papéis atribuídos acima, implante um aplicativo do App Engine.

    gcloud app deploy app.yaml
    

Grandes projetos e organizações

Grandes projetos e organizações podem usar contas de serviço para separar tarefas e responsabilidades. Isso é útil para equipes que usam uma infraestrutura complexa para alterar a configuração de filas e, talvez, implantar aplicativos do App Engine.

Geralmente, as instruções a seguir são apropriadas quando a configuração de filas e a interação com o Cloud Tasks e, potencialmente, a implantação de aplicativos do App Engine, são realizadas por meio de software, e não diretamente por um usuário humano. Isso também permite proteger a configuração de filas sem exigir que todos os membros da equipe compreendam o conteúdo desta página.

Por exemplo, você pode criar um aplicativo da Web ou uma ferramenta de linha de comando que todos os usuários têm que usar para criar, atualizar e excluir filas. Se a ferramenta usar os métodos de gerenciamento de filas do Cloud Tasks ou queue.yaml for um detalhe de implementação da ferramenta com o qual os usuários não precisam se preocupar. Se a ferramenta for a única entidade no grupo de administradores de fila, garanta que não haja uma mistura acidental de métodos de gerenciamento de filas do Cloud Tasks e do uso de queue.yaml.

Veja a seguir as instruções para configurar essas contas de serviço.

Administrador de filas

  1. Como administrador do projeto, crie a conta de serviço.

    gcloud iam service-accounts create queue-admin \
      --display-name "Queue Admin"
    
  2. Conceda o papel cloudtasks.queueAdmin à conta de serviço para que ela possa fazer upload de arquivos de queue.yaml e fazer chamadas de API de gerenciamento de filas do Cloud Tasks.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.queueAdmin
    
  3. Conceda o papel iam.serviceAccountActor a usuários humanos, grupos ou outras entidades com permissão para alterar a configuração da fila. O número de pessoas precisa ser muito reduzido, por exemplo: administradores com permissão para responder em emergências.

    gcloud iam service-accounts add-iam-policy-binding \
      queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. Crie uma chave de conta de serviço para que um usuário humano ou outra entidade possa usar a identidade da conta de serviço.

    gcloud iam service-accounts keys create \
      --iam-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      ~/queue-admin-service-account-key.json
    
  5. Como usuário ou outra entidade com o papel iam.serviceAccountActor, presuma a identidade da conta de serviço.

    gcloud auth activate-service-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/queue-admin-service-account-key.json
    
  6. Seguindo as práticas recomendadas acima, escolha apenas um dos métodos a seguir para alterar a configuração da fila:

    1. Use o Cloud Tasks para alterar a configuração da fila.

    2. Faça upload de queue.yaml com gcloud:

      gcloud app deploy queue.yaml
      

Worker do Cloud Tasks

  1. Como administrador do projeto, crie a conta de serviço.

    gcloud iam service-accounts create cloud-tasks-worker \
      --display-name "Cloud Tasks Worker"
    
  2. Atribua papéis à conta de serviço para possibilitar a interação com o Cloud Tasks, mas não a alteração da configuração de filas.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    
  3. Conceda o papel iam.serviceAccountActor a usuários humanos, grupos ou outras entidades que tenham permissão para usar a API Cloud Tasks em seu projeto.

    gcloud iam service-accounts add-iam-policy-binding \
      cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. Crie uma chave de conta de serviço para que um usuário humano ou outra entidade possa usar a identidade da conta de serviço.

    gcloud iam service-accounts keys create \
      --iam-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      ~/cloud-tasks-worker-service-account-key.json
    
  5. Como usuário ou outra entidade com o papel iam.serviceAccountActor, presuma a identidade da conta de serviço.

    gcloud auth activate-service-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/cloud-tasks-worker-service-account-key.json
    
  6. Use a API Cloud Tasks.

Implantador do App Engine

  1. Como administrador do projeto, crie a conta de serviço.

    gcloud iam service-accounts create app-engine-deployer \
      --display-name "App Engine Deployer"
    
  2. Conceda papéis à conta de serviço para que ela possa implantar aplicativos do App Engine, mas não queue.yaml.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/storage.admin
    
  3. Conceda o papel iam.serviceAccountActor a usuários humanos, grupos ou outras entidades com permissão para implantar o aplicativo do App Engine.

    gcloud iam service-accounts add-iam-policy-binding \
      app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. Crie uma chave de conta de serviço para que um usuário humano ou outra entidade possa usar a identidade da conta de serviço.

    gcloud iam service-accounts keys create \
      --iam-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      ~/app-engine-deployer-service-account-key.json
    
  5. Como usuário ou outra entidade com o papel iam.serviceAccountActor, presuma a identidade da conta de serviço.

    gcloud auth activate-service-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/app-engine-deployer-service-account-key.json
    
  6. Implante o aplicativo do App Engine.

    gcloud app deploy app.yaml
    

Mais informações sobre contas de serviço

Para uma explicação abrangente das contas de serviço, consulte as seguintes páginas: