Configurazione del controllo dell'accesso

Il controllo degli accessi determina chi è autorizzato ad accedere a servizi e risorse in un progetto Google Cloud. In App Engine, esistono alcuni casi d'uso distinti per la configurazione del controllo degli accessi:

  • Concedere ai membri del team l'accesso al tuo progetto cloud in modo che possano configurare i servizi ed eseguire il deployment delle app.

  • Concedere l'accesso all'app ai servizi Google Cloud, come Cloud Storage. Tutti i servizi cloud richiedono autenticazione e autorizzazione per ogni chiamata API, comprese le chiamate dall'app App Engine.

  • Concedere agli utenti l'accesso alle risorse in un progetto Cloud. Anche se questo caso d'uso non è frequente, in alcuni casi l'app deve richiedere l'accesso a una risorsa cloud per conto di un utente. Ad esempio, la tua app potrebbe dover accedere a dati appartenenti ai tuoi utenti.

Questa pagina fornisce una panoramica sulla configurazione del controllo degli accessi in ogni caso d'uso.

Per informazioni di base su come Google Cloud Platform gestisce il controllo degli accessi, consulta la panoramica di Identity and Access Management (IAM).

Concessione dell'accesso ai membri del team

Per concedere a uno sviluppatore l'accesso al tuo progetto cloud, crea uno o entrambi i seguenti elementi:

  • Un account utente, che è associato a un Account Google e che rappresenta una persona specifica nel tuo progetto.

    Un account utente può essere utilizzato per l'autenticazione tramite i seguenti strumenti:

  • Un account di servizio, destinato a rappresentare un'applicazione o un processo invece di una persona. Utilizza gli account di servizio nei processi automatizzati di creazione, test e deployment, soprattutto se più sviluppatori possono eseguire questi processi.

    Un account di servizio può essere utilizzato per l'autenticazione mediante i seguenti strumenti:

    • interfaccia a riga di comando gcloud
    • IDE e strumenti di sviluppo che utilizzano gli strumenti dell'interfaccia a riga di comando gcloud per testare ed eseguire il deployment delle app di App Engine

Creazione di un account utente

  1. Apri la pagina IAM in Cloud Console.

    Apri la pagina IAM

  2. Fai clic su Seleziona un progetto, scegli un progetto e fai clic su Apri.

  3. Fai clic su Aggiungi.

  4. Inserisci un indirizzo email.

  5. Seleziona i ruoli che concedono l'accesso alle funzionalità di App Engine.

    Se l'utente ha bisogno di accedere anche ad altri servizi cloud, seleziona i ruoli che concedono l'accesso ad altri servizi cloud.

  6. Fai clic su Salva.

Ora l'utente può accedere a Google Cloud Console e autorizzare l'interfaccia a riga di comando gcloud.

Puoi creare account utente anche da gcloud, dall'API REST o dalle librerie client.

Creazione di un account di servizio

  1. Apri la pagina Account di servizio in Cloud Console.

    Apri la pagina degli account di servizio

  2. Seleziona il progetto e fai clic su Apri.

  3. Fai clic su Crea account di servizio.

  4. Inserisci un nome per l'account di servizio. Deve essere un nome facile da utilizzare per la visualizzazione.

  5. Fai clic su Crea.

  6. Seleziona i ruoli che concedono l'accesso alle funzionalità di App Engine.

    Se l'account di servizio richiede l'accesso anche ad altri servizi cloud, seleziona ruoli che concedono l'accesso ad altri servizi cloud.

  7. Fai clic su Continua.

  8. (Facoltativo) Specifica gli account utente che possono gestire l'account di servizio. Puoi anche specificare account utente che possono utilizzare l'account di servizio per accedere indirettamente a tutte le risorse a cui ha accesso l'account di servizio.

  9. Fai clic su Salva.

    Viene visualizzato un elenco di account di servizio esistenti.

  10. Facoltativamente, se devi utilizzare l'account di servizio al di fuori di Google Cloud, segui le istruzioni per creare una chiave dell'account di servizio.

Passaggi successivi

