Configurar el control de acceso

El control de acceso determina quién tiene permiso para acceder a los servicios y recursos de un Google Cloud proyecto. En App Engine, hay varios casos prácticos independientes para configurar el control de acceso:

  • Conceder acceso a los miembros del equipo a tu proyecto de Google Cloud para que puedan configurar servicios e implementar aplicaciones.

  • Conceder acceso a tu aplicación a servicios de Google Cloud, como Cloud Storage. Todos los servicios de Cloud requieren autenticación y autorización para cada llamada a la API, incluidas las llamadas de tu aplicación de App Engine.

  • Conceder acceso a los recursos de un Google Cloud proyecto a los usuarios. Aunque este caso práctico no es habitual, puede haber situaciones en las que tu aplicación necesite solicitar acceso a un recurso de Cloud en nombre de un usuario. Por ejemplo, es posible que tu aplicación necesite acceder a datos que pertenecen a tus usuarios.

En esta página se ofrece una descripción general de cómo configurar el control de acceso en cada caso práctico.

Para obtener información general sobre cómo gestiona Google Cloud Platform el control de acceso, consulta la descripción general de Gestión de Identidades y Accesos (IAM).

Conceder acceso a los miembros del equipo

Para dar acceso a un desarrollador a tu Google Cloud proyecto, crea uno o ambos de los siguientes elementos:

  • Una cuenta de usuario, que está asociada a una cuenta de Google y representa a una persona concreta en tu proyecto.

    Una cuenta de usuario se puede usar para autenticarte en las siguientes herramientas:

    • Google Cloud consola
    • Google Cloud CLI
    • IDEs y herramientas de compilación que usan gcloud CLI para probar y desplegar aplicaciones de App Engine
  • Una cuenta de servicio, que representa una aplicación o un proceso en lugar de a una persona. Usa cuentas de servicio en tus procesos automatizados de compilación, prueba y despliegue, sobre todo si varios desarrolladores pueden ejecutar estos procesos.

    Una cuenta de servicio se puede usar para autenticarte desde las siguientes herramientas:

    • CLI de gcloud
    • IDEs y herramientas de compilación que usan las herramientas de gcloud CLI para probar y desplegar aplicaciones de App Engine

Crear una cuenta de usuario

  1. Abre la página de IAM en la Google Cloud consola.

    Abre la página de gestión de identidades y accesos.

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. Haz clic en Añadir.

  4. Introduce una dirección de correo electrónico.

  5. Selecciona los roles que conceden acceso a las funciones de App Engine.

    Si el usuario también necesita acceder a otros servicios de Cloud, selecciona roles que le permitan acceder a otros servicios de Cloud.

  6. Haz clic en Guardar.

Ahora el usuario puede iniciar sesión en la consola de Google Cloud y autorizar la CLI de gcloud.

También puedes crear cuentas de usuario desde gcloud, la API REST o bibliotecas de cliente.

Creando una cuenta de servicio

  1. Abre la página Cuentas de servicio en la consola de Google Cloud .

    Abre la página Cuentas de servicio.

  2. Selecciona el proyecto y haz clic en Abrir.

  3. Haz clic en Create Service Account (Crear cuenta de servicio).

  4. Introduce un nombre de cuenta de servicio. Debe ser un nombre fácil de usar para mostrar.

  5. Haz clic en Crear.

  6. Selecciona los roles que conceden acceso a las funciones de App Engine.

    Si la cuenta de servicio también necesita acceder a otros servicios de Cloud, selecciona los roles que le concedan acceso a otros servicios de Cloud.

  7. Haz clic en Continuar.

  8. Opcionalmente, especifica las cuentas de usuario que pueden gestionar la cuenta de servicio. También puedes especificar las cuentas de usuario que pueden usar la cuenta de servicio para acceder indirectamente a todos los recursos a los que tiene acceso la cuenta de servicio.

  9. Haz clic en Guardar.

    Se muestra una lista de las cuentas de servicio disponibles.

  10. Si necesitas usar tu cuenta de servicio fuera deGoogle Cloud, sigue las instrucciones para crear una clave de cuenta de servicio.

Pasos siguientes

  • Si vas a usar la cuenta de servicio en tus procesos automatizados de compilación y despliegue, autoriza la CLI de gcloud con una cuenta de servicio.
  • Si utilizas la cuenta de servicio con un IDE, sigue las instrucciones que te proporcione el IDE.
  • Si necesitas usar una identidad única para una versión de tu aplicación de App Engine al acceder a otros servicios o ejecutar tareas, puedes especificar una cuenta de servicio gestionada por el usuario en App Engine. Google Cloud

