Melakukan autentikasi ke Google Cloud API dari workload GKE


Dokumen ini menunjukkan cara mengakses Google Cloud API dengan lebih aman dari workload Anda yang berjalan di cluster Google Kubernetes Engine (GKE) menggunakan Workload Identity Federation for GKE. Untuk mempelajari lebih lanjut, lihat Tentang Workload Identity Federation untuk GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan Workload Identity Federation untuk GKE pada cluster dan node pool

Di Autopilot, Workload Identity Federation for GKE diaktifkan secara default. Lanjutkan ke bagian Configure Applications to use Workload Identity Federation for GKE.

Pada mode Standar, Anda mengaktifkan Workload Identity Federation for GKE pada cluster dan kumpulan node menggunakan Google Cloud CLI atau Konsol Google Cloud. Workload Identity Federation untuk GKE harus diaktifkan pada level cluster sebelum Anda dapat mengaktifkan Workload Identity Federation untuk GKE di kumpulan node.

Buat cluster baru

Anda dapat mengaktifkan Workload Identity Federation for GKE pada cluster Standar baru menggunakan gcloud CLI atau Konsol Google Cloud.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mengaktifkan Workload Identity Federation for GKE pada cluster baru, jalankan perintah berikut:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • LOCATION: lokasi Compute Engine untuk cluster.
    • PROJECT_ID: Project ID Google Cloud Anda.

Konsol

Untuk mengaktifkan Workload Identity Federation for GKE pada cluster baru, lakukan langkah berikut:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Pada dialog Create cluster, untuk GKE Standard, klik Configure.

  4. Di menu navigasi, di bagian Cluster, klik Security.

  5. Pilih kotak centang Enable Workload Identity.

  6. Lanjutkan konfigurasi cluster, lalu klik Create.

Mengupdate cluster yang ada

Anda dapat mengaktifkan Workload Identity Federation for GKE pada cluster Standar yang ada menggunakan gcloud CLI atau Konsol Google Cloud. Kumpulan node yang ada tidak akan terpengaruh, tetapi kumpulan node baru dalam cluster akan menggunakan Workload Identity Federation for GKE.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mengaktifkan Workload Identity Federation for GKE pada cluster yang ada, jalankan perintah berikut:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster yang ada.
    • LOCATION: lokasi Compute Engine cluster Anda.
    • PROJECT_ID: Project ID Google Cloud Anda.

Konsol

Untuk mengaktifkan Workload Identity Federation for GKE pada cluster yang ada, lakukan langkah berikut:

  1. Buka halaman Google Kubernetes Engine di Konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Di halaman detail cluster, di bagian Security, klik Edit Workload Identity.

  4. Pada dialog Edit Workload Identity, pilih kotak centang Enable Workload Identity

  5. Klik Simpan perubahan.

Memigrasikan workload yang ada ke Workload Identity Federation untuk GKE

Setelah mengaktifkan Workload Identity Federation for GKE pada cluster yang ada, sebaiknya migrasikan beban kerja yang berjalan agar menggunakan Workload Identity Federation for GKE. Pilih strategi migrasi yang ideal untuk lingkungan Anda. Anda dapat membuat node pool baru dengan Workload Identity Federation for GKE, atau mengupdate node pool yang ada untuk mengaktifkan Workload Identity Federation untuk GKE.

Sebaiknya buat node pool baru jika Anda juga perlu memodifikasi aplikasi agar kompatibel dengan Workload Identity Federation for GKE.

Semua kumpulan node baru yang Anda buat secara default akan menggunakan Workload Identity Federation for GKE, jika cluster telah mengaktifkan Workload Identity Federation for GKE. Untuk membuat node pool baru dengan Workload Identity Federation for GKE yang diaktifkan, jalankan perintah berikut:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-metadata=GKE_METADATA

Ganti kode berikut:

  • NODEPOOL_NAME: nama node pool baru.
  • CLUSTER_NAME: nama cluster yang ada yang mengaktifkan Workload Identity Federation for GKE.

Flag --workload-metadata=GKE_METADATA mengonfigurasi node pool untuk menggunakan server metadata GKE. Sebaiknya Anda menyertakan flag tersebut agar pembuatan kumpulan node gagal jika Workload Identity Federation for GKE tidak diaktifkan di cluster.

Memperbarui node pool yang ada

Anda dapat mengaktifkan Workload Identity Federation for GKE secara manual pada kumpulan node yang ada setelah mengaktifkan Workload Identity Federation for GKE di cluster.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mengubah kumpulan node yang ada agar menggunakan Workload Identity Federation for GKE, jalankan perintah berikut:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --workload-metadata=GKE_METADATA
    

    Jika cluster mengaktifkan Workload Identity Federation for GKE, Anda dapat menonaktifkannya secara selektif di kumpulan node tertentu dengan menentukan --workload-metadata=GCE_METADATA secara eksplisit. Lihat Melindungi metadata cluster untuk mengetahui informasi selengkapnya.

Konsol

Untuk mengubah kumpulan node yang ada agar dapat menggunakan Workload Identity Federation for GKE, lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di Konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Klik tab Nodes.

  4. Di bagian Node Pools, klik nama node pool yang ingin Anda ubah.

  5. Di halaman Detail node pool, klik Edit.

  6. Di halaman Edit node pool, pada bagian Security, pilih kotak centang Enable GKE Metadata Server.

  7. Klik Save.

Mengonfigurasi aplikasi untuk menggunakan Workload Identity Federation for GKE

Agar aplikasi GKE Anda dapat mengautentikasi ke Google Cloud API menggunakan Workload Identity Federation for GKE, Anda harus membuat kebijakan IAM untuk API tertentu. Akun utama dalam kebijakan ini adalah ID utama IAM yang sesuai dengan beban kerja, namespace, atau ServiceAccounts.

Mengonfigurasi otorisasi dan akun utama

  1. Dapatkan kredensial untuk cluster Anda:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda yang mengaktifkan Workload Identity Federation for GKE.
    • LOCATION: lokasi cluster Anda.
  2. Buat namespace yang akan digunakan untuk akun layanan Kubernetes. Anda juga dapat menggunakan namespace default atau namespace yang sudah ada.

    kubectl create namespace NAMESPACE
    
  3. Membuat ServiceAccount Kubernetes yang akan digunakan aplikasi Anda. Anda juga dapat menggunakan ServiceAccount Kubernetes yang ada di namespace apa pun. Jika Anda tidak menetapkan ServiceAccount ke workload, Kubernetes akan menetapkan ServiceAccount default dalam namespace.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Ganti kode berikut:

    • KSA_NAME: nama Akun Layanan Kubernetes baru Anda.
    • NAMESPACE: nama namespace Kubernetes untuk ServiceAccount.
  4. Buat kebijakan izin IAM yang merujuk ke ServiceAccount Kubernetes. Sebagai praktik yang baik, berikan izin ke resource Google Cloud tertentu yang perlu diakses oleh aplikasi Anda. Anda harus memiliki izin IAM yang relevan untuk membuat kebijakan izin di project Anda.

    Misalnya, perintah berikut memberikan peran Kubernetes Engine Cluster Viewer (roles/container.clusterViewer) ke ServiceAccount yang Anda buat:

    gcloud projects add-iam-policy-binding projects/PROJECT_ID \
        --role=roles/container.clusterViewer \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \
        --condition=None
    

    Ganti kode berikut:

    • PROJECT_ID: Project ID Google Cloud Anda.
    • PROJECT_NUMBER: nomor project Google Cloud numerik Anda.

    Anda dapat memberikan peran pada resource Google Cloud apa pun yang mendukung kebijakan izin IAM. Sintaksis ID utama bergantung pada resource Kubernetes. Untuk mengetahui daftar ID yang didukung, lihat ID utama untuk Workload Identity Federation for GKE.

Memverifikasi penyiapan Workload Identity Federation for GKE

Di bagian ini, Anda akan membuat bucket Cloud Storage dan memberikan akses lihat pada bucket ke ServiceAccount Kubernetes yang Anda buat di bagian sebelumnya. Kemudian, Anda akan men-deploy beban kerja dan menguji apakah container tersebut dapat membuat daftar cluster dalam project.

  1. Buat bucket Cloud Storage kosong:

    gcloud storage buckets create gs://BUCKET
    

    Ganti BUCKET dengan nama untuk bucket baru Anda.

  2. Berikan peran Storage Object Viewer (roles/storage.objectViewer) ke ServiceAccount yang Anda buat:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET \
        --role=roles/storage.objectViewer \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \
        --condition=None
    

    Ganti kode berikut:

    • PROJECT_ID: Project ID Google Cloud Anda.
    • PROJECT_NUMBER: nomor project Google Cloud numerik Anda.
    • NAMESPACE: namespace Kubernetes yang berisi ServiceAccount.
    • KSA_NAME: nama ServiceAccount.
  3. Simpan manifes berikut sebagai test-app.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
      namespace: NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: test-pod
        image: google/cloud-sdk:slim
        command: ["sleep","infinity"]
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
            ephemeral-storage: 10Mi
    
  4. Hanya di cluster Standar, tambahkan baris berikut ke kolom template.spec untuk menempatkan Pod di kumpulan node yang menggunakan Workload Identity Federation for GKE.

    Lewati langkah ini di cluster Autopilot, yang menolak nodeSelector ini karena setiap node menggunakan Workload Identity Federation untuk GKE.

    spec:
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
    
  5. Terapkan konfigurasi ke cluster Anda:

    kubectl apply -f test-app.yaml
    
  6. Tunggu hingga Pod siap. Untuk memeriksa status Pod, jalankan perintah berikut:

    kubectl get pods --namespace=NAMESPACE
    

    Saat Pod sudah siap, output-nya akan terlihat seperti berikut:

    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          5m27s
    
  7. Buka sesi shell dalam Pod:

    kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
    
  8. Mendapatkan daftar objek dalam bucket:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET/o"
    

    Output-nya adalah sebagai berikut:

    {
      "kind": "storage#objects"
    }
    

    Output ini menunjukkan bahwa Pod Anda dapat mengakses objek di dalam bucket.

Alternatif: menautkan ServiceAccounts Kubernetes ke IAM

Sebaiknya gunakan ID utama IAM untuk mengonfigurasi Workload Identity Federation for GKE. Namun, identitas gabungan ini memiliki batasan khusus untuk setiap Google Cloud API yang didukung. Untuk daftar batasan, lihat Produk dan batasan yang didukung.

Jika batasan ini berlaku untuk Anda, gunakan langkah-langkah berikut untuk mengonfigurasi akses ke API tersebut dari beban kerja GKE Anda:

  1. Membuat namespace Kubernetes:

    kubectl create namespace NAMESPACE
    
  2. Buat ServiceAccount Kubernetes:

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    
  3. Membuat akun layanan IAM. Anda juga dapat menggunakan akun layanan IAM yang ada dalam project apa pun di organisasi Anda.

    gcloud iam service-accounts create IAM_SA_NAME \
        --project=IAM_SA_PROJECT_ID
    

    Ganti kode berikut:

    • IAM_SA_NAME: nama untuk akun layanan IAM baru Anda.
    • IAM_SA_PROJECT_ID: project ID untuk akun layanan IAM Anda.

    Untuk mendapatkan informasi tentang cara melakukan otorisasi akun layanan IAM untuk mengakses Google Cloud API, lihat Memahami akun layanan.

  4. Beri akun layanan IAM Anda peran yang diperlukan pada Google Cloud API tertentu:

    gcloud projects add-iam-policy-binding IAM_SA_PROJECT_ID \
        --member "serviceAccount:IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"
    

    Ganti ROLE_NAME dengan nama peran, seperti roles/spanner.viewer.

  5. Buat kebijakan IAM yang memberi Kubernetes ServiceAccount akses untuk meniru akun layanan IAM:

    gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    
  6. Anotasikan ServiceAccount Kubernetes sehingga GKE melihat link antar-akun layanan:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace NAMESPACE \
        iam.gke.io/gcp-service-account=IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com
    

Menggunakan Workload Identity Federation untuk GKE dari kode Anda

Autentikasi ke layanan Google Cloud dari kode Anda sama dengan proses autentikasi menggunakan server metadata Compute Engine. Saat menggunakan Workload Identity Federation for GKE, permintaan Anda ke server metadata instance akan dirutekan ke server metadata GKE. Kode yang sudah ada yang melakukan autentikasi menggunakan server metadata instance (seperti kode yang menggunakan library klien Google Cloud) seharusnya dapat berfungsi tanpa modifikasi.

Menggunakan kuota dari project yang berbeda dengan Workload Identity Federation for GKE

Pada cluster yang menjalankan GKE versi 1.24 atau yang lebih baru, secara opsional Anda dapat mengonfigurasi akun layanan Kubernetes agar menggunakan kuota dari project Google Cloud yang berbeda saat melakukan panggilan ke metode GenerateAccessToken dan GenerateIdToken di file Service Account Credentials API IAM. Dengan begitu, Anda dapat menghindari penggunaan seluruh kuota di project utama, dan menggunakan kuota dari project lain untuk layanan ini di cluster Anda.

Untuk mengonfigurasi project kuota dengan Workload Identity Federation for GKE, lakukan langkah berikut:

  1. Berikan izin serviceusage.services.use pada project kuota ke akun layanan Kubernetes.

    gcloud projects add-iam-policy-binding QUOTA_PROJECT_ID \
        --role=roles/serviceusage.serviceUsageConsumer \
        --member='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/KSA_NAME' \
    

    Ganti QUOTA_PROJECT_ID dengan project ID project kuota.

  2. Anotasikan akun layanan Kubernetes dengan project kuota:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace NAMESPACE \
        iam.gke.io/credential-quota-project=QUOTA_PROJECT_ID
    

Untuk memastikan konfigurasi berfungsi dengan benar, lakukan hal berikut:

  1. Membuat Pod dan memulai sesi shell. Lihat dokumentasi Kubernetes untuk Mendapatkan Shell ke Container yang Berjalan.

  2. Buat permintaan ke server metadata:

    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
    
  3. Buka halaman Service Accounts Credentials API IAM di Konsol Google Cloud untuk project kuota Anda:

    Buka API

  4. Periksa perubahan lalu lintas.

Pembersihan

Untuk berhenti menggunakan Workload Identity Federation for GKE, cabut akses ke akun layanan IAM dan nonaktifkan Workload Identity Federation for GKE pada cluster.

Cabut akses

Untuk mencabut akses ke akun utama, hapus kebijakan izin IAM yang Anda buat di bagian Configure application to use Workload Identity Federation for GKE.

Misalnya, untuk mencabut akses ke repositori Artifact Registry, jalankan perintah berikut:

gcloud artifacts repositories remove-iam-policy-binding REPOSITORY_NAME \
    --location=REPOSITORY_LOCATION \
    --member='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/KSA_NAME' \
    --role='roles/artifactregistry.reader' \
    --all

Menonaktifkan Workload Identity Federation untuk GKE

Anda hanya dapat menonaktifkan Workload Identity Federation untuk GKE di cluster Standar.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Nonaktifkan Workload Identity Federation untuk GKE di setiap kumpulan node:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --workload-metadata=GCE_METADATA
    

    Ulangi perintah ini untuk setiap node pool dalam cluster.

  3. Nonaktifkan Workload Identity Federation untuk GKE di cluster:

    gcloud container clusters update CLUSTER_NAME \
        --disable-workload-identity
    

Konsol

  1. Buka halaman Google Kubernetes Engine di Konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Klik tab Nodes.

  4. Untuk menonaktifkan Workload Identity Federation for GKE di setiap kumpulan node, lakukan hal berikut untuk setiap kumpulan node di bagian Node Pools:

    1. Klik nama node pool yang ingin diubah.
    2. Di halaman Detail node pool, klik Edit.
    3. Di halaman Edit node pool, di bagian Security, hapus centang pada kotak Enable GKE Metadata Server.
    4. Klik Save.
  5. Untuk menonaktifkan Workload Identity Federation for GKE bagi cluster, lakukan langkah-langkah berikut:

    1. Klik tab Details.
    2. Di bagian Keamanan, di samping Workload Identity, klik Edit.
    3. Pada dialog Edit Workload Identity, hapus centang pada kotak Enable Workload Identity.
    4. Klik Simpan perubahan.

Menonaktifkan Workload Identity Federation untuk GKE di organisasi Anda

Dari perspektif keamanan, Workload Identity Federation for GKE memungkinkan GKE menegaskan identitas akun layanan Kubernetes yang dapat diautentikasi dan diberi otorisasi ke resource Google Cloud. Jika Anda adalah administrator yang telah mengambil tindakan untuk mengisolasi workload dari resource Google Cloud, seperti menonaktifkan pembuatan akun layanan atau menonaktifkan pembuatan kunci akun layanan, Anda mungkin juga ingin menonaktifkan Workload Identity Federation for GKE bagi organisasi Anda.

Lihat petunjuk ini untuk menonaktifkan Workload Identity Federation for GKE bagi organisasi Anda.

Pemecahan masalah

Untuk mengetahui informasi pemecahan masalah, lihat Memecahkan Masalah Workload Identity Federation untuk GKE.

Langkah selanjutnya