Menyiapkan Kontrol Akses

Kontrol akses menentukan siapa yang memiliki izin untuk mengakses layanan dan resource di project Google Cloud. Di App Engine, ada beberapa kasus penggunaan terpisah untuk menyiapkan kontrol akses:

  • Memberikan akses kepada anggota tim ke project Google Cloud Anda agar mereka dapat menyiapkan layanan dan men-deploy aplikasi.

  • Memberi aplikasi Anda akses ke layanan Google Cloud, seperti Cloud Storage. Semua layanan Cloud memerlukan autentikasi dan otorisasi untuk setiap panggilan API, termasuk panggilan dari aplikasi App Engine Anda.

  • Memberi pengguna Anda akses ke resource di project Google Cloud. Meskipun tidak umum, ada kasus penggunaan ketika aplikasi Anda perlu meminta akses ke resource Cloud atas nama pengguna. Misalnya, aplikasi Anda mungkin perlu mengakses data milik pengguna.

Halaman ini memberikan ringkasan tentang cara menyiapkan kontrol akses pada setiap kasus penggunaan.

Untuk mengetahui informasi latar belakang tentang cara Google Cloud Platform menangani kontrol akses, baca ringkasan Identity and Access Management (IAM).

Memberikan akses ke anggota tim

Untuk memberikan akses ke project Google Cloud Anda kepada developer, buat salah satu atau kedua hal berikut:

  • Akun pengguna, yang terkait dengan akun Google dan dimaksudkan untuk mewakili individu tertentu dalam project Anda.

    Akun pengguna dapat digunakan untuk melakukan autentikasi dari alat berikut:

    • Konsol Google Cloud
    • Google Cloud CLI
    • IDE dan alat pembuatan yang menggunakan gcloud CLI untuk menguji dan men-deploy aplikasi App Engine
  • Akun layanan, yang dimaksudkan untuk mewakili aplikasi atau proses, bukan seseorang. Gunakan akun layanan dalam proses pembuatan, pengujian, dan deployment otomatis, terutama jika beberapa developer dapat menjalankan proses ini.

    Akun layanan dapat digunakan untuk melakukan autentikasi dari alat berikut:

    • Gcloud CLI
    • IDE dan alat pembuatan yang menggunakan alat gcloud CLI untuk menguji dan men-deploy aplikasi App Engine

Membuat akun pengguna

  1. Buka halaman IAM di konsol Google Cloud.

    Buka halaman IAM

  2. Klik Pilih project, pilih project, lalu klik Buka.

  3. Klik Tambahkan.

  4. Masukkan alamat email.

  5. Pilih peran yang memberikan akses ke fitur App Engine.

    Jika pengguna juga memerlukan akses ke layanan Cloud lainnya, pilih peran yang memberikan akses ke layanan Cloud lainnya.

  6. Klik Simpan.

Pengguna kini dapat login ke Konsol Google Cloud serta melakukan otorisasi gcloud CLI.

Anda juga dapat membuat akun pengguna dari gcloud, REST API, atau library klien.

Membuat akun layanan

  1. Buka halaman Akun Layanan di konsol Google Cloud.

    Buka halaman Akun Layanan

  2. Pilih project Anda lalu klik Buka.

  3. Klik Buat Akun Layanan.

  4. Masukkan nama akun layanan. Nama ini harus mudah digunakan untuk ditampilkan.

  5. Klik Create.

  6. Pilih peran yang memberikan akses ke fitur App Engine.

    Jika akun layanan juga memerlukan akses ke layanan Cloud lainnya, pilih peran yang memberikan akses ke layanan Cloud lainnya.

  7. Klik Lanjutkan.

  8. Atau, tentukan akun pengguna yang dapat mengelola akun layanan. Anda juga dapat menentukan akun pengguna yang dapat menggunakan akun layanan untuk mengakses semua resource secara tidak langsung yang dapat diakses oleh akun layanan.

  9. Klik Simpan.

    Daftar akun layanan yang ada akan muncul.

  10. Atau, jika Anda perlu menggunakan akun layanan di luar Google Cloud, ikuti petunjuk untuk membuat kunci akun layanan.

Langkah berikutnya

  • Jika Anda menggunakan akun layanan dalam proses pembuatan dan deployment otomatis, otorisasikan gcloud CLI dengan akun layanan.
  • Jika Anda menggunakan akun layanan dengan IDE, ikuti petunjuk yang diberikan oleh IDE.
  • Jika perlu menggunakan identitas unik untuk versi aplikasi App Engine Anda saat mengakses layanan Google Cloud lainnya atau menjalankan tugas, Anda dapat menentukan akun layanan yang dikelola pengguna di App Engine.

Memberi aplikasi Anda akses ke layanan Cloud

Setiap panggilan ke layanan Cloud harus diautentikasi dan diberi otorisasi, termasuk panggilan dari aplikasi App Engine ke layanan Cloud lainnya seperti Cloud Storage.

Secara default, panggilan dari aplikasi App Engine Anda ke layanan di project yang sama akan diotorisasi. Berikut adalah cara kerja alur default:

  1. Untuk memulai panggilan ke layanan Cloud, aplikasi Anda akan membuat objek klien, yang berisi kredensial dan data lain yang diperlukan aplikasi untuk berinteraksi dengan layanan. Jika kredensial di konstruktor klien tidak Anda tetapkan, klien akan mencari kredensial di lingkungan aplikasi.

    Berikut ini contoh pembuatan klien untuk 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. Secara default, lingkungan aplikasi berisi kredensial dari akun layanan App Engine default.

    Akun layanan ini dibuat oleh Google saat Anda membuat aplikasi App Engine dan diberi izin penuh untuk mengelola serta menggunakan semua layanan Cloud dalam sebuah project GCP.

Anda dapat mengganti alur default ini dengan melakukan salah satu hal berikut:

  • Menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS. Jika variabel ini ditetapkan, layanan Cloud akan menggunakan kredensial yang ditentukan oleh variabel, bukan akun layanan default.

  • Tentukan kredensial saat Anda membuat instance objek Client untuk layanan Cloud. Misalnya, jika aplikasi memanggil layanan Cloud di project lain, Anda mungkin perlu meneruskan kredensial secara manual.

Jika Anda menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS atau meneruskan kredensial dalam kode, sebaiknya simpan kredensial dengan salah satu cara berikut:

  • Simpan kredensial Anda di lokasi yang aman seperti Firestore dalam mode Datastore (Datastore), lalu ambil di runtime.
  • Simpan kredensial dalam kode Anda, tetapi buat enkripsi kredensial dengan keystore, seperti Cloud KMS.

Untuk mempelajari keuntungan dari setiap pendekatan, lihat Memilih solusi pengelolaan rahasia.

Memberi pengguna akses ke resource Cloud

Jika ingin aplikasi Anda membaca data pengguna dari layanan Google lain, Anda harus menyiapkan OAuth 2.0 untuk Aplikasi Server Web. Misalnya, jika Anda ingin mengambil data pengguna dari Google Drive dan memasukkannya ke aplikasi Anda, gunakan OAuth 2.0 untuk Aplikasi Server Web agar dapat berbagi data tertentu sekaligus menjaga data lainnya tetap pribadi, seperti nama pengguna dan sandi.

Delegasi otoritas di seluruh domain Google Workspace

Jika Anda memiliki domain Google Workspace (sebelumnya G Suite), administrator domain dapat memberikan aplikasi otorisasi untuk mengakses data pengguna atas nama pengguna di domain Google Workspace. Misalnya, aplikasi yang menggunakan API Google Kalender untuk menambahkan acara ke kalender semua pengguna dalam domain Google Workspace akan menggunakan akun layanan untuk mengakses API Google Kalender atas nama pengguna.

Memberikan akun layanan otorisasi untuk mengakses data atas nama pengguna di suatu domain terkadang disebut sebagai "mendelegasikan otoritas seluruh domain" ke akun layanan. Opsi ini masih menggunakan OAuth 2.0, dan memerlukan administrator domain Google Workspace untuk memberikan otorisasi seluruh domain ke akun layanan.

Menentukan akun layanan

App Engine memungkinkan Anda menggunakan dua jenis akun layanan:

  • Akun layanan default App Engine dibuat otomatis secara default dengan peran Editor, dan merupakan identitas default untuk semua versi aplikasi App Engine Anda jika akun layanan yang dikelola pengguna tidak ditentukan. Sebaiknya ubah izin default untuk akun layanan default Anda ke peran mana pun yang paling mewakili kebutuhan akses untuk aplikasi App Engine Anda.
  • Akun layanan yang dikelola pengguna adalah akun layanan yang Anda buat di Identity and Access Management (IAM). Anda dapat menentukan akun layanan yang dikelola pengguna untuk suatu versi, lalu akun tersebut akan digunakan saat mengakses layanan App Engine lain dan menjalankan tugas untuk versi tersebut.