Configurazione del controllo dell'accesso

Il controllo dell'accesso determina chi ha l'autorizzazione per accedere a servizi e risorse in un progetto Google Cloud. In App Engine esistono alcuni casi d'uso distinti per la configurazione del controllo dell'accesso'accesso:

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

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

  • Concedere agli utenti l'accesso alle risorse di un progetto Google Cloud. Sebbene questo caso d'uso non sia comune, potrebbero verificarsi casi in cui la tua app debba richiedere l'accesso a una risorsa Cloud per conto di un utente. Ad esempio, la tua app potrebbe dover accedere ai dati di proprietà dei tuoi utenti.

Questa pagina fornisce una panoramica della configurazione del controllo dell'accesso in ogni caso d'uso.

Per informazioni di base su come la Google Cloud Platform gestisce il controllo dell'accesso#39;accesso, consulta la panoramica di Identity and Access Management (IAM).

Concedere l'accesso ai membri del team

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

  • Un account utente associato a un Account Google e destinato a rappresentare una persona specifica nel tuo progetto.

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

    • Console Google Cloud
    • Google Cloud CLI
    • IDE e strumenti di compilazione che utilizzano gcloud CLI per testare ed eseguire il deployment delle app App Engine
  • Un account di servizio, che deve rappresentare un'applicazione o un processo anziché una persona. Utilizza gli account di servizio nei processi di creazione, test e deployment automatici, in particolare se più sviluppatori possono eseguire queste procedure.

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

Creazione di un account utente

  1. Apri la pagina IAM nella console Google Cloud.

    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 grant access to other Cloud services (concedono l'accesso ad altri servizi Cloud).

  6. Fai clic su Salva.

Ora l'utente può accedere alla console Google Cloud e autorizzare la CLI gcloud.

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

Creazione di un account di servizio

  1. Apri la pagina Account di servizio nella console Google Cloud.

    Apri la pagina 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 semplice da visualizzare.

  5. Fai clic su Crea.

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

    Se l'account di servizio ha bisogno di accedere anche ad altri servizi Cloud, seleziona i ruoli che concedono l'accesso ad altri servizi Cloud.

  7. Fai clic su Continua.

  8. Se vuoi, specifica gli account utente che possono gestire l'account di servizio. Puoi anche specificare gli 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 degli account di servizio esistenti.

  10. Se devi utilizzare il tuo account di servizio al di fuori di Google Cloud, segui le istruzioni per creare una chiave dell'account di servizio.

Passaggi successivi

  • Se utilizzi l'account di servizio nelle procedure di compilazione e deployment automatiche, autorizza gcloud CLI con un account di servizio.
  • Se utilizzi l'account di servizio con un IDE, segui le istruzioni fornite dall'IDE.
  • Se devi utilizzare un'identità univoca per una versione della tua app App Engine quando accedi ad altri servizi Google Cloud o esegui attività, puoi specificare un account di servizio gestito dall'utente in App Engine.

Concedere all'app l'accesso ai servizi Cloud

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

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

  1. Per avviare chiamate a un servizio Cloud, l'app crea un oggetto client, che contiene le credenziali e altri dati di cui l'app ha bisogno per interagire con il servizio. Se non specifichi le credenziali nel costruttore del client, il client le cerca 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 le credenziali dell'account di servizio App Engine predefinito.

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

Puoi ignorare questo flusso predefinito effettuando una delle seguenti operazioni:

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

  • Specifica le credenziali quando esegui l'inizializzazione dell'oggetto Client per un servizio cloud. Ad esempio, se la tua app chiama un servizio Cloud in un altro progetto, potrebbe essere necessario trasmettere le credenziali manualmente.

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

  • Memorizza le tue credenziali in una posizione sicura, ad esempio Firestore in modalità Datastore (Datastore), e recuperale in fase di esecuzione.
  • Mantieni le credenziali nel codice, ma criptale con un keystore, ad esempio Cloud KMS.

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

Concedere agli utenti l'accesso alle risorse Cloud

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

Delega dell'autorità a livello di dominio Google Workspace

Se hai un dominio Google Workspace (in precedenza 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 Google Calendar per conto degli utenti.

L'autorizzazione di un account di servizio ad accedere ai dati per conto degli utenti di un dominio è talvolta indicata come "delega dell'autorità a livello di dominio" a un account di servizio. Questo metodo utilizza ancora OAuth 2.0 e richiede un amministratore del dominio Google Workspace per autorizzare l'autorità a livello di dominio all'account di servizio.

Specifica un account di servizio

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

  • Account di servizio per versione: un account di servizio configurato come identità per una versione specifica del servizio di cui è stato eseguito il deployment. Quando esegui il deployment di una versione esistente o di una nuova versione, puoi specificare un account di servizio che fungerà da identità della versione. Ad esempio, se una versione richiede autorizzazioni diverse dall'account di servizio predefinito a livello di app, puoi assegnare un account di servizio specifico per quella versione. Per ulteriori informazioni, consulta Configurare gli account servizio App Engine.
  • Account di servizio predefinito a livello di app: se non configuri un account di servizio per versione, Google Cloud utilizza l'account di servizio predefinito a livello di app per tutti i servizi di cui hai eseguito il deployment. Assegni l'account di servizio predefinito a livello di app quando crei l'app. Per ulteriori informazioni, vedi Assegnare un account di servizio predefinito a livello di app.

    Se non assegni un account di servizio predefinito a livello di app, Google Cloud utilizza l'account di servizio predefinito di App Engine creato automaticamente (PROJECT_ID@appspot.gserviceaccount.com).

    A seconda della configurazione dei criteri dell'organizzazione, all'account di servizio predefinito potrebbe essere assegnato automaticamente il ruolo Editor nel progetto. Ti consigliamo vivamente di disattivare la concessione automatica dei ruoli applicando il vincolo iam.automaticIamGrantsForDefaultServiceAccounts delle norme dell'organizzazione. Se hai creato la tua organizzazione dopo il 3 maggio 2024, questo vincolo viene applicato per impostazione predefinita.

    Se disattivi la concessione automatica dei ruoli, devi decidere quali ruoli concedere agli account di servizio predefiniti, quindi concedere personalmente questi ruoli.

    Se l'account di servizio predefinito ha già il ruolo Editor, ti consigliamo di sostituire il ruolo Editor con ruoli meno permissivi. Per modificare in sicurezza i ruoli dell'account di servizio, utilizza Policy Simulator per vedere l'impatto della modifica, quindi concedi e revoca i ruoli appropriati.