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 Google 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 tu app de App Engine.

  • Otorga a los usuarios acceso a los recursos de un proyecto de Google 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 otorgar acceso a un desarrollador al proyecto de Google 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 tu proyecto

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

    • Consola de Google Cloud
    • Google Cloud CLI
    • IDE y herramientas de compilación que usan la CLI de gcloud para implementar y probar apps de App Engine
  • 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:

    • CLI de gcloud
    • IDE y herramientas de compilación que usan herramientas de la CLI de gcloud para implementar y probar apps de App Engine

Crea una cuenta de usuario

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

    Abrir la página 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 características 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 la consola de Google Cloud y autorizar la CLI de gcloud.

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 la consola de Google Cloud.

    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. Debe ser un nombre fácil de usar para mostrar.

  5. Haz clic en Crear.

  6. Selecciona funciones que otorguen acceso a las características 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 Guardar.

    Aparecerá una lista de las cuentas de servicio existentes.

  10. Si necesitas usar la cuenta de servicio fuera de Google Cloud, sigue las instrucciones para crear una clave de cuenta de servicio (opcional).

Próximos pasos

  • Si usas la cuenta de servicio en tus procesos automatizados de compilación y de implementación, autoriza a la CLI de gcloud con una cuenta de servicio.
  • Si usas la cuenta de servicio con un IDE, sigue las instrucciones que proporciona el IDE.
  • Si necesitas usar una identidad única para una versión de tu aplicación de App Engine cuando accedes a otros servicios de Google Cloud o ejecutas tareas, puedes especificar una cuenta de servicio administrada por el usuario en App Engine.

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)
    	}
    	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 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 Google Cloud.

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 tus credenciales en una ubicación segura, como Firestore en modo Datastore (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.

Para obtener información sobre las ventajas de cada uno de estos enfoques, consulta Elige una solución de administración de secretos.

Otorga a los usuarios acceso a los recursos de Cloud

Si quieres que tu 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.

Especifica una cuenta de servicio

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

  • Cuenta de servicio por versión: una cuenta de servicio configurada como la identidad de una versión específica del servicio implementado. Cuando implementas una versión existente o una nueva, puedes especificar una cuenta de servicio para que actúe como la identidad de esa versión. Por ejemplo, si una versión requiere permisos que difieren de la cuenta de servicio predeterminada a nivel de la app, puedes asignar una cuenta de servicio específica para esa versión. Para obtener más información, consulta Configura cuentas de servicio de App Engine.
  • Cuenta de servicio predeterminada a nivel de la app: si no configuras una cuenta de servicio por versión, Google Cloud usa la cuenta de servicio predeterminada a nivel de la app para todos los servicios implementados. Debes asignar la cuenta de servicio predeterminada a nivel de la app cuando creas la app. Para obtener más información, consulta Asigna una cuenta de servicio predeterminada a nivel de la app.

    Si no asignas una cuenta de servicio predeterminada a nivel de la app, Google Cloud usa la cuenta de servicio predeterminada de App Engine creada de forma automática (PROJECT_ID@appspot.gserviceaccount.com).

    Según la configuración de la política de la organización, es posible que a la cuenta de servicio predeterminada se le otorgue automáticamente el rol de editor en tu proyecto. Te recomendamos inhabilitar la concesión automática de roles; para ello, aplica la restricción de la política de la organización iam.automaticIamGrantsForDefaultServiceAccounts. Si creaste tu organización después del 3 de mayo de 2024, esta restricción se aplica de forma predeterminada.

    Si inhabilitas la concesión automática de roles, debes decidir qué roles se deben otorgar a las cuentas de servicio predeterminadas y, luego, otorgar estos roles a ti mismo.

    Si la cuenta de servicio predeterminada ya tiene el rol de editor, te recomendamos que reemplaces el rol de editor por roles menos permisivos. Para modificar de forma segura los roles de la cuenta de servicio, usa Policy Simulator para ver el impacto del cambio y, luego, otorga y revoca los roles adecuados.