Workload Identity Federation

Workload Identity Federation memungkinkan Anda memberikan akses workload lokal atau multicloud ke resource Google Cloud menggunakan identitas gabungan, bukan kunci akun layanan.

Anda dapat mengonfigurasi penggabungan untuk layanan dan pipeline yang melakukan salah satu hal berikut:

Mengapa Workload Identity Federation?

Aplikasi yang berjalan di luar Google Cloud dapat menggunakan kunci akun layanan untuk mengakses resource Google Cloud . Namun, kunci akun layanan adalah kredensial yang andal, dan dapat menimbulkan risiko keamanan jika tidak dikelola dengan benar. Workload Identity Federation menghilangkan beban pemeliharaan dan keamanan yang terkait dengan kunci akun layanan.

Dengan Workload Identity Federation, Anda dapat menggunakan Identity and Access Management (IAM) untuk memberikan peran IAM kepada akun utama yang didasarkan pada identitas gabungan di workload identity pool. Anda dapat memberikan akses ke akun utama di resource Google Cloud tertentu. Pendekatan ini disebut akses langsung. Atau, Anda dapat memberikan akses ke akun layanan, yang kemudian dapat mengakses resource Google Cloud . Pendekatan ini disebut peniruan akun layanan.

Workload Identity pools

Workload identity pool adalah entity yang memungkinkan Anda mengelola identitas eksternal.

Secara umum, sebaiknya buat kumpulan baru untuk setiap lingkungan non-Google Cloud yang perlu mengakses resource Google Cloud , seperti lingkungan pengembangan, staging, atau produksi.

Penyedia workload identity pool

Penyedia workload identity pool adalah entitas yang menjelaskan hubungan antara Google Cloud dan IdP Anda, termasuk hal berikut:

  • AWS
  • Microsoft Entra ID
  • GitHub
  • GitLab
  • Cluster Kubernetes
  • Okta
  • Active Directory Federation Services (AD FS) lokal
  • Terraform

Workload Identity Federation mengikuti spesifikasi pertukaran token OAuth 2.0. Anda memberikan kredensial dari IdP ke Security Token Service, yang memverifikasi identitas pada kredensial, lalu menampilkan token gabungan sebagai gantinya.

Penyedia OIDC dengan JWK lokal

Untuk menggabungkan workload yang tidak memiliki endpoint OIDC publik, Anda dapat mengupload OIDC JSON Web Key Set (JWKS) langsung ke pool. Hal ini biasa terjadi jika Anda memiliki Terraform atau GitHub Enterprise yang dihosting di lingkungan Anda sendiri, atau Anda memiliki persyaratan peraturan untuk tidak mengekspos URL publik. Untuk informasi selengkapnya, lihat Mengelola JWK OIDC (Opsional).

Pemetaan atribut

Token yang dikeluarkan oleh IdP eksternal Anda berisi satu atau beberapa atribut. Beberapa IdP menyebut atribut ini sebagai klaim.

Token Layanan Token Keamanan Google juga berisi satu atau beberapa atribut, seperti yang tercantum dalam tabel berikut:

Atribut Deskripsi
google.subject Wajib. ID unik untuk pengguna. Atribut ini digunakan dalam binding peran principal:// IAM dan muncul di log Cloud Logging. Nilai harus unik dan tidak boleh melebihi 127 karakter.
google.groups Opsional. Kumpulan grup tempat identitas berada. Atribut ini digunakan dalam binding peran principalSet:// IAM untuk memberikan akses kepada semua anggota grup.
attribute.NAME Opsional. Anda dapat menentukan hingga 50 atribut khusus dan menggunakan atribut ini dalam binding peran principalSet:// IAM untuk memberikan akses ke semua identitas dengan atribut tertentu.

Pemetaan atribut menentukan cara memperoleh nilai atribut token Google Security Token Service dari token eksternal. Untuk setiap atribut token Google Security Token Service, Anda dapat menentukan pemetaan atribut, yang diformat sebagai berikut:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Ganti kode berikut:

  • TARGET_ATTRIBUTE adalah atribut token Google Security Token Service
  • SOURCE_EXPRESSION adalah ekspresi Common Expression Language (CEL) yang mengubah satu atau beberapa atribut dari token yang dikeluarkan oleh IdP eksternal Anda

Daftar berikut menyediakan contoh pemetaan atribut:

  • Tetapkan atribut pernyataan sub ke google.subject:

    google.subject=assertion.sub
    
  • Menggabungkan beberapa atribut pernyataan:

    google.subject='myprovider::' + assertion.aud + '::' + assertion.sub
    
  • Petakan atribut pernyataan bernilai GUID workload_id ke sebuah nama, dan tetapkan hasilnya ke atribut khusus bernama attribute.my_display_name:

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • Gunakan operator dan fungsi logis CEL untuk menetapkan atribut khusus dengan nama attribute.environment ke prod atau test, bergantung pada identitas Amazon Resource Name (ARN):

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • Gunakan fungsi extract untuk mengisi atribut khusus aws_role dengan nama peran yang diasumsikan atau, jika tidak ada peran, dengan identitas ARN.

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    
  • Gunakan fungsi split untuk memisahkan string pada pemisah yang ditentukan. Misalnya, untuk mengekstrak atribut username dari atribut alamat email dengan memisahkan nilainya pada simbol @ dan menggunakan string pertama, gunakan pemetaan atribut berikut:

    attribute.username=assertion.email.split("@")[0]
    
  • Gunakan fungsi join untuk menggabungkan daftar string pada pemisah yang ditentukan. Misalnya, untuk mengisi atribut khusus department dengan menyambungkan daftar string dengan . sebagai pemisah, gunakan pemetaan atribut berikut:

    attribute.department=assertion.department.join(".")
    

Saat Anda menggunakan sertifikat klien X.509, Workload Identity Federation memetakan google.subject ke nama umum subjek sertifikat klien (assertion.subject.dn.cn) secara default:

google.subject=assertion.subject.dn.cn

Anda juga dapat memetakan atribut tambahan dari sertifikat leaf dan intermediate.

Untuk AWS, jika Anda tidak menentukan pemetaan atribut, Google akan menerapkan pemetaan default berikut, yang mencakup sebagian besar skenario umum:

google.subject=assertion.arn
attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn

Pemetaan ini menetapkan google.subject ke ARN pemanggil dan menetapkan attribute.aws_role ke ARN peran yang diasumsikan (tanpa nama sesi) jika peran diasumsikan, atau ke ARN pemanggil jika tidak. Anda juga dapat menyediakan pemetaan khusus.

Untuk penyedia OIDC dan SAML, Anda harus memberikan pemetaan atribut. Untuk membuat pemetaan, baca dokumentasi penyedia untuk mengetahui daftar atribut pada kredensialnya.

Untuk detail selengkapnya, lihat dokumentasi API untuk kolom attributeMapping.

Kondisi atribut

Kondisi atribut adalah ekspresi CEL yang dapat memeriksa atribut pernyataan dan atribut target. Jika kondisi atribut bernilai true untuk kredensial tertentu, kredensial tersebut akan diterima. Jika tidak, kredensial akan ditolak.

Anda dapat menggunakan kondisi atribut untuk membatasi identitas yang dapat melakukan autentikasi menggunakan workload identity pool Anda.

Kondisi atribut berguna dalam skenario seperti berikut:

  • Jika workload Anda menggunakan IdP yang tersedia untuk publik, Anda dapat membatasi akses sehingga hanya identitas yang Anda pilih yang memiliki akses ke workload identity pool Anda.

  • Jika menggunakan IdP dengan beberapa platform cloud, Anda dapat mencegah kredensial yang ditujukan untuk digunakan dengan platform lain digunakan dengan Google Cloud, dan sebaliknya. Hal ini membantu menghindari masalah confused deputy.

Kondisi atribut untuk penyedia workload identity pool dapat menggunakan kata kunci assertion, yang mengacu pada peta yang merepresentasikan kredensial autentikasi yang dikeluarkan oleh IdP. Anda dapat menggunakan notasi titik untuk mengakses nilai peta. Misalnya, kredensial AWS menyertakan nilai arn, yang dapat Anda akses sebagai assertion.arn. Selain itu, kondisi atribut dapat menggunakan atribut apa pun yang ditentukan dalam pemetaan atribut penyedia.

Contoh berikut hanya mengizinkan permintaan dari identitas yang memiliki peran AWS tertentu:

attribute.aws_role == "ROLE_MAPPING"

Untuk detail selengkapnya, lihat dokumentasi API untuk kolom attributeCondition.

Pengelolaan Akses

Alur pertukaran token menampilkan token akses federasi. Anda dapat menggunakan token akses gabungan ini untuk memberikan akses workload atas nama identitas akun utama di resource Google Cloud dan mendapatkan token akses OAuth 2.0 yang berlaku singkat.

Anda dapat menggunakan token akses ini untuk memberikan akses IAM.

Sebaiknya gunakan Workload Identity Federation untuk memberikan akses langsung ke resource Google Cloud . Meskipun sebagian besar API Google Cloud mendukung Workload Identity Federation, beberapa API memiliki batasan. Sebagai alternatif, Anda dapat menggunakan peniruan akun layanan.

Dengan token akses yang berlaku singkat, Anda dapat memanggil API Google Cloud apa pun yang dapat diakses oleh resource atau akun layanan.

Akses resource langsung

Anda dapat menggunakan akses resource langsung untuk memberikan akses identitas eksternal langsung pada resource Google Cloud menggunakan peran khusus resource.

Alternatif: Peniruan akun layanan

Sebagai alternatif untuk memberikan akses resource langsung, Anda dapat menggunakan peniruan akun layanan.

Anda harus memberikan peran Workload Identity User (roles/iam.workloadIdentityUser) ke akun layanan Anda.

Cakupan dan keamanan akun utama

Anda memberikan akses ke akun utama atau subsetnya menggunakan jenis akun utama.

Jenis akun utama

Tabel berikut menjelaskan cara menentukan akun utama sebagai individu dan grup identitas:

Identitas Format ID
Identitas tunggal principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
Semua identitas dalam grup principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
Semua identitas dengan nilai atribut tertentu principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

Langkah berikutnya