Configuración de la cola segura

En esta página, se proporcionan sugerencias para implementar prácticas recomendadas a fin de proteger la creación y la configuración de colas, lo que incluye minimizar los errores descritos en Usa la administración de colas o queue.yaml. La clave es restringir los métodos de administración de colas a un pequeño conjunto de personas o entidades. En el caso de las organizaciones grandes, podría ser necesario usar una cuenta de servicio para ejecutar software que aplique una configuración de colas adecuada.

La idea general es separar a los usuarios y a las demás entidades en tres categorías.

  1. Administradores de colas: Los usuarios de este grupo tienen permiso para llamar a los métodos de administración de colas de Cloud Tasks o para subir archivos queue.yaml. Este grupo está restringido a un pequeño conjunto de usuarios a fin de reducir el riesgo de configuración de la cola, en particular cuando se mezcla inadvertidamente queue.yaml y los métodos de administración de colas de Cloud Tasks.
  2. Trabajadores de Cloud Tasks: Los usuarios de este grupo tienen permiso para realizar interacciones comunes con Cloud Tasks como poner tareas en una cola o quitarlas. No tienen permiso para llamar a los métodos de administración de colas de Cloud Tasks.
  3. Implementadores de App Engine: Para los proyectos que tienen aplicaciones de App Engine, los usuarios de este grupo tienen permiso para implementar la aplicación. No pueden subir archivos queue.yaml ni realizar llamadas a la API de Cloud Tasks, lo que permite a los administradores de colas aplicar las políticas adecuadas.

En este esquema, los usuarios que son administradores de colas no deberían ser también trabajadores de Cloud Tasks, ya que en ese caso la separación sería inútil.

Si tu proyecto usa los métodos de administración de colas de Cloud Tasks exclusivamente, tal vez sea conveniente que los administradores de colas no sean también implementadores de App Engine, ya que esto haría posible que alguien suba un archivo queue.yaml por error.

Proyectos y organizaciones pequeños

Las organizaciones y los proyectos pequeños pueden asignar funciones de administración de identidades y accesos (IAM) directamente a los usuarios para ubicarlos en los grupos anteriores. Esto tiene sentido para los equipos que prefieren una configuración más simple o que hacen cambios en la configuración de las colas o implementaciones de aplicaciones de App Engine manualmente.

Para agregar usuarios a estos grupos, sigue estos pasos:

Administrador de colas

  1. Como administrador del proyecto, otorga la función cloudtasks.queueAdmin a los usuarios que pueden realizar llamadas a la API de administración de colas de Cloud Tasks o subir archivos queue.yaml.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/cloudtasks.queueAdmin
    
  2. Como usuario con la función cloudtasks.queueAdmin, sigue las prácticas recomendadas anteriores y elige uno de los siguientes métodos para cambiar la configuración de la cola.

    1. Usar la API de Cloud Tasks para cambiar la configuración de las colas

    2. Sube queue.yaml con gcloud:

      gcloud app deploy queue.yaml
      

Trabajador de Cloud Tasks

Como a menudo hay muchos usuarios autorizados a interactuar con Cloud Tasks, puedes asignar funciones a las cuentas de servicio en lugar de usuarios individuales. Este tipo de uso es común en la producción. Para obtener más información, consulta Proyectos y organizaciones grandes.

  1. Como administrador del proyecto, otorga funciones a los usuarios que tienen permiso para interactuar con Cloud Tasks, pero no para cambiar la configuración de las colas:

    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
    

Como usuario con una o más de las funciones otorgadas en los pasos anteriores, puedes interactuar con la API de Cloud Tasks.

Implementador de App Engine

  1. Como administrador del proyecto, otorga funciones a los usuarios que tienen permiso para implementar aplicaciones de App Engine, pero no tienen permitido modificar las configuraciones de las colas ni interactuar con las tareas:

    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 usuario con las funciones otorgadas en los pasos anteriores, implementa una aplicación de App Engine:

    gcloud app deploy app.yaml
    

Proyectos y organizaciones grandes

Los proyectos y las organizaciones grandes pueden usar cuentas de servicio para separar los deberes y las responsabilidades. Esto tiene sentido para los equipos con infraestructura compleja a fin de cambiar la configuración de las colas y, quizás, implementar aplicaciones de App Engine.

Por lo general, las instrucciones a continuación son adecuadas cuando la configuración de la cola y la interacción con Cloud Tasks, y la posible implementación de la aplicación de App Engine, se realizan directamente a través de un software. Esto también permite proteger la configuración de las colas sin necesidad de que todos los miembros del equipo comprendan el contenido de esta página.

Por ejemplo, puedes crear una aplicación web o una herramienta de línea de comandos que todos los usuarios deban emplear para crear, actualizar y borrar colas. Si esa herramienta usa métodos de administración de colas de Cloud Tasks o queue.yaml es un detalle de implementación de la herramienta por el que los usuarios no deben preocuparse. Si la herramienta es la única entidad en el grupo de administradores de colas, puedes garantizar que nadie mezclará por error los métodos de administración de colas de Cloud Tasks y el uso de queue.yaml.

A continuación, se brindan instrucciones para configurar estas cuentas de servicio.

Administrador de colas

  1. Como administrador del proyecto, crea la cuenta de servicio.

    gcloud iam service-accounts create queue-admin \
      --display-name "Queue Admin"
    
  2. Otorga la función cloudtasks.queueAdmin a la cuenta de servicio para que pueda subir archivos queue.yaml y realizar llamadas a la API de administración de colas de Cloud Tasks.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.queueAdmin
    
  3. Otorga la función iam.serviceAccountActor a usuarios humanos, grupos y otras entidades que pueden cambiar la configuración de la cola. Debería ser un número muy reducido de personas (p. ej., los administradores) con permiso para responder en caso de emergencia.

    gcloud iam service-accounts add-iam-policy-binding \
      queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. Crea una clave de cuenta de servicio de modo que un usuario humano o alguna otra entidad puedan asumir la identidad de la cuenta de servicio.

    gcloud iam service-accounts keys create \
      --iam-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      ~/queue-admin-service-account-key.json
    
  5. Como usuario o entidad de otro tipo con la función iam.serviceAccountActor, supone la identidad de la cuenta de servicio.

    gcloud auth activate-service-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/queue-admin-service-account-key.json
    
  6. Sigue las prácticas recomendadas anteriores y selecciona solo uno de los siguientes métodos para cambiar la configuración de las colas:

    1. Usar Cloud Tasks para cambiar la configuración de las colas

    2. Sube queue.yaml con gcloud:

      gcloud app deploy queue.yaml
      

Trabajador de Cloud Tasks

  1. Como administrador del proyecto, crea la cuenta de servicio.

    gcloud iam service-accounts create cloud-tasks-worker \
      --display-name "Cloud Tasks Worker"
    
  2. Otórgale funciones a la cuenta de servicio para que pueda interactuar con Cloud Tasks, pero no cambiar la configuración de las colas.

    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. Otorga la función iam.serviceAccountActor a usuarios humanos, grupos y otras entidades que pueden usar la API de Cloud Tasks en tu proyecto.

    gcloud iam service-accounts add-iam-policy-binding \
      cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. Crea una clave de cuenta de servicio de modo que un usuario humano o alguna otra entidad puedan asumir la identidad de la cuenta de servicio.

    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 usuario o entidad de otro tipo con la función iam.serviceAccountActor, supone la identidad de la cuenta de servicio.

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

Implementador de App Engine

  1. Como administrador del proyecto, crea la cuenta de servicio.

    gcloud iam service-accounts create app-engine-deployer \
      --display-name "App Engine Deployer"
    
  2. Otorga funciones a la cuenta de servicio para que pueda implementar aplicaciones de App Engine, pero no 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. Otorga la función iam.serviceAccountActor a usuarios humanos, grupos y otras entidades que pueden implementar la aplicación de 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. Crea una clave de cuenta de servicio de modo que un usuario humano o alguna otra entidad puedan asumir la identidad de la cuenta de servicio.

    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 usuario o entidad de otro tipo con la función iam.serviceAccountActor, supone la identidad de la cuenta de servicio.

    gcloud auth activate-service-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/app-engine-deployer-service-account-key.json
    
  6. Implementa la aplicación de App Engine.

    gcloud app deploy app.yaml
    

Limita el acceso a colas únicas

Para limitar el acceso por cola, usa el comando gcloud tasks queues add-iam-policy-binding que especifica la cola mediante el argumento QUEUE. Por ejemplo, para una cola llamada my-queue, sucede lo siguiente:

    gcloud tasks queues add-iam-policy-binding my-queue --location=my-location \
    --member=serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
    --role=roles/cloudtasks.enqueuer

Más información sobre las cuentas de servicio

Para obtener una explicación completa de las cuentas de servicio, consulta las siguientes páginas: