Workload identity federation

Dokumen ini memberikan ringkasan tentang penggabungan identitas untuk beban kerja eksternal. Dengan penggabungan identitas, Anda dapat memberikan akses beban kerja lokal atau multi-cloud ke resource Google Cloud, tanpa menggunakan kunci akun layanan.

Anda dapat menggunakan penggabungan identitas dengan Amazon Web Services (AWS), atau dengan penyedia identitas (IdP) apa pun yang mendukung OpenID Connect (OIDC), seperti Microsoft Azure, atau SAML 2.0.

Mengapa federasi identity?

Secara tradisional, 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.

Dengan penggabungan identitas, Anda dapat menggunakan Identity and Access Management (IAM) untuk memberikan peran IAM kepada identitas eksternal, termasuk kemampuan untuk meniru identitas akun layanan. Pendekatan ini menghilangkan beban pemeliharaan dan keamanan yang terkait dengan kunci akun layanan.

Workload Identity pools

Kumpulan identitas beban kerja 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 kumpulan identitas beban kerja adalah entitas yang menjelaskan hubungan antara Google Cloud dan IdP Anda, termasuk hal berikut:

  • AWS
  • Azure Active Directory
  • Active Directory Federation Services (AD FS) lokal
  • Okta
  • Cluster Kubernetes

Federasi Workload Identity mengikuti spesifikasi pertukaran token OAuth 2.0 Anda memberikan kredensial dari IdP ke Layanan Token Keamanan, yang memverifikasi identitas pada kredensial, lalu menampilkan token federasi sebagai gantinya.

Penyedia OIDC dengan JWK lokal

Untuk menggabungkan beban kerja 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 penyedia identitas eksternal Anda berisi satu atau beberapa atribut. Beberapa penyedia identitas menyebut atribut ini sebagai klaim.

Token Google STS 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 STS dari token eksternal. Untuk setiap atribut token Google STS, Anda dapat menentukan pemetaan atribut, yang diformat sebagai berikut:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Ganti kode berikut:

  • TARGET_ATTRIBUTE adalah atribut token Google STS
  • SOURCE_EXPRESSION adalah ekspresi Common Expression Language (CEL) yang mengubah satu atau beberapa atribut dari token yang dikeluarkan oleh penyedia identitas 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
    
  • Fungsi split membagi string pada nilai pemisah yang disediakan. Misalnya, untuk mengekstrak atribut username dari atribut alamat email dengan memisahkan nilainya pada @ dan menggunakan string pertama, gunakan pemetaan atribut berikut:

    attribute.username=assertion.email.split("@")[0]
    

  • Fungsi join menggabungkan daftar string pada nilai pemisah yang disediakan. Misalnya, untuk mengisi atribut khusus department dengan menyambungkan daftar string dengan . sebagai pemisah, gunakan pemetaan atribut berikut:

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

Untuk AWS, Google menyediakan pemetaan default, yang mencakup sebagian besar skenario umum. Anda juga dapat menyediakan pemetaan khusus.

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

Untuk detail selengkapnya, lihat dokumentasi API untuk attributeMapping kolom.

Kondisi atribut

Kondisi atribut adalah ekspresi CEL yang dapat memeriksa atribut pernyataan dan atribut target. Jika kondisi atribut dievaluasi ke 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 kumpulan workload identity Anda.

Kondisi atribut berguna dalam skenario seperti berikut:

  • Jika beban kerja Anda menggunakan penyedia identitas yang tersedia untuk publik, Anda dapat membatasi akses sehingga hanya identitas yang Anda pilih yang memiliki akses ke kumpulan workload identity Anda.

  • Jika menggunakan penyedia identitas 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 deputi yang membingungkan.

Kondisi atribut untuk penyedia kumpulan workload identity dapat menggunakan kata kunci assertion, yang mengacu pada peta yang merepresentasikan kredensial autentikasi yang dikeluarkan oleh penyedia identitas. 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.

Peniruan identitas akun layanan

Alur pertukaran token menampilkan token akses federasi. Anda dapat menggunakan token ini untuk meniru identitas akun layanan dan mendapatkan token akses OAuth 2.0 yang berlaku singkat. Dengan token akses yang berlaku singkat, Anda dapat memanggil Google Cloud API yang dapat diakses oleh akun layanan.

Untuk meniru identitas akun layanan, berikan peran Workload Identity User (roles/iam.workloadIdentityUser) kepada identitas eksternal Anda di akun layanan dengan peran yang diperlukan oleh beban kerja Anda. Anda dapat memberikan peran ke semua identitas dalam kumpulan workload identity, atau ke identitas eksternal tertentu berdasarkan atributnya.

Tabel berikut menjelaskan skenario umum untuk memberikan peran:

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 selanjutnya