Configura el control de acceso

El control de acceso determina quién tiene permiso para acceder a los servicios y recursos en un proyecto de Google Cloud. En App Engine, existen varios casos de uso diferentes para configurar el control de acceso:

  • Otorga a los miembros del equipo acceso al proyecto de Cloud para que puedan implementar apps y configurar servicios.

  • Otorga a la app acceso 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 que se originan en la app de App Engine.

  • Otorga a los usuarios acceso a los recursos de un proyecto de Cloud. Si bien este caso de uso no es común, puede haber situaciones en las que la app necesite solicitar acceso a un recurso de Cloud en nombre de un usuario. Por ejemplo, es posible que tu app necesite acceder a datos que pertenecen a los usuarios.

En esta página, se proporciona una descripción general de la configuración del control de acceso en cada caso de uso.

Para obtener información general sobre cómo Google Cloud Platform maneja el control de acceso, consulta la descripción general de la administración de identidades y accesos (IAM).

Otorga acceso a los miembros de tu equipo

Para otorgarle a un desarrollador acceso al proyecto de Cloud, crea uno de estos elementos o ambos:

  • Una cuenta de usuario asociada con una Cuenta de Google, cuyo propósito es representar a una persona específica en el proyecto.

    Se puede usar una cuenta de usuario para autenticar desde las siguientes herramientas:

  • Una cuenta de servicio, cuyo propósito no es representar a una persona sino a una aplicación o un proceso. Usa cuentas de servicio en tus procesos automatizados de compilación, de prueba y de implementación, especialmente si varios desarrolladores pueden ejecutar estos procesos.

    Se puede usar una cuenta de servicio para autenticar desde las siguientes herramientas:

Crea una cuenta de usuario

  1. Abre la página de IAM en Cloud Console.

    Abrir la página de IAM

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

  3. Haz clic en Agregar.

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

  5. Selecciona funciones que otorguen acceso a las funciones de App Engine.

    Si el usuario también necesita acceder a otros servicios de Cloud, selecciona funciones que otorguen acceso a otros servicios de Cloud.

  6. Haz clic en Guardar.

Ahora el usuario puede acceder a Google Cloud Console y autorizar las herramientas del SDK de Cloud.

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

Crea una cuenta de servicio

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

    Abrir la página Cuentas de servicio

  2. Selecciona tu proyecto y haz clic en Abrir.

  3. Haz clic en Crear cuenta de servicio.

  4. Ingresa un nombre de cuenta de servicio (que permita identificarla fácilmente).

  5. Haz clic en Crear.

  6. Selecciona funciones que otorguen acceso a las funciones de App Engine.

    Si la cuenta de servicio también necesita acceder a otros servicios de Cloud, selecciona funciones que otorguen acceso a otros servicios de Cloud.

  7. Haz clic en Continuar.

  8. Si lo deseas, puedes especificar cuentas de usuario con la capacidad de administrar la cuenta de servicio. También puedes especificar cuentas de usuario con la capacidad de 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 + Crear clave y sigue las instrucciones para descargar una clave JSON. Almacena el archivo de manera segura, ya que no podrás recuperar la clave si la pierdes.

  10. Haz clic en Listo.

Próximos pasos

Otórgale a tu app acceso a los servicios de Cloud

Cada llamada a un servicio de Cloud debe estar autenticada y autorizada, incluidas las llamadas provenientes de una aplicación de App Engine y destinadas a otros servicios de Cloud, como Cloud Storage.

De forma predeterminada, las llamadas de tu aplicación de App Engine a servicios pertenecientes al mismo proyecto están autorizadas. El flujo predeterminado funciona de la siguiente manera:

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

    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)
    	}
    
    	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;
    
    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
  2. De forma predeterminada, el entorno de la app contiene credenciales de la cuenta de servicio predeterminada de App Engine.

    Cuando creas una aplicación de App Engine, Google genera esta cuenta de servicio y le otorga los permisos necesarios para administrar y usar todos los servicios de Cloud de un proyecto de GCP.

Si deseas anular este flujo predeterminado, sigue alguno de estos pasos:

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

  • Especifica las credenciales cuando crees una instancia del objeto Client para un servicio de Cloud. Por ejemplo, si la app llama a un servicio de Cloud que pertenece a otro proyecto, tal vez tengas que pasar las credenciales de forma manual.

Si configuras la variable de entorno GOOGLE_APPLICATION_CREDENTIALS o pasas las credenciales en el código, te recomendamos que almacenes las credenciales de una de las siguientes maneras:

  • Almacena las credenciales en una ubicación segura, como Datastore, y recupéralas en el entorno de ejecución.
  • Mantén las credenciales en el código, pero encríptalas con un almacén de claves, como Cloud KMS.

Consulta Elige una solución de administración de secretos para obtener más información sobre las ventajas de cada uno de estos enfoques.

Otorga a los usuarios acceso a los recursos de Cloud

Si quieres que la app lea datos de los usuarios desde otros servicios de Google, deberás configurar OAuth 2.0 para aplicaciones de servidor web. Por ejemplo, si deseas extraer datos de un usuario desde Google Drive a fin de importarlos a tu app, usa OAuth 2.0 para aplicaciones de servidor web a fin de compartir datos específicos y mantener la privacidad de los otros datos, como nombres de usuario y contraseñas.

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

Si tienes un dominio de Google Workspace (antes conocido como G Suite), un administrador del dominio puede autorizar a una aplicación para que acceda a los datos del usuario en nombre de los usuarios del dominio de Google Workspace. Por ejemplo, una aplicación que usa la API de Calendario de Google para agregar eventos a los calendarios de todos los usuarios en un dominio de Google Workspace usará una cuenta de servicio para acceder a la API de Calendario de Google en nombre de los usuarios.

La autorización de una cuenta de servicio para acceder a los datos en nombre de los usuarios en un dominio se conoce como “delegación de la autoridad de todo el dominio” a una cuenta de servicio. Para esto, se usa OAuth 2.0 y se requiere que un administrador de dominio de Google Workspace autorice la delegación de autoridad de todo el dominio a la cuenta de servicio.