Conceder acceso a los servicios de Cloud a tu aplicación

Cada llamada a un servicio de Cloud debe autenticarse y autorizarse, incluidas las llamadas de una aplicación de App Engine a otros servicios de Cloud, como Cloud Storage.

De forma predeterminada, las llamadas de tu aplicación de App Engine a los servicios del mismo proyecto están autorizadas. Así funciona el flujo predeterminado:

  1. Para iniciar llamadas a un servicio de Cloud, tu aplicación crea un objeto cliente, que contiene las credenciales y otros datos que necesita tu aplicación para interactuar con el servicio. Si no especificas las credenciales en el constructor del cliente, el cliente buscará las credenciales en el entorno de la aplicación.

    A continuación, se muestra un ejemplo de cómo crear un cliente para Cloud Storage:

    Go

    
    // implicit uses Application Default Credentials to authenticate.
    func implicit() {
    	ctx := context.Background()
    
    	// For API packages whose import path is starting with "cloud.google.com/go",
    	// such as cloud.google.com/go/storage in this case, if there are no credentials
    	// provided, the client library will look for credentials in the environment.
    	storageClient, err := storage.NewClient(ctx)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer storageClient.Close()
    
    	it := storageClient.Buckets(ctx, "project-id")
    	for {
    		bucketAttrs, err := it.Next()
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			log.Fatal(err)
    		}
    		fmt.Println(bucketAttrs.Name)
    	}
    
    	// For packages whose import path is starting with "google.golang.org/api",
    	// such as google.golang.org/api/cloudkms/v1, use NewService to create the client.
    	kmsService, err := cloudkms.NewService(ctx)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	_ = kmsService
    }
    

    Java

    static void authImplicit() {
      // If you don't specify credentials when constructing the client, the client library will
      // look for credentials via the environment variable GOOGLE_APPLICATION_CREDENTIALS.
      Storage storage = StorageOptions.getDefaultInstance().getService();
    
      System.out.println("Buckets:");
      Page<Bucket> buckets = storage.list();
      for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
      }
    }

    Node.js

    // Imports the Google Cloud client library.
    const {Storage} = require('@google-cloud/storage');
    
    // Instantiates a client. If you don't specify credentials when constructing
    // the client, the client library will look for credentials in the
    // environment.
    const storage = new Storage();
    // Makes an authenticated API request.
    async function listBuckets() {
      try {
        const results = await storage.getBuckets();
    
        const [buckets] = results;
    
        console.log('Buckets:');
        buckets.forEach(bucket => {
          console.log(bucket.name);
        });
      } catch (err) {
        console.error('ERROR:', err);
      }
    }
    listBuckets();

    PHP

    // Imports the Cloud Storage client library.
    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Authenticate to a cloud client library using a service account implicitly.
     *
     * @param string $projectId The Google project ID.
     */
    function auth_cloud_implicit($projectId)
    {
        $config = [
            'projectId' => $projectId,
        ];
    
        # If you don't specify credentials when constructing the client, the
        # client library will look for credentials in the environment.
        $storage = new StorageClient($config);
    
        # Make an authenticated API request (listing storage buckets)
        foreach ($storage->buckets() as $bucket) {
            printf('Bucket: %s' . PHP_EOL, $bucket->name());
        }
    }

    Python

    def implicit():
        from google.cloud import storage
    
        # If you don't specify credentials when constructing the client, the
        # client library will look for credentials in the environment.
        storage_client = storage.Client()
    
        # Make an authenticated API request
        buckets = list(storage_client.list_buckets())
        print(buckets)
    
    

    Ruby

    # project_id = "Your Google Cloud project ID"
    
    require "google/cloud/storage"
    
    # If you don't specify credentials when constructing the client, the client
    # library will look for credentials in the environment.
    storage = Google::Cloud::Storage.new project: project_id
    
    # Make an authenticated API request
    storage.buckets.each do |bucket|
      puts bucket.name
    end

    C#

    public object AuthImplicit(string projectId)
    {
        // If you don't specify credentials when constructing the client, the
        // client library will look for credentials in the environment.
        var credential = GoogleCredential.GetApplicationDefault();
        var storage = StorageClient.Create(credential);
        // Make an authenticated API request.
        var buckets = storage.ListBuckets(projectId);
        foreach (var bucket in buckets)
        {
            Console.WriteLine(bucket.Name);
        }
        return null;
    }
    
  2. De forma predeterminada, el entorno de la aplicación contiene credenciales de la cuenta de servicio predeterminada de App Engine.

    Google crea esta cuenta de servicio cuando creas una aplicación de App Engine y le otorga permisos completos para gestionar y usar todos los servicios de Cloud en un Google Cloud proyecto.

