Service identity

Setiap revisi atau tugas Cloud Run ditautkan ke akun layanan. Akun layanan ini otomatis digunakan oleh library klien Google Cloud untuk melakukan autentikasi dengan Google Cloud API. Contoh kode Google Cloud API yang dapat berinteraksi dengan layanan Anda meliputi Cloud Storage, Firestore, Cloud SQL, Pub/Sub, atau Cloud Tasks.

Jika Anda tidak menentukan akun layanan, Cloud Run akan menautkan revisi atau tugas ke akun layanan default yang memiliki izin luas di semua Google Cloud API. Google merekomendasikan penggunaan identitas per layanan dan memberikan izin selektif sebagai gantinya.

Tentang akun layanan default

Secara default, revisi dan tugas Cloud Run dijalankan sebagai akun layanan default Compute Engine. Akun layanan default Compute Engine memiliki peran IAM Editor Project yang memberikan izin untuk baca dan tulis di semua resource project Google Cloud Anda.

Meskipun mungkin lebih praktis dibandingkan dengan menggunakan akun layanan default, Google merekomendasikan untuk membuat akun layanan yang dikelola oleh Anda sendiri dengan izin yang paling terperinci dan menetapkan akun tersebut sebagai identitas layanan atau tugas Cloud Run. Dokumen ini menjelaskan cara mengonfigurasikan identitas per layanan dengan Cloud Run.

Menggunakan identitas per layanan

Google merekomendasikan untuk memberikan identitas khusus pada setiap layanan atau tugas Cloud Run dengan menetapkan akun layanan yang dikelola pengguna, bukan menggunakan akun layanan default. Akun layanan yang dikelola pengguna memungkinkan Anda untuk mengontrol akses dengan memberikan serangkaian izin pengguna menggunakan Identity and Access Management.

Google Cloud CLI dan library klien Google Cloud secara otomatis mendeteksi saat keduanya berjalan di Google Cloud dan menggunakan akun layanan runtime dari revisi Cloud Run terkini. Artinya, jika kode Anda menggunakan gcloud CLI atau library klien Google Cloud resmi, kode ini akan secara otomatis mendeteksi dan mengautentikasi sebagai akun layanan runtime pada layanan Cloud Run. Strategi ini disebut Kredensial Default Aplikasi, serta memungkinkan portabilitas kode di berbagai lingkungan.

Ada dua aspek dalam menetapkan identitas per layanan:

Izin yang diperlukan untuk menetapkan akun layanan yang dikelola pengguna

Untuk men-deploy layanan Cloud Run menggunakan akun layanan yang dikelola pengguna, Anda harus memiliki izin untuk meniru identitas (iam.serviceAccounts.actAs) akun tersebut. Izin ini dapat diberikan melalui peran IAM roles/iam.serviceAccountUser. Semua akun utama (mis. pengguna, akun layanan) harus memiliki izin ini di akun layanan yang dikelola pengguna guna men-deploy layanan Cloud Run service sebagai akun layanan yang dikelola pengguna.

Anda dapat memberikan izin ini menggunakan konsol Google Cloud melalui API (YAML), atau menggunakan gcloud CLI sebagai berikut:

gcloud iam service-accounts add-iam-policy-binding "SERVICE_ACCOUNT_EMAIL" \
    --member "PRINCIPAL" \
    --role "roles/iam.serviceAccountUser"

Ganti:

  • SERVICE_ACCOUNT_EMAIL dengan alamat email akun layanan, seperti PROJECT_NUMBER-compute@developer.gserviceaccount.com.
  • PRINCIPAL dengan akun utama yang Anda tambahi binding. Gunakan format user:email, misalnya user:test-user@gmail.com.

Untuk mempelajari cara memberikan izin, baca artikel memberikan, mengubah, dan mencabut akses ke resource.

Men-deploy layanan baru dengan akun layanan yang dikelola pengguna

Jika belum memiliki akun layanan yang dikelola pengguna, Anda harus membuat akun layanan terlebih dulu.

Anda dapat menetapkan akun layanan dari layanan Cloud Run menggunakan konsol Google Cloud, gcloud CLI, atau API (YAML) saat Anda membuat layanan baru atau men-deploy revisi baru:

Konsol

  1. Di konsol Google Cloud, buka Cloud Run:

    Buka Cloud Run

  2. Klik Buat Layanan jika Anda mengonfigurasi layanan baru yang akan di-deploy. Jika Anda mengonfigurasi layanan yang ada, klik layanan, lalu klik Edit and deploy new revision.

  3. Jika Anda mengonfigurasi layanan baru, isi halaman setelan layanan awal sesuai keinginan, kemudian klik Container, vo;ume, jejaring, sekuritas untuk memperluas halaman konfigurasi layanan.

  4. Klik tab Keamanan.

    gambar

    • Klik menu dropdown akun Layanan dan pilih akun layanan yang diinginkan.
  5. Klik Buat atau Deploy.

gcloud

Anda dapat memperbarui layanan yang sudah ada untuk memiliki akun layanan runtime baru menggunakan perintah berikut:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

Replace:

  • SERVICE dengan nama layanan Anda.
  • SERVICE_ACCOUNT dengan akun layanan yang terkait dengan identitas baru: nilai ini adalah alamat email untuk akun layanan, misalnya, example@myproject.iam.gserviceaccount.com.

Anda juga dapat menetapkan akun layanan selama deployment menggunakan perintah:

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

Replace:

  • IMAGE_URL dengan referensi ke image container, misalnya, us-docker.pkg.dev/cloudrun/container/hello:latest. Jika Anda menggunakan Artifact Registry, repositori REPO_NAME harus sudah dibuat. URL berbentuk LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • SERVICE_ACCOUNT dengan akun layanan yang terkait dengan identitas baru: nilai ini adalah alamat email untuk akun layanan, misalnya, example@myservice.iam.gserviceaccount.com.

YAML

Anda dapat mendownload dan melihat konfigurasi layanan yang ada menggunakan perintah gcloud run services describe --format export, yang memberikan hasil yang telah diolah dalam format YAML. Kemudian, Anda dapat mengubah kolom yang dijelaskan di bawah ini dan mengunggah YAML yang telah dimodifikasi menggunakan perintah gcloud run services replace. Pastikan Anda hanya mengubah kolom seperti yang didokumentasikan.

  1. Untuk melihat dan mendownload konfigurasi:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Perbarui serviceAccountName: atribut:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    Ganti

    • SERVICE dengan nama layanan Cloud Run Anda.
    • SERVICE_ACCOUNT dengan akun layanan yang terkait dengan identitas baru: nilai ini adalah alamat email untuk akun layanan, misalnya, example@myproject.iam.gserviceaccount.com.
  3. Ganti layanan dengan konfigurasinya yang baru menggunakan perintah berikut:

    gcloud run services replace service.yaml

Terraform

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

Untuk membuat akun layanan, tambahkan resource berikut ke file main.tf Anda yang ada:

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

Buat atau perbarui layanan Cloud Run service dan sertakan akun layanan Anda:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

Menggunakan akun layanan dalam project lain

Anda juga dapat menggunakan akun layanan yang dikelola pengguna, yang berada di project Google Cloud yang berbeda dengan layanan Cloud Run. Jika akun layanan dan layanan Cloud Run berada dalam project yang berbeda:

  • Project yang berisi akun layanan ini mengharuskan kebijakan organisasi iam.disableCrossProjectServiceAccountUsage untuk ditetapkan ke status false/unenforced pada tingkat folder atau diwariskan dari setelan level project. Secara default, nilai ini ditetapkan ke true.

  • Akun layanan memerlukan keanggotaan peran roles/iam.serviceAccountTokenCreator untuk agen layanan project yang di-deploy:

    service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
    

    dengan PROJECT_NUMBER yang menjadi nomor project tersebut.

  • Akun layanan memerlukan keanggotaan peran roles/iam.serviceAccountUser untuk identitas (pengguna atau otomatisasi) yang menjalankan operasi deployment.

Anda dapat menerapkan keanggotaan peran secara langsung ke resource akun layanan atau mendapatkannya dari level yang lebih tinggi dalam hierarki resource.

Izin yang diperlukan oleh akun layanan yang dikelola pengguna untuk mengoperasikan Cloud Run

Jika layanan Cloud Run tidak mengakses bagian Google Cloud lainnya, akun layanan ini tidak perlu diberi peran atau izin apa pun.

Saat Anda membuat akun layanan baru dari konsol Google Cloud, langkah opsional "Berikan akses project ke akun layanan ini" ditujukan untuk akses tambahan yang diperlukan. Misalnya, satu layanan Cloud Run dapat memanggil layanan Cloud Run pribadi lainnya atau dapat mengakses database Cloud SQL. Keduanya memerlukan peran IAM tertentu. Untuk informasi selengkapnya, baca dokumentasi tentang mengelola akses.

Mengambil ID dan mengakses token menggunakan server metadata

Jika kode layanan Cloud Run Anda menggunakan library klien Google Cloud, library tersebut akan otomatis memperoleh token akses untuk mengautentikasi permintaan kode Anda menggunakan akun layanan runtime layanan.

Jika menggunakan kode kustom sendiri, Anda dapat menggunakan server metadata untuk mengambil token akses dan token ID secara manual. Perhatikan bahwa Anda tidak dapat membuat kueri server ini langsung dari mesin lokal Anda karena server metadata hanya tersedia untuk workload yang berjalan di Google Cloud.

Dua jenis token yang dapat Anda ambil dengan server metadata adalah sebagai berikut:

Untuk mengambil token, pilih salah satu opsi berikut:

Token akses

Misalnya, jika Anda ingin membuat topik Pub/Sub, gunakan metode projects.topics.create.

  1. Gunakan Server Metadata Compute untuk mengambil token akses:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        --header "Metadata-Flavor: Google"
    

    Endpoint ini menampilkan respons JSON dengan atribut access_token.

  2. Dalam permintaan protokol/HTTP, permintaan tersebut harus diautentikasi dengan token akses pada header Authorization:

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    Dengan keterangan:

    • PROJECT_ID adalah project ID Anda.
    • TOPIC_ID adalah topic ID Anda.
    • ACCESS_TOKEN adalah token akses yang Anda ambil di langkah sebelumnya.

    Respons:

    {
        "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

Token ID

Gunakan Server Metadata Compute untuk mengambil token identitas dengan audiens tertentu:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

Dengan AUDIENCE adalah Audiens JWT yang diminta.

Untuk layanan Cloud Run, audiens harus berupa URL layanan yang Anda panggil atau audiens kustom, seperti domain kustom, yang dikonfigurasi untuk layanan.

https://service.domain.com

Resource lainnya dapat berupa Client ID OAuth dari resource yang dilindungi IAP:

1234567890.apps.googleusercontent.com

Mendapatkan rekomendasi untuk membuat akun layanan khusus

Layanan pemberi rekomendasi secara otomatis memberikan rekomendasi untuk membuat akun layanan khusus dengan serangkaian izin minimal yang diperlukan.

Langkah berikutnya

Pelajari cara mengelola akses atau mengautentikasi developer, layanan, dan pengguna akhir ke layanan Anda.

Untuk panduan menyeluruh mengenai aplikasi yang menggunakan identitas layanan untuk meminimalkan risiko keamanan, ikuti tutorial mengamankan layanan Cloud Run.