Concessione dell'accesso dell'app ai servizi Cloud

Ogni chiamata a un servizio Cloud deve essere autenticata e autorizzata, comprese le chiamate da un'app di App Engine ad altri servizi Cloud come Cloud Storage.

Per impostazione predefinita, le chiamate dall'app App Engine ai servizi nello stesso progetto sono autorizzate. Ecco come funziona il flusso predefinito:

  1. Per avviare chiamate a un servizio Cloud, la tua app crea un oggetto client che contiene le credenziali e altri dati necessari per interagire con il servizio. Se non specifichi le credenziali nel costruttore del client, quest'ultimo cerca le credenziali nell'ambiente dell'app.

    Ecco un esempio di creazione di un client per 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
  2. Per impostazione predefinita, l'ambiente dell'app contiene credenziali dell'account di servizio App Engine predefinito.

    Questo account di servizio viene creato da Google quando crei un'app di App Engine e dispone di autorizzazioni complete per gestire e utilizzare tutti i servizi Cloud in un progetto GCP.

Puoi ignorare questo flusso predefinito in uno dei seguenti modi:

  • Imposta la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS. Se è impostata, i servizi Cloud utilizzano le credenziali specificate dalla variabile anziché l'account di servizio predefinito.

  • Specifica le credenziali quando crei l'istanza dell'oggetto Client per un servizio Cloud. Ad esempio, se la tua app chiama un servizio Cloud in un progetto diverso, potresti dover trasmettere le credenziali manualmente.

Se imposti la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS o trasmetti credenziali nel tuo codice, ti consigliamo di archiviare le credenziali in uno dei seguenti modi:

  • Archivia le credenziali in una posizione sicura come Datastore e recuperale in fase di runtime.
  • Mantieni le credenziali nel codice ma criptale con un archivio chiavi come Cloud KMS.

Per scoprire i vantaggi di ciascun approccio, vedi Scegliere una soluzione di gestione dei secret.

Concessione degli utenti di accesso alle risorse Cloud

Se vuoi che la tua app legga i dati utente da un altro servizio Google, devi configurare OAuth 2.0 per le applicazioni server web. Ad esempio, se vuoi estrarre i dati di un utente da Google Drive e trasferirli nella tua applicazione, utilizza OAuth 2.0 per le applicazioni server web per condividere dati specifici mantenendo altri dati privati, come nomi utente e password.

Delega dell'autorità a livello di dominio Google Workspace

Se hai un dominio Google Workspace (precedentemente noto come G Suite), un amministratore del dominio può autorizzare un'applicazione ad accedere ai dati utente per conto degli utenti nel dominio Google Workspace. Ad esempio, un'applicazione che utilizza l'API Google Calendar per aggiungere eventi ai calendari di tutti gli utenti di un dominio Google Workspace utilizzerà un account di servizio per accedere all'API di Google Calendar per conto degli utenti.

L'autorizzazione di un account di servizio per l'accesso ai dati per conto degli utenti di un dominio è a volte definita "delega a livello di dominio dell'autorità" a un account di servizio. Tuttavia, utilizza OAuth 2.0 e richiede un amministratore di dominio di Google Workspace per autorizzare l'autorizzazione a livello di dominio nell'account di servizio.

Specifica di un account di servizio

App Engine consente di utilizzare due tipi di account di servizio:

  • L'account di servizio predefinito di App Engine viene creato automaticamente con il ruolo di Editor per impostazione predefinita ed è l'identità predefinita per tutte le versioni dell'app App Engine se un account di servizio gestito dall'utente non è specificato. Ti consigliamo di modificare le autorizzazioni predefinite per l'account di servizio predefinito in base ai ruoli che meglio rappresentano le esigenze di accesso della tua applicazione App Engine.
  • L'account di servizio gestito dall'utente (Anteprima) è un account di servizio creato in Identity and Access Management (IAM). Puoi specificare un account di servizio gestito dall'utente per una versione, che verrà utilizzato per accedere agli altri servizi di App Engine ed eseguire attività per quella versione.