Mengautentikasi ke Google Cloud API dari workload fleet kepercayaan bersama

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 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.

  • 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:

  1. Aktifkan Federasi Workload Identity untuk GKE di cluster Google Kubernetes Engine Anda, jika belum diaktifkan.
  2. 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:

  1. 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 sintaksis FLEET_PROJECT_ID.svc.id.goog.
  2. Buat namespace Kubernetes. Anda juga dapat menggunakan namespace yang sudah ada, termasuk namespace default.

    kubectl create namespace NAMESPACE
    

    Ganti NAMESPACE dengan nama namespace.

  3. 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.

  4. 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"
          }
        }
    
  5. Men-deploy ConfigMap:

    kubectl create -f adc-config-map.yaml
    
  6. 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:

    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.

  7. 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.

  1. 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 sintaksis FLEET_PROJECT_ID.svc.id.goog.
  2. 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.
  3. 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.

  4. Buat Akun Layanan Kubernetes dalam namespace. Anda juga dapat menggunakan ServiceAccount Kubernetes yang sudah ada dan namespace apa pun, termasuk ServiceAccount default dan namespace default.

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    Ganti kode berikut:

    • KSA_NAME: nama ServiceAccount.
    • NAMESPACE: nama namespace.
  5. 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.

  6. 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.
  7. 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:

    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.

  8. 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.

  1. Temukan nomor project numerik Anda:

    gcloud projects describe FLEET_PROJECT_ID \
        --format="value(projectNumber)"
    

    Outputnya mirip dengan hal berikut ini:

    1234567890
    
  2. Membuat bucket Cloud Storage:

    gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \
        --location=LOCATION
    

    Ganti LOCATION dengan lokasi Google Cloud.

  3. 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.
  4. Buat sesi shell di Pod Anda:

    kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
    
  5. 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.