Puedes anular este flujo predeterminado de cualquiera de las siguientes formas:

  • Define la variable de entorno GOOGLE_APPLICATION_CREDENTIALS. Si se define esta variable, los servicios de Cloud usarán las credenciales especificadas en la variable en lugar de la cuenta de servicio predeterminada.

  • Especifica las credenciales al crear una instancia del objeto Client para un servicio de Cloud. Por ejemplo, si tu aplicación llama a un servicio de Cloud en otro proyecto, es posible que tengas que transferir las credenciales manualmente.

Si defines la variable de entorno GOOGLE_APPLICATION_CREDENTIALS o pasas credenciales en tu código, te recomendamos que almacenes tus credenciales de una de las siguientes formas:

  • Almacena tus credenciales en una ubicación segura, como Firestore en el modo de Datastore (Datastore), y recupéralas en el tiempo de ejecución.
  • Mantén las credenciales en tu código, pero encripta las con un almacén de claves, como Cloud KMS.

Para obtener información sobre las ventajas de cada enfoque, consulta el artículo Elegir una solución de gestión de secretos.

Conceder acceso a los recursos de Cloud a los usuarios

Si quieres que tu aplicación lea datos de usuario de otro servicio de Google, tendrás que configurar OAuth 2.0 para aplicaciones de servidor web. Por ejemplo, si quieres extraer los datos de un usuario de Google Drive e incorporarlos a tu aplicación, usa OAuth 2.0 para aplicaciones de servidor web para compartir datos específicos y, al mismo tiempo, mantener privados otros datos, como nombres de usuario y contraseñas.

Delegación de autoridad en todo el dominio de Google Workspace

Si tienes un dominio de Google Workspace (anteriormente llamado G Suite), un administrador del dominio puede autorizar a una aplicación para que acceda a los datos de los usuarios en nombre de los usuarios del dominio de Google Workspace. Por ejemplo, una aplicación que utilice la API de Google Calendar para añadir eventos a los calendarios de todos los usuarios de un dominio de Google Workspace usaría una cuenta de servicio para acceder a la API de Google Calendar en nombre de los usuarios.

A veces, se denomina "delegar autoridad en todo el dominio" a una cuenta de servicio cuando se autoriza a esta cuenta para que acceda a datos en nombre de los usuarios de un dominio. Este método sigue usando OAuth 2.0 y requiere que un administrador del dominio de Google Workspace autorice a la cuenta de servicio para que tenga autoridad sobre todo el dominio.

Especificar una cuenta de servicio

App Engine te permite usar dos tipos de cuentas de servicio:

  • Cuenta de servicio por versión: cuenta de servicio configurada como identidad de una versión específica de tu servicio implementado. Al desplegar una versión nueva o una ya creada, puedes especificar una cuenta de servicio que actúe como identidad de esa versión. Por ejemplo, si una versión requiere permisos diferentes a los de la cuenta de servicio predeterminada a nivel de aplicación, puedes asignarle una cuenta de servicio específica para esa versión. Para obtener más información, consulta Configurar cuentas de servicio de App Engine.
  • Cuenta de servicio predeterminada a nivel de aplicación: si no configuras una cuenta de servicio por versión, Google Cloud utiliza la cuenta de servicio predeterminada a nivel de aplicación para todos tus servicios implementados. La cuenta de servicio predeterminada a nivel de aplicación se asigna al crear la aplicación. Para obtener más información, consulta Asignar una cuenta de servicio predeterminada a nivel de aplicación.

    Si no asignas una cuenta de servicio predeterminada a nivel de aplicación,Google Cloud utiliza la cuenta de servicio predeterminada de App Engine creada automáticamente (PROJECT_ID@appspot.gserviceaccount.com).

    En función de la configuración de la política de tu organización, es posible que se conceda automáticamente el rol Editor a la cuenta de servicio predeterminada de tu proyecto. Te recomendamos que inhabilites la asignación automática de roles aplicando la restricción de la política de organización iam.automaticIamGrantsForDefaultServiceAccounts. Si has creado tu organización después del 3 de mayo del 2024, esta restricción se aplica de forma predeterminada.

    Si inhabilitas la concesión automática de roles, debes decidir qué roles quieres conceder a las cuentas de servicio predeterminadas y, a continuación, concederlos tú mismo.

    Si la cuenta de servicio predeterminada ya tiene el rol Editor, te recomendamos que lo sustituyas por roles con menos permisos.Para modificar los roles de la cuenta de servicio de forma segura, usa Simulador de políticas para ver el impacto del cambio y, a continuación, asigna y revoca los roles adecuados.