Halaman ini menunjukkan cara mengonfigurasi aplikasi Anda untuk melakukan autentikasi ke APIGoogle Cloud seperti Compute Engine API atau AI Platform API dari armada yang memiliki model kepercayaan bersama di seluruh armada. Jika fleet Anda memiliki model kepercayaan campuran di seluruh fleet, lihat Mengautentikasi ke API Google Cloud dari beban kerja fleet dengan kepercayaan campuran.
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 Google Cloud dokumentasi, lihat Peran dan tugas pengguna GKE umum.
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 fleet untuk lingkungan shared-trust
Dengan Fleet Workload Identity Federation, Anda dapat melakukan autentikasi dari workload fleet ke Google Cloud API menggunakan mekanisme autentikasi Google Cloud bawaan 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 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 Workload Identity Federation for GKE di cluster Google Kubernetes Engine Anda, jika belum diaktifkan.
- Daftarkan cluster ke fleet.
Anda juga dapat mengaktifkan Workload Identity Federation for 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 mengaktifkan Workload Identity Federation fleet 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 Fleet Workload Identity Federation:
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 merupakan 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_IDOutput 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 NAMESPACEGanti
NAMESPACEdengan nama namespace.Buat ServiceAccount Kubernetes baru dalam namespace. Anda juga dapat menggunakan ServiceAccount yang sudah ada, termasuk ServiceAccount
defaultdi namespace.kubectl create serviceaccount KUBERNETES_SERVICEACCOUNT \ --namespace=NAMESPACEGanti
KUBERNETES_SERVICEACCOUNTdengan 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.yamlSimpan manifes berikut sebagai
workload-config.yaml:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: NAMESPACE spec: serviceAccountName: KUBERNETES_SERVICEACCOUNT 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 workload ini, volume
gcp-ksadi 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 Kubernetes ServiceAccount sebagai
token. Kubernetes memasang JWT yang ditandatangani untuk ServiceAccount sebagai file token ServiceAccount yang diproyeksikan.
Container di Pod memasang volume
gcp-ksake jalur/var/run/secrets/tokens/gcp-ksadan 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 merupakan 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_IDOutput 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_IDGanti 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 dapat berbeda dengan project host fleet Anda.
Beri akun layanan IAM izin apa pun yang diperlukan untuk mengakses Google Cloud API dengan menambahkan kebijakan izin IAM yang diperlukan. Anda dapat melakukannya dengan menggunakan
gcloud iam service-accounts add-iam-policy-bindingatau metode lain. Anda dapat mengetahui izin yang diperlukan untuk menggunakan API Google Cloud di dokumentasi setiap layanan, dan melihat daftar lengkap peran standar dengan izin yang diperlukan di Memahami peran.Buat ServiceAccount Kubernetes dalam namespace. Anda juga dapat menggunakan ServiceAccount Kubernetes yang sudah ada dan namespace apa pun, termasuk ServiceAccount
defaultdan namespacedefault.kubectl create serviceaccount KUBERNETES_SERVICEACCOUNT \ --namespace=NAMESPACEGanti kode berikut:
KUBERNETES_SERVICEACCOUNT: nama ServiceAccount.NAMESPACE: nama namespace.
Buat kebijakan izin IAM yang memungkinkan ServiceAccount 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.iam.gserviceaccount.com \ --project=IAM_SA_PROJECT_ID \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KUBERNETES_SERVICEACCOUNT]"Ganti
WORKLOAD_IDENTITY_POOLdengan nama workload identity pool.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", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com: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: NAMESPACE spec: serviceAccountName: KUBERNETES_SERVICEACCOUNT 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 workload ini, volume
gcp-ksadi 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 Kubernetes ServiceAccount sebagai
token. Kubernetes memasang JWT yang ditandatangani untuk ServiceAccount sebagai file token ServiceAccount yang diproyeksikan.
Container di Pod memasang volume
gcp-ksake jalur/var/run/secrets/tokens/gcp-ksadan 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 Fleet Workload Identity Federation. Sebelum melakukan langkah-langkah ini, pastikan Anda telah mengonfigurasi Workload Identity Federation dengan mengikuti petunjuk di bagian Menggunakan Workload Identity Federation armada di aplikasi.
Bagian ini tidak menunjukkan cara memverifikasi Workload Identity Federation menggunakan metode peniruan akun layanan IAM.
Temukan nomor project numerik Anda:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"Outputnya mirip dengan hal berikut ini:
1234567890Membuat bucket Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATIONGanti
LOCATIONdengan 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/KUBERNETES_SERVICEACCOUNTGanti 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.KUBERNETES_SERVICEACCOUNT: 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/bashCoba 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 adalah versi minimum Library Klien Cloud 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.