Halaman ini menunjukkan cara mengonfigurasi aplikasi Anda untuk melakukan autentikasi ke Google Cloud API seperti Compute Engine API atau AI Platform API dari kumpulan instance yang memiliki model kepercayaan bersama di seluruh kumpulan instance. Jika fleet Anda memiliki model kepercayaan campuran di seluruh fleet, lihat Mengautentikasi ke API Google Cloud dari beban kerja fleet dengan kepercayaan campuran (Pratinjau).
Halaman ini ditujukan untuk admin dan operator Platform serta Engineer keamanan yang ingin mengautentikasi secara terprogram dari workload fleet ke API Google Cloud. Untuk mempelajari lebih lanjut peran pengguna dan contoh tugas yang kami referensikan dalam dokumentasi, lihat Peran dan tugas pengguna umum GKE Enterprise. Google Cloud
Sebelum membaca halaman ini, pastikan Anda memahami konsep berikut:
- Tentang Workload Identity Federation armada
- ConfigMaps Kubernetes
- Kebijakan izin Identity and Access Management (IAM)
Tentang Workload Identity Federation armada untuk lingkungan shared-trust
Dengan Fleet Workload Identity Federation, Anda dapat melakukan autentikasi dari beban kerja fleet ke APIGoogle Cloud dengan menggunakan mekanisme autentikasi bawaan Google Cloud dan Kubernetes. Fleet Workload Identity Federation menghilangkan kebutuhan untuk menggunakan metode yang kurang aman seperti memasang token akses di Pod atau menyimpan kredensial yang memiliki masa aktif lama.
Secara default, project host fleet Anda menggunakan workload identity pool yang dikelola Google untuk menyediakan identitas bagi entitas di seluruh fleet. Entitas apa pun di fleet atau di project host fleet yang memiliki ID IAM yang sama dianggap sebagai hal yang sama oleh IAM. Kesamaan identitas implisit ini berguna saat memberikan akses dalam skala besar di lingkungan dengan kepercayaan bersama, seperti fleet tenant tunggal, yang tidak masalah jika entity lain secara tidak sengaja mendapatkan izin serupa pada resource.
Sebelum memulai
Pastikan Anda telah menginstal alat command line berikut:
- Versi terbaru Google Cloud CLI, yang mencakup
gcloud
, alat command line untuk berinteraksi dengan Google Cloud. kubectl
Jika Anda menggunakan Cloud Shell sebagai lingkungan shell untuk berinteraksi dengan Google Cloud, alat ini akan diinstal untuk Anda.
- Versi terbaru Google Cloud CLI, yang mencakup
Pastikan Anda telah menginisialisasi gcloud CLI untuk digunakan dengan project Anda.
Menyiapkan cluster
Sebelum aplikasi di fleet Anda dapat menerima identitas gabungan, cluster tempat aplikasi berjalan harus didaftarkan ke fleet Anda dan dikonfigurasi dengan benar untuk menggunakan Workload Identity Federation fleet. Bagian berikut menjelaskan cara menyiapkan Workload Identity Federation armada untuk berbagai jenis cluster.
GKE
Untuk cluster GKE, lakukan hal berikut:
- Aktifkan Federasi Workload Identity untuk GKE di cluster Google Kubernetes Engine Anda, jika belum diaktifkan.
- Daftarkan cluster ke fleet.
Anda juga dapat mengaktifkan Workload Identity Federation untuk GKE selama proses pembuatan cluster dan pendaftaran fleet.
Cluster di luar Google Cloud
Jenis cluster berikut otomatis mengaktifkan Workload Identity Federation fleet dan didaftarkan ke fleet Anda selama pembuatan cluster:
- Google Distributed Cloud (khusus software) di VMware
- Google Distributed Cloud (khusus software) di bare metal
- GKE di AWS
- GKE di Azure
Cluster terpasang
Cluster terlampir EKS dan AKS yang didaftarkan menggunakan GKE Multi-Cloud API didaftarkan dengan Workload Identity Federation fleet yang diaktifkan secara default. Cluster terlampir lainnya dapat didaftarkan dengan Workload Identity Federation fleet yang diaktifkan jika memenuhi persyaratan yang diperlukan. Ikuti petunjuk untuk jenis cluster Anda di Mendaftarkan cluster.
Menggunakan Workload Identity Federation armada di aplikasi
Langkah-langkah berikut menunjukkan cara mengonfigurasi workload di cluster terdaftar untuk menggunakan Workload Identity Federation armada:
Temukan nama workload identity pool dan penyedia identitas cluster Anda:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Ganti kode berikut:
MEMBERSHIP_ID
: nama keanggotaan cluster. Nama ini sering kali berupa nama cluster Anda.FLEET_PROJECT_ID
: project ID dari project host fleet.
Outputnya mirip dengan hal berikut ini:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Output ini berisi informasi berikut:
IDENTITY_PROVIDER
: penyedia identitas untuk cluster.MEMBERSHIP_LOCATION
: lokasi keanggotaan fleet. Lokasi ini biasanya sama dengan lokasi cluster Anda.WORKLOAD_IDENTITY_POOL
: nama workload identity pool yang terkait dengan fleet Anda. Nilai ini memiliki sintaksisFLEET_PROJECT_ID.svc.id.goog
.
Buat namespace Kubernetes. Anda juga dapat menggunakan namespace yang sudah ada, termasuk namespace
default
.kubectl create namespace NAMESPACE
Ganti
NAMESPACE
dengan nama namespace.Buat Akun Layanan Kubernetes baru dalam namespace. Anda juga dapat menggunakan ServiceAccount yang sudah ada, termasuk ServiceAccount
default
di namespace.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Ganti
KSA_NAME
dengan nama ServiceAccount.Simpan manifes berikut sebagai
adc-config-map.yaml
. ConfigMap ini berisi konfigurasi ADC untuk workload.kind: ConfigMap apiVersion: v1 metadata: namespace: NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
Men-deploy ConfigMap:
kubectl create -f adc-config-map.yaml
Simpan manifes berikut sebagai
workload-config.yaml
:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: sample-container image: google/cloud-sdk:slim command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
Saat Anda men-deploy beban kerja ini, volume
gcp-ksa
di Pod akan berisi data berikut:- Data di ConfigMap yang Anda deploy sebagai file bernama
google-application-credentials.json
. File ini adalah file konfigurasi kredensial ADC. - Token Akun Layanan Kubernetes sebagai
token
. Kubernetes memasang JWT yang ditandatangani untuk ServiceAccount sebagai file token ServiceAccount yang diproyeksikan.
Container di Pod memasang volume
gcp-ksa
ke jalur/var/run/secrets/tokens/gcp-ksa
dan mengonfigurasi ADC untuk mencari file JSON konfigurasi kredensial di jalur tersebut.- Data di ConfigMap yang Anda deploy sebagai file bernama
Men-deploy workload:
kubectl apply -f workload-config.yaml
Alternatif: Meniru identitas akun layanan IAM
Atau, Anda dapat mengonfigurasi ServiceAccount Kubernetes di cluster untuk meniru akun layanan IAM dan melakukan tindakan resmi apa pun yang dapat dilakukan oleh akun layanan IAM. Pendekatan ini dapat meningkatkan beban pemeliharaan, karena Anda harus mengelola pasangan akun layanan di IAM dan Kubernetes.
Dalam sebagian besar skenario, sebaiknya Anda langsung mereferensikan principal Kubernetes dalam kebijakan pemberian izin IAM untuk memberikan akses ke resourceGoogle Cloud dengan mengikuti petunjuk di Menggunakan Federasi Workload Identity fleet dalam aplikasi.
Temukan nama workload identity pool dan penyedia identitas cluster Anda:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Ganti kode berikut:
MEMBERSHIP_ID
: nama keanggotaan cluster. Nama ini sering kali berupa nama cluster Anda.FLEET_PROJECT_ID
: project ID dari project host fleet.
Outputnya mirip dengan hal berikut ini:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Output ini berisi informasi berikut:
IDENTITY_PROVIDER
: penyedia identitas untuk cluster.MEMBERSHIP_LOCATION
: lokasi keanggotaan. Lokasi ini biasanya sama dengan lokasi cluster Anda.WORKLOAD_IDENTITY_POOL
: nama workload identity pool yang terkait dengan fleet Anda. Nilai ini memiliki sintaksisFLEET_PROJECT_ID.svc.id.goog
.
Buat akun layanan IAM yang dapat ditiru identitasnya oleh aplikasi Anda. Anda juga dapat menggunakan akun layanan IAM yang sudah ada.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
Ganti kode berikut:
IAM_SA_NAME
: nama akun layanan IAM Anda.IAM_SA_PROJECT_ID
: project ID project yang berisi akun layanan IAM Anda. Project ini bisa berbeda dengan project host fleet Anda.
Berikan izin apa pun yang diperlukan akun layanan IAM untuk mengakses API dengan menambahkan kebijakan izin IAM yang diperlukan. Google Cloud Anda dapat melakukannya dengan menggunakan
gcloud iam service-accounts add-iam-policy-binding
atau metode lain. Anda dapat mengetahui izin yang diperlukan untuk menggunakan API Google Cloud di dokumentasi setiap layanan, dan melihat daftar lengkap peran bawaan dengan izin yang diperlukan di Memahami peran.Buat Akun Layanan Kubernetes dalam namespace. Anda juga dapat menggunakan ServiceAccount Kubernetes yang sudah ada dan namespace apa pun, termasuk ServiceAccount
default
dan namespacedefault
.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Ganti kode berikut:
KSA_NAME
: nama ServiceAccount.NAMESPACE
: nama namespace.
Buat kebijakan izinkan IAM yang memungkinkan Akun Layanan Kubernetes di namespace tertentu di cluster Anda meniru identitas akun layanan IAM:
gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID. \ --project=IAM_SA_PROJECT_ID \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"
Ganti
WORKLOAD_IDENTITY_POOL
dengan nama kumpulan identitas beban kerja.Simpan manifes berikut sebagai
adc-config-map.yaml
. ConfigMap ini berisi konfigurasi ADC untuk workload.kind: ConfigMap apiVersion: v1 metadata: namespace: K8S_NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
Ganti kode berikut:
IAM_SA_NAME
: nama akun layanan IAM yang akan di-impersonate.IAM_SA_PROJECT_ID
: project ID akun layanan IAM.
Simpan manifes berikut sebagai
workload-config.yaml
:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: K8S_NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: my-container image: my-image command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
Saat Anda men-deploy beban kerja ini, volume
gcp-ksa
di Pod akan berisi data berikut:- Data di ConfigMap yang Anda deploy sebagai file bernama
google-application-credentials.json
. File ini adalah file konfigurasi kredensial ADC. - Token Akun Layanan Kubernetes sebagai
token
. Kubernetes memasang JWT yang ditandatangani untuk ServiceAccount sebagai file token ServiceAccount yang diproyeksikan.
Container di Pod memasang volume
gcp-ksa
ke jalur/var/run/secrets/tokens/gcp-ksa
dan mengonfigurasi ADC untuk mencari file JSON konfigurasi kredensial di jalur tersebut.- Data di ConfigMap yang Anda deploy sebagai file bernama
Men-deploy workload:
kubectl apply -f workload-config.yaml
Memverifikasi penyiapan Workload Identity Federation armada
Di bagian ini, Anda akan membuat bucket Cloud Storage dan mengaksesnya dari Pod yang menggunakan Workload Identity Federation armada. Sebelum melakukan langkah-langkah ini, pastikan Anda telah mengonfigurasi Workload Identity Federation dengan mengikuti petunjuk di bagian Menggunakan Workload Identity Federation armada dalam aplikasi.
Bagian ini tidak menunjukkan cara memverifikasi Workload Identity Federation menggunakan metode peniruan identitas akun layanan IAM.
Temukan nomor project numerik Anda:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"
Outputnya mirip dengan hal berikut ini:
1234567890
Membuat bucket Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATION
Ganti
LOCATION
dengan lokasi Google Cloud.Buat kebijakan izin IAM yang memberikan akses ke bucket untuk akun layanan yang Anda buat:
gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \ --condition=None \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
Ganti kode berikut:
FLEET_PROJECT_NUMBER
: nomor project numerik Anda.FLEET_PROJECT_ID
: project ID Anda.NAMESPACE
: nama namespace Kubernetes yang menjalankan Pod Anda dari bagian sebelumnya.KSA_NAME
: nama ServiceAccount Kubernetes yang digunakan Pod Anda dari bagian sebelumnya.
Buat sesi shell di Pod Anda:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
Coba buat daftar objek di bucket:
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"
Outputnya adalah sebagai berikut:
{ "kind": "storage#objects" }
Melakukan autentikasi dari kode Anda
Saat Anda menggunakan Library Klien Cloud, library autentikasi akan otomatis menggunakan ADC untuk mencari kredensial guna mengautentikasi ke layanan Google Cloud . Anda harus menggunakan Library Klien Cloud yang mendukung Workload Identity Federation. Berikut menunjukkan versi Library Klien Cloud minimum yang diperlukan, serta petunjuk cara memeriksa versi saat ini:
C++
Sebagian besar
Google Cloud Client Libraries for C++
mendukung penggabungan identitas dengan menggunakan objek ChannelCredentials
, yang
dibuat dengan memanggil grpc::GoogleDefaultCredentials()
. Untuk melakukan inisialisasi
kredensial ini, Anda harus membangun library klien dengan gRPC versi
1.36.0 atau yang lebih baru.
Library Klien Cloud Storage untuk C++ menggunakan REST API, bukan gRPC, sehingga tidak mendukung penggabungan identitas.
Go
Library klien untuk Go mendukung penggabungan identitas jika menggunakan modul golang.org/x/oauth2
versi
v0.0.0-20210218202405-ba52d332ba99 atau versi lebih baru.
Untuk memeriksa versi modul yang digunakan library klien Anda, jalankan perintah berikut:
cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2
Java
Library klien untuk Java mendukung penggabungan identitas jika menggunakan artefak com.google.auth:google-auth-library-oauth2-http
versi 0.24.0
atau versi lebih baru.
Untuk memeriksa versi artefak yang digunakan library klien Anda, jalankan perintah Maven berikut di direktori aplikasi Anda:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
Library klien untuk Node.js mendukung penggabungan identitas jika menggunakan
paket google-auth-library
versi 7.0.2
atau versi lebih baru.
Untuk memeriksa versi paket yang digunakan library klien Anda, jalankan perintah berikut di direktori aplikasi Anda:
npm list google-auth-library
Saat membuat objek GoogleAuth
, Anda dapat menentukan project ID atau
mengizinkan GoogleAuth
untuk otomatis menemukan project ID. Untuk otomatis menemukan
project ID, akun layanan dalam file konfigurasi harus memiliki
peran Browser (roles/browser
), atau peran dengan izin yang setara,
di project Anda. Untuk mengetahui detailnya, lihat
README
untuk paket google-auth-library
.
Python
Library klien untuk Python mendukung penggabungan identitas jika menggunakan
paket google-auth
versi 1.27.0
atau versi lebih baru.
Untuk memeriksa versi paket yang digunakan library klien Anda, jalankan perintah berikut di lingkungan tempat paket diinstal:
pip show google-auth
Untuk menentukan project ID bagi klien autentikasi, Anda dapat menetapkan
variabel lingkungan GOOGLE_CLOUD_PROJECT
atau mengizinkan klien untuk otomatis
menemukan project ID. Untuk otomatis menemukan project ID,
akun layanan dalam file konfigurasi harus memiliki peran Browser (roles/browser
),
atau peran dengan izin yang setara, di project Anda. Untuk mengetahui detailnya, lihat
panduan pengguna untuk paket google-auth
.
Apa langkah selanjutnya?
Pelajari praktik terbaik untuk mengatur armada saat menggunakan Workload Identity Federation armada.