Tentang Workload Identity Federation untuk GKE


Workload Identity Federation untuk GKE adalah cara yang direkomendasikan agar workload Anda yang berjalan di Google Kubernetes Engine (GKE) dapat mengakses layanan Google Cloud dengan cara yang aman dan terkelola.

Workload Identity Federation for GKE tersedia melalui Workload Identity Federation IAM, yang menyediakan identitas untuk beban kerja yang berjalan di lingkungan di dalam dan di luar Google Cloud. Anda dapat menggunakan Workload Identity Federation IAM untuk mengautentikasi ke Google Cloud API yang didukung secara aman dari workload yang berjalan di, misalnya, AWS, Azure, dan Kubernetes mandiri. Di GKE, Google Cloud mengelola kumpulan identitas dan penyedia beban kerja untuk Anda dan tidak memerlukan penyedia identitas eksternal.

Terminologi

Halaman ini membedakan antara akun layanan Kubernetes dan akun layanan Identity and Access Management (IAM).

Akun layanan Kubernetes
Resource Kubernetes yang memberikan identitas untuk proses yang berjalan di pod GKE Anda.
Akun layanan IAM
Resource Google Cloud yang memungkinkan aplikasi melakukan panggilan yang sah ke Google Cloud API.

Apa yang dimaksud dengan Workload Identity Federation for GKE?

Aplikasi yang berjalan di GKE mungkin memerlukan akses ke Google Cloud API seperti Compute Engine API, BigQuery Storage API, atau Machine Learning API.

Dengan Workload Identity Federation untuk GKE, Anda dapat menggunakan kebijakan IAM untuk memberikan akses workload Kubernetes di cluster GKE Anda ke Google Cloud API tertentu tanpa memerlukan konfigurasi manual atau metode yang kurang aman seperti file kunci akun layanan. Dengan menggunakan Workload Identity Federation untuk GKE, Anda dapat menetapkan identitas dan otorisasi yang berbeda secara terperinci untuk setiap aplikasi di cluster.

Workload Identity Federation for GKE menggantikan kebutuhan untuk menggunakan Penyembunyian metadata. Metadata sensitif yang dilindungi oleh penyembunyian metadata juga dilindungi oleh Workload Identity Federation untuk GKE.

Cara kerja Workload Identity Federation for GKE

Saat Anda mengaktifkan Workload Identity Federation untuk GKE di cluster, GKE akan melakukan hal berikut:

  • Membuat workload identity pool tetap untuk project Google Cloud cluster dengan format berikut:

    PROJECT_ID.svc.id.goog
    

    Workload identity pool menyediakan format penamaan yang memungkinkan IAM memahami dan memercayai kredensial Kubernetes. GKE tidak menghapus workload identity pool ini meskipun Anda menghapus semua cluster dalam project.

  • Mendaftarkan cluster GKE sebagai penyedia identitas di workload identity pool.

  • Men-deploy server metadata GKE, yang mencegat permintaan kredensial dari workload, di setiap node.

Membuat kebijakan izin IAM di resource Google Cloud

Untuk memberikan akses dengan Workload Identity Federation untuk GKE, Anda membuat kebijakan izin IAM yang memberikan akses pada resource Google Cloud tertentu kepada akun utama yang sesuai dengan identitas aplikasi Anda. Misalnya, Anda dapat memberikan izin baca di bucket Cloud Storage ke semua Pod yang menggunakan ServiceAccount Kubernetes database-reader.

Untuk daftar resource yang mendukung kebijakan izin, lihat Jenis resource yang menerima kebijakan izin.

Menggunakan kondisi dalam kebijakan IAM

Anda juga dapat membatasi cakupan akses dengan menetapkan kondisi dalam kebijakan izin. Kondisi adalah metode yang dapat diperluas untuk menentukan kapan kebijakan izin harus diterapkan. Misalnya, Anda dapat menggunakan kondisi untuk memberikan akses sementara ke workload di resource Google Cloud tertentu, sehingga tidak perlu mengelola akses tersebut secara manual.

Kondisi juga dapat berguna jika Anda menetapkan kebijakan izin di tingkat project, folder, atau organisasi, bukan pada resource tertentu seperti secret Secret Manager atau bucket Cloud Storage.

Untuk menambahkan kondisi ke kebijakan izin, gunakan referensi berikut:

Contoh ekspresi berikut adalah untuk skenario umum tempat Anda mungkin menggunakan kondisi. Untuk daftar atribut yang tersedia dalam ekspresi, lihat Referensi atribut untuk IAM Conditions.

Contoh ekspresi kondisi
Mengizinkan akses sebelum waktu yang ditentukan
request.time < timestamp('TIMESTAMP')

Ganti TIMESTAMP dengan stempel waktu dalam UTC, seperti 2024-08-30T00:00:00.000Z.

Izinkan akses jika resource dalam permintaan memiliki tag yang ditentukan
resource.matchTag('TAG_KEY', 'TAG_VALUE')

Ganti kode berikut:

  • TAG_KEY: kunci tag yang akan dicocokkan, seperti env
  • TAG_VALUE: nilai tag, seperti dev

Mereferensikan resource Kubernetes dalam kebijakan IAM

Dalam kebijakan IAM, Anda merujuk ke resource Kubernetes menggunakan ID akun utama IAM untuk memilih resource. ID ini memiliki sintaksis berikut:

PREFIX://iam.googleapis.com/projects/1234567890/locations/global/workloadIdentityPools/example-project.svc.id.goog/SELECTOR

Dalam contoh ini, pertimbangkan kolom berikut:

  • PREFIX: harus principal atau principalSet, bergantung pada resource yang Anda pilih. principal ditujukan untuk resource tertentu, seperti satu ServiceAccount. principalSet ditujukan untuk beberapa resource yang termasuk dalam resource yang ditentukan, seperti semua Pod dalam cluster tertentu.
  • SELECTOR: string yang memilih jenis akun utama. Misalnya, kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID memilih ServiceAccount berdasarkan UID-nya.

Tabel berikut menunjukkan jenis akun utama yang didukung di GKE:

Jenis ID utama Sintaks
Semua Pod yang menggunakan Akun Layanan Kubernetes tertentu Pilih ServiceAccount berdasarkan namanya:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project numerik Anda. Untuk mendapatkan nomor project, lihat Mengidentifikasi project.
  • PROJECT_ID: Project ID Google Cloud Anda.
  • NAMESPACE: namespace Kubernetes.
  • SERVICEACCOUNT: nama ServiceAccount Kubernetes.

Pilih ServiceAccount menurut UID:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project numerik Anda. Untuk mendapatkan nomor project, lihat Mengidentifikasi project.
  • PROJECT_ID: Project ID Google Cloud Anda.
  • SERVICEACCOUNT_UID: UID objek ServiceAccount di server API.
Semua Pod dalam namespace, terlepas dari akun layanan atau cluster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project numerik Anda. Untuk mendapatkan nomor project, lihat Mengidentifikasi project.
  • PROJECT_ID: Project ID Google Cloud Anda.
  • NAMESPACE: namespace Kubernetes.
Semua Pod dalam cluster tertentu
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.cluster/https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project numerik Anda. Untuk mendapatkan nomor project, lihat Mengidentifikasi project.
  • PROJECT_ID: Project ID Google Cloud Anda.
  • CLUSTER_NAME: nama cluster GKE Anda.
  • LOCATION: lokasi cluster Anda.

Alur kredensial

Saat beban kerja mengirim permintaan untuk mengakses Google Cloud API, misalnya saat menggunakan library klien Google Cloud, langkah-langkah autentikasi berikut akan terjadi:

Cara workload mendapatkan token akun layanan IAM dengan Workload Identity.
Gambar 1: Cara workload mendapatkan token identitas gabungan dengan Workload Identity Federation for GKE.
  1. Kredensial default aplikasi (ADC) meminta token akses Google Cloud dari server metadata Compute Engine yang berjalan di VM.
  2. Server metadata GKE mencegat permintaan token dan meminta token ServiceAccount Kubernetes dari server Kubernetes API yang mengidentifikasi workload yang meminta. Kredensial ini adalah token web JSON (JWT) yang ditandatangani oleh server API.
  3. Server metadata GKE menggunakan Security Token Service untuk menukar JWT dengan token akses Google Cloud gabungan berumur pendek yang mereferensikan identitas beban kerja Kubernetes.

Token akses gabungan yang ditampilkan oleh Security Token Service mungkin memiliki batasan saat mencoba mengakses beberapa layanan Google Cloud, seperti yang dijelaskan dalam Produk dan batasan yang didukung. Jika layanan Google Cloud yang dipilih memiliki batasan, Anda dapat mengonfigurasi peniruan identitas akun layanan secara opsional. Metode ini menghasilkan token akses untuk akun layanan IAM yang dapat digunakan oleh workload Anda untuk mengakses layanan target. Untuk mengetahui detailnya, lihat menautkan ServiceAccount Kubernetes ke IAM.

Selanjutnya, beban kerja dapat mengakses Google Cloud API apa pun yang dapat diakses oleh ID akun utama IAM dari beban kerja.

Kesamaan identitas

Jika metadata dalam ID akun utama Anda sama untuk workload di beberapa cluster yang berbagi kumpulan identitas beban kerja karena termasuk dalam project Google Cloud yang sama, IAM akan mengidentifikasi workload tersebut sebagai sama. Misalnya, jika Anda memiliki namespace yang sama di dua cluster dan Anda memberikan akses ke namespace tersebut di IAM, beban kerja di namespace tersebut di kedua cluster akan mendapatkan akses tersebut. Anda dapat membatasi akses ini ke cluster tertentu menggunakan kebijakan IAM bersyarat.

Misalnya, perhatikan diagram berikut. Cluster A dan B termasuk dalam workload identity pool yang sama. Google Cloud mengidentifikasi aplikasi yang menggunakan ServiceAccount back-ksa di namespace backend Cluster A dan Cluster B sebagai identitas yang sama. IAM tidak membedakan berbagai cluster yang melakukan panggilan.

Diagram yang menggambarkan kesamaan identitas dalam workload identity pool
Gambar 2: Kesamaan identitas dalam mengakses Google Cloud API dengan Workload Identity Federation untuk GKE.

Kesamaan identitas ini juga berarti bahwa Anda harus dapat memercayai setiap cluster dalam workload identity pool tertentu. Misalnya, jika cluster baru, Cluster C dalam contoh sebelumnya dimiliki oleh tim yang tidak tepercaya, mereka dapat membuat namespace backend dan mengakses Google Cloud API menggunakan back-ksa ServiceAccount, sama seperti Cluster A dan Cluster B.

Untuk menghindari akses yang tidak tepercaya, tempatkan cluster Anda dalam project terpisah untuk memastikan bahwa cluster tersebut mendapatkan workload identity pool yang berbeda, atau pastikan bahwa nama namespace berbeda satu sama lain untuk menghindari ID akun utama yang sama.

Memahami server metadata GKE

Setiap node di GKE yang mengaktifkan Workload Identity Federation for GKE menyimpan metadatanya di server metadata GKE. Server metadata GKE adalah subset endpoint server metadata Compute Engine yang diperlukan untuk workload Kubernetes.

Server metadata GKE berjalan sebagai DaemonSet, dengan satu Pod di setiap node Linux atau layanan Windows native di setiap node Windows di cluster. Server metadata mencegat permintaan HTTP ke http://metadata.google.internal (169.254.169.254:80). Misalnya, permintaan GET /computeMetadata/v1/instance/service-accounts/default/token mengambil token untuk akun layanan IAM yang telah dikonfigurasi oleh Pod untuk ditiru. Traffic ke server metadata GKE tidak pernah keluar dari instance VM yang menghosting Pod.

Tabel berikut menjelaskan subset endpoint server metadata Compute Engine yang tersedia dengan server metadata GKE. Untuk mengetahui daftar lengkap endpoint yang tersedia di server metadata Compute Engine, baca Nilai metadata VM default.

Metadata instance

Metadata instance disimpan di direktori berikut ini.

http://metadata.google.internal/computeMetadata/v1/instance/

Entri Deskripsi
hostname

Nama host node Anda.

id

ID unik node Anda.

service-accounts/

Direktori akun layanan yang terkait dengan node. Untuk setiap akun layanan, tersedia informasi berikut:

  • aliases
  • email: alamat email akun layanan.
  • identity: Token Web JSON (JWT) unik untuk node. Anda harus menyertakan parameter audience dalam permintaan. Misalnya, ?audience=http://www.example.com.
  • scopes: cakupan akses yang ditetapkan ke akun layanan.
  • token: token akses OAuth 2.0 untuk mengautentikasi workload Anda.
zone

Zona Compute Engine dari node GKE Anda.

Atribut instance

Atribut instance disimpan di direktori berikut.

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

Entri Deskripsi
cluster-location

Zona atau region Compute Engine dari cluster Anda.

cluster-name

Nama cluster GKE Anda.

cluster-uid

UID cluster GKE Anda.

Metadata project

Metadata project cluster disimpan di direktori berikut.

http://metadata.google.internal/computeMetadata/v1/project/

Entri Deskripsi
project-id

ID Project Google Cloud Anda.

numeric-project-id

Nomor project Google Cloud Anda.

Batasan Workload Identity Federation untuk GKE

  • Anda tidak dapat mengubah nama workload identity pool yang dibuat GKE untuk project Google Cloud.

  • Saat GKE mengaktifkan server metadata GKE pada suatu node pool, Pod tidak dapat lagi mengakses server metadata Compute Engine. Sebagai gantinya, server metadata GKE mencegat permintaan yang dibuat dari pod ini ke endpoint metadata, kecuali Pod yang berjalan di jaringan host.

  • Server metadata GKE memerlukan waktu beberapa detik untuk mulai menerima permintaan pada Pod yang baru dibuat. Oleh karena itu, upaya autentikasi menggunakan Workload Identity Federation for GKE dalam beberapa detik pertama masa aktif Pod mungkin akan gagal. Mencoba kembali panggilan akan menyelesaikan masalah. Baca artikel Pemecahan masalah untuk mengetahui detail selengkapnya.

  • Agen logging dan pemantauan bawaan GKE terus menggunakan akun layanan node.

  • Workload Identity Federation for GKE memerlukan penyiapan manual untuk penayangan Knative agar dapat terus merilis metrik permintaan.

  • Workload Identity Federation for GKE menetapkan batas 200 koneksi ke server metadata GKE untuk setiap node guna menghindari masalah memori. Anda mungkin akan mengalami waktu tunggu jika node Anda melebihi batas ini.

  • Workload Identity Federation for GKE untuk node Windows Server tersedia di GKE versi 1.18.16-gke.1200, 1.19.8-gke.1300, 1.20.4-gke.1500, dan yang lebih baru.

  • Server metadata GKE menggunakan resource memori yang sebanding dengan total jumlah akun layanan Kubernetes di cluster Anda. Jika cluster Anda memiliki lebih dari 3.000 akun layanan Kubernetes, kubelet mungkin akan menghentikan Pod server metadata. Untuk melakukan mitigasi, lihat Pemecahan masalah.

Alternatif untuk Workload Identity Federation for GKE

Anda dapat menggunakan salah satu alternatif berikut untuk Workload Identity Federation for GKE guna mengakses Google Cloud API dari GKE. Sebaiknya gunakan Workload Identity Federation untuk GKE karena alternatif ini mengharuskan Anda mengorbankan keamanan tertentu.

Langkah selanjutnya