Mengautentikasi ke Google Cloud API dari beban kerja GKE


Halaman ini menunjukkan cara mengakses Google Cloud API dengan lebih aman dari workload yang berjalan di cluster Google Kubernetes Engine (GKE) menggunakan Workload Identity Federation untuk GKE.

Halaman ini ditujukan untuk Admin identitas dan akun, Operator, dan Developer yang membuat dan mengelola kebijakan terkait izin pengguna. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise umum.

Sebelum membaca halaman ini, pastikan Anda memahami konsep 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 lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan Workload Identity Federation for GKE di cluster dan node pool

Di Autopilot, Workload Identity Federation for GKE selalu diaktifkan. Lanjutkan ke bagian Mengonfigurasi aplikasi untuk menggunakan Workload Identity Federation for GKE.

Di Standard, Anda mengaktifkan Workload Identity Federation untuk GKE di cluster dan node pool menggunakan Google Cloud CLI atau Konsol Google Cloud. Workload Identity Federation for GKE harus diaktifkan di level cluster sebelum Anda dapat mengaktifkan Workload Identity Federation for GKE di kumpulan node.

Buat cluster baru

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

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Untuk mengaktifkan Workload Identity Federation untuk GKE di 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 untuk GKE di 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 Federasi Workload Identity untuk GKE di cluster Standar yang sudah ada menggunakan gcloud CLI atau Konsol Google Cloud. Node pool yang sudah ada tidak akan terpengaruh, tetapi semua node pool baru di cluster akan menggunakan Workload Identity Federation for GKE.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Untuk mengaktifkan Workload Identity Federation untuk 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 untuk GKE di 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 for GKE

Setelah mengaktifkan Workload Identity Federation for GKE di cluster yang ada, Anda dapat memigrasikan workload yang berjalan untuk menggunakan Workload Identity Federation for GKE. Pilih strategi migrasi yang ideal untuk lingkungan Anda. Anda dapat membuat node pool baru dengan mengaktifkan Workload Identity Federation untuk GKE, atau memperbarui node pool yang ada untuk mengaktifkan Workload Identity Federation untuk GKE.

Anda hanya dapat mengaktifkan Workload Identity Federation for GKE di node pool jika Workload Identity Federation for GKE diaktifkan di cluster.

Praktik terbaik:

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

Semua node pool baru yang Anda buat akan menggunakan Workload Identity Federation for GKE secara default jika cluster telah mengaktifkan Workload Identity Federation for GKE. Untuk membuat node pool baru dengan Workload Identity Federation untuk 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 telah mengaktifkan Workload Identity Federation untuk GKE.

Flag --workload-metadata=GKE_METADATA mengonfigurasi node pool untuk menggunakan server metadata GKE.

Praktik terbaik:

Sertakan flag tersebut agar pembuatan node pool 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 node pool yang ada setelah mengaktifkan Workload Identity Federation for GKE di cluster.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Untuk mengubah node pool yang ada agar dapat menggunakan Workload Identity Federation untuk GKE, jalankan perintah berikut:

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

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

Konsol

Untuk mengubah node pool yang ada agar dapat menggunakan Workload Identity Federation untuk 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 Simpan.

Mengonfigurasi aplikasi untuk menggunakan Workload Identity Federation for GKE

Agar aplikasi GKE dapat melakukan autentikasi ke Google Cloud API menggunakan Workload Identity Federation untuk GKE, Anda harus membuat kebijakan IAM untuk API tertentu. Entitas utama dalam kebijakan ini adalah ID akun utama IAM yang sesuai dengan workload, namespace, atau ServiceAccount. Proses ini menampilkan token akses gabungan yang dapat digunakan beban kerja Anda dalam panggilan API.

Atau, Anda dapat mengonfigurasi ServiceAccount Kubernetes untuk meniru identitas akun layanan IAM, yang mengonfigurasi GKE untuk menukar token akses gabungan dengan token akses dari Service Account Credentials API IAM. Untuk mengetahui detailnya, lihat bagian Alternatif: menautkan ServiceAccount Kubernetes ke IAM.

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 telah mengaktifkan Workload Identity Federation untuk GKE.
    • LOCATION: lokasi cluster Anda.
  2. Buat namespace yang akan digunakan untuk akun layanan Kubernetes. Anda juga dapat menggunakan namespace default atau namespace apa pun yang sudah ada.

    kubectl create namespace NAMESPACE
    
  3. Buat Akun Layanan Kubernetes yang akan digunakan aplikasi Anda. Anda juga dapat menggunakan Akun Layanan Kubernetes yang sudah ada di namespace mana pun. Jika Anda tidak menetapkan ServiceAccount ke workload, Kubernetes akan menetapkan ServiceAccount default di namespace.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Ganti kode berikut:

    • KSA_NAME: nama ServiceAccount Kubernetes baru Anda.
    • NAMESPACE: nama namespace Kubernetes untuk ServiceAccount.
  4. Buat kebijakan izin IAM yang mereferensikan Kubernetes ServiceAccount. Sebagai praktik yang baik, berikan izin ke resource Google Cloud tertentu yang perlu diakses 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 angka Anda.

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

Opsional: Mengonfigurasi opsi mesh layanan

Jika Anda menggunakan Istio atau Cloud Service Mesh untuk mengelola lingkungan, tambahkan anotasi berikut ke kolom metadata.annotations dalam spesifikasi Pod:

metadata:
  annotations:
    proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'

Anotasi ini mencegah penampung Anda dimulai hingga proxy mesh layanan siap mengalihkan traffic dari aplikasi Anda.

Memverifikasi penyiapan Workload Identity Federation for GKE

Di bagian ini, Anda akan membuat bucket Cloud Storage dan memberikan akses lihat di bucket ke ServiceAccount Kubernetes yang Anda buat di bagian sebelumnya. Kemudian, Anda men-deploy beban kerja dan menguji apakah penampung dapat mencantumkan 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 angka 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. Khusus di cluster Standard, tambahkan kode berikut ke kolom template.spec untuk menempatkan Pod di node pool yang menggunakan Workload Identity Federation untuk 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
    

    Setelah Pod siap, output-nya akan mirip dengan berikut ini:

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

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

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

    Outputnya adalah sebagai berikut:

    {
      "kind": "storage#objects"
    }
    

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

Alternatif: menautkan Akun Layanan Kubernetes ke IAM

Praktik terbaik:

Gunakan ID akun utama IAM untuk mengonfigurasi Workload Identity Federation untuk GKE. Namun, identitas gabungan ini memiliki batasan tertentu untuk setiap Google Cloud API 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 Akun Layanan Kubernetes:

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    
  3. Buat akun layanan IAM. Anda juga dapat menggunakan akun layanan IAM yang ada di 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. Berikan peran yang diperlukan akun layanan IAM Anda di 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 izin IAM yang memberi Kubernetes ServiceAccount akses untuk meniru identitas 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]"
    

    Nama anggota harus menyertakan namespace dan nama Akun Layanan Kubernetes. Misalnya, serviceAccount:example-project.svc.id.goog[example-namespace/example-serviceaccount].

  6. Anotasikan ServiceAccount Kubernetes agar GKE melihat link antara 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
    

    Kebijakan izin IAM dan anotasi diperlukan saat Anda menggunakan metode ini.

Menggunakan Workload Identity Federation for 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 untuk 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 untuk GKE, lakukan hal 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='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/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. Buat Pod dan mulai 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 di cluster.

Cabut akses

Untuk mencabut akses ke akun utama, hapus kebijakan izin IAM yang Anda buat di bagian Mengonfigurasi aplikasi untuk menggunakan Workload Identity Federation untuk 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='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME' \
    --role='roles/artifactregistry.reader' \
    --all

Menonaktifkan Workload Identity Federation untuk GKE

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

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Nonaktifkan Workload Identity Federation for GKE di setiap node pool:

    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 for 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 untuk GKE di setiap node pool, lakukan hal berikut untuk setiap node pool 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 Simpan.
  5. Untuk menonaktifkan Workload Identity Federation for GKE untuk cluster, lakukan langkah berikut:

    1. Klik tab Detail.
    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 for GKE di organisasi Anda

Dari perspektif keamanan, Workload Identity Federation untuk GKE memungkinkan GKE menyatakan 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 untuk GKE untuk organisasi Anda.

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

Pemecahan masalah

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

Langkah selanjutnya