Mengonfigurasi workload identity federation dengan AWS atau Azure

Panduan ini menjelaskan cara menggunakan workload identity federation agar workload AWS dan Azure dapat mengautentikasi ke Google Cloud tanpa kunci akun layanan.

Dengan workload identity federation, workload yang berjalan di AWS EC2 dan Azure dapat menukar kredensial khusus lingkungan untuk token Layanan Token Keamanan Google Cloud jangka pendek.

Kredensial khusus lingkungan meliputi:

Dengan menyiapkan workload identity federation, Anda dapat mengizinkan workload ini menukar kredensial khusus lingkungan dengan kredensial Google Cloud jangka pendek. Workload dapat menggunakan kredensial jangka pendek ini untuk mengakses Google Cloud API.

Sebelum memulai

  • Siapkan autentikasi.

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    Konsol

    Saat menggunakan Konsol Google Cloud untuk mengakses API dan layanan Google Cloud, Anda tidak perlu menyiapkan autentikasi.

    gcloud

    Anda dapat menggunakan sampel gcloud CLI di halaman ini dari salah satu lingkungan pengembangan berikut:

    • Cloud Shell: Untuk menggunakan terminal online dengan gcloud CLI yang sudah disiapkan, aktifkan Cloud Shell.

      Di bagian bawah halaman ini, sesi Cloud Shell akan dimulai dan menampilkan perintah command line. Perlu waktu beberapa detik hingga sesi dimulai.

    • Shell lokal: Untuk menggunakan gcloud CLI di lingkungan pengembangan lokal, instal dan initialize gcloud CLI.

    Python

    Untuk menggunakan contoh Python di halaman ini dari lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Menginstal Google Cloud CLI.
    2. Untuk initialize gcloud CLI, jalankan perintah berikut:

      gcloud init
    3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

      gcloud auth application-default login

    Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud.

Menyiapkan penyedia identitas eksternal

Anda hanya perlu melakukan langkah ini satu kali untuk setiap tenant Azure AD atau akun AWS.

AWS

Anda tidak perlu membuat perubahan konfigurasi di akun AWS.

Setelah configure workload identity pool agar dapat mempercayai akun AWS, Anda dapat mengizinkan pengguna AWS dan peran AWS untuk menggunakan kredensial keamanan AWS sementara atau permanen guna memperoleh kredensial Google Cloud jangka pendek.

Azure

Anda harus membuat aplikasi Azure AD yang baru di tenant Azure AD dan mengonfigurasinya agar dapat digunakan untuk workload identity federation.

Setelah configure workload identity pool agar dapat mempercayai aplikasi, pengguna dan akun utama layanan Azure dapat meminta token akses untuk aplikasi ini, serta menukarnya dengan kredensial Google Cloud jangka pendek.

Untuk membuat aplikasi, lakukan langkah berikut:

  1. Buat aplikasi dan akun utama layanan Azure AD.

  2. Tetapkan URI ID Aplikasi untuk aplikasi tersebut. Anda dapat menggunakan URI ID Aplikasi default (api://APPID) atau menentukan URI kustom.

    Anda akan memerlukan URI ID Aplikasi saat mengonfigurasi penyedia workload identity pool.

Agar aplikasi dapat memperoleh token akses untuk aplikasi Azure AD, Anda dapat menggunakan identitas yang dikelola:

  1. Membuat identitas yang dikelola. Catat ID Objek identitas yang dikelola. Anda akan memerlukannya saat mengonfigurasi peniruan identitas.

  2. Tetapkan identitas yang dikelola ke virtual machine atau resource lain yang menjalankan aplikasi Anda.

Mengonfigurasi workload identity federation

Anda hanya perlu melakukan langkah ini satu kali per akun AWS atau tenant Azure AD. Lalu, Anda dapat menggunakan workload identity pool dan penyedia workload identity yang sama untuk beberapa workload dan di beberapa project Google Cloud.

Untuk mulai mengonfigurasi workload identity federation, lakukan langkah berikut:

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Sebaiknya, gunakan project khusus untuk mengelola workload identity pool dan penyedia workload identity.
  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.

    Enable the APIs

Menentukan pemetaan dan kondisi atribut

Kredensial khusus lingkungan dari workload AWS atau Azure Anda mencakup beberapa atribut. Anda harus menentukan atribut yang ingin digunakan sebagai ID subjek (google.subject) di Google Cloud.

Google Cloud menggunakan ID subjek di Cloud Audit Logs dan di ID akun utama untuk mengidentifikasi pengguna atau peran AWS atau Azure dengan unik.

Anda juga dapat memetakan atribut tambahan. Lalu, Anda dapat merujuk ke atribut tambahan ini saat memberikan akses ke resource.

AWS

Pemetaan atribut dapat menggunakan kolom respons untuk GetCallerIdentity sebagai atribut sumber. Kolom ini meliputi:

  • account: nomor akun AWS.
  • arn: AWS ARN entity eksternal.
  • userid: ID unik entity panggilan.

Jika aplikasi berjalan pada instance Amazon Elastic Compute Cloud (EC2) dengan peran yang dilampirkan, Anda dapat menggunakan pemetaan atribut berikut:

google.subject=assertion.arn
attribute.account=assertion.account
attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')
attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')

Pemetaan tersebut akan melakukan hal berikut:

  • Menggunakan ARN sebagai ID subjek (Contoh: "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000)
  • Memasukkan atribut khusus account dan menetapkannya ke ID akun AWS
  • Memasukkan atribut khusus aws_role dan menetapkannya ke nama peran AWS (Contoh: ec2-my-role)
  • Memasukkan atribut khusus aws_ec2_instance dan menetapkannya ke ID instance EC2 (Contoh: i-00000000000000000)

Dengan pemetaan ini, Anda dapat memberikan akses ke:

  • Instance EC2 tertentu:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
    

  • Semua pengguna dan instance dalam suatu peran:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
    

Azure

Pemetaan atribut dapat menggunakan klaim yang tersemat di token akses Azure, termasuk klaim kustom, sebagai atribut sumber. Dalam sebagian besar kasus, sebaiknya gunakan klaim sub sebagai ID subjek:

google.subject=assertion.sub

Untuk token akses yang dikeluarkan bagi identitas yang dikelola, klaim sub mencakup ID Objek dari identitas yang dikelola. Jika Anda menggunakan klaim yang berbeda, pastikan klaim tersebut unik dan tidak dapat ditetapkan ulang.

Jika tidak yakin dengan daftar klaim yang dapat Anda rujuk, lakukan langkah berikut:

  1. Hubungkan ke Azure VM yang memiliki identitas terkelola yang ditetapkan.

  2. Dapatkan token akses dari Layanan Metadata Instance Azure (IMDS):

    Bash

    curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token
    

    Perintah ini menggunakan alat jq. jq tersedia secara default di Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Ganti APP_ID_URI dengan URI ID Aplikasi dari aplikasi yang sudah Anda konfigurasi untuk workload identity federation.

  3. Di browser web, buka https://jwt.ms/, lalu tempel token akses ke dalam kotak teks.

  4. Klik Klaim untuk melihat daftar klaim yang tersemat di token akses.

Untuk identitas layanan, biasanya Anda tidak perlu membuat pemetaan untuk google.groups atau atribut khusus.

Anda juga dapat menentukan kondisi atribut. Kondisi atribut adalah ekspresi CEL yang dapat memeriksa atribut pernyataan dan atribut target. Jika kondisi atribut bernilai true untuk kredensial tertentu, kredensial tersebut akan diterima. Jika tidak, kredensial akan ditolak.

AWS

Anda dapat menggunakan kondisi atribut untuk membatasi pengguna dan peran IAM yang dapat menggunakan workload identity federation untuk memperoleh token Google Cloud jangka pendek.

Misalnya, kondisi berikut membatasi akses ke peran AWS dan tidak mengizinkan ID IAM lainnya:

assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')

Azure

Anda dapat menggunakan kondisi atribut untuk membatasi pengguna dan akun utama layanan yang dapat menggunakan workload identity federation untuk memperoleh token Google Cloud jangka pendek. Anda juga dapat mengonfigurasi aplikasi Azure AD untuk menggunakan penetapan peran aplikasi.

Membuat workload identity pool dan penyedia workload identity

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk mengonfigurasi workload identity federation, minta administrator Anda untuk memberikan peran IAM berikut pada project:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Atau, peran dasar Pemilik IAM (roles/owner) juga mencakup izin untuk mengonfigurasi penggabungan identitas. Anda tidak boleh memberikan peran dasar dalam lingkungan produksi, tetapi Anda dapat memberikannya dalam lingkungan pengembangan atau pengujian.

Kini, Anda sudah mengumpulkan semua informasi yang diperlukan untuk membuat workload identity pool dan penyedia workload identity:

Konsol

  1. Di konsol Google Cloud, buka halaman Penyedia workload dan workload pool baru .

    Buka Penyedia workload dan workload pool baru

  2. Di bagian Buat identity pool, masukkan:

    • Nama: Nama untuk pool. Nama ini juga digunakan sebagai ID pool. Anda tidak dapat mengubah ID pool nanti.
    • Deskripsi: Teks yang menjelaskan tujuan pool.
  3. Klik Lanjutkan.

  4. Konfigurasikan setelan penyedia:

    AWS

    Konfigurasikan setelan penyedia berikut:

    • Pilih penyedia: AWS.
    • Nama penyedia: nama untuk penyedia. Nama ini juga digunakan sebagai ID penyedia. Anda tidak dapat mengubah ID penyedia nantinya.

    Azure

    Konfigurasikan setelan penyedia berikut:

    • Pilih penyedia: OpenID Connect (OIDC).
    • Nama penyedia: Nama untuk penyedia. Nama ini juga digunakan sebagai ID penyedia. Anda tidak dapat mengubah ID penyedia nantinya.
    • URL Penerbit: https://sts.windows.net/TENANT_ID. Ganti TENANT_ID dengan ID tenant (GUID) dari tenant Azure AD Anda.
    • Audiens yang diizinkan: URI ID Aplikasi yang Anda gunakan saat mendaftarkan aplikasi di Azure AD.
  5. Klik Lanjutkan.

  6. Di bagian Mengonfigurasi atribut penyedia, tambahkan pemetaan atribut yang sudah Anda identifikasi sebelumnya.

  7. Di bagian Kondisi atribut, masukkan kondisi atribut yang sudah Anda identifikasi sebelumnya. Jika Anda tidak memiliki kondisi atribut, biarkan kolom ini kosong.

  8. Klik Simpan untuk membuat workload identity pool dan penyedia workload identity.

gcloud

  1. Buat workload identity pool yang baru:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Ganti kode berikut:

    • POOL_ID: ID unik untuk pool.
    • DISPLAY_NAME: nama pool.
    • DESCRIPTION: deskripsi pool. Deskripsi ini muncul saat memberikan akses ke identitas pool.
  2. Tambahkan penyedia workload identity pool:

    AWS

    Untuk membuat penyedia workload identity pool untuk AWS, jalankan perintah berikut:

    gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
      --location="global"  \
      --workload-identity-pool="POOL_ID" \
      --account-id="ACCOUNT_ID" \
      --attribute-mapping="MAPPINGS" \
      --attribute-condition="CONDITIONS"
    

    Ganti kode berikut:

    Contoh:

    gcloud iam workload-identity-pools providers create-aws example-provider \
      --location="global"  \
      --workload-identity-pool="pool-1" \
      --account-id="123456789000" \
      --attribute-mapping="google.subject=assertion.arn"
    

    Azure

    Untuk membuat penyedia workload identity pool untuk Azure, jalankan perintah berikut:

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER_URI" \
        --allowed-audiences="APPLICATION_ID_URI" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Ganti kode berikut:

    • PROVIDER_ID: ID unik untuk penyedia.
    • POOL_ID: ID pool.
    • ISSUER_URI: ID tenant (GUID) dari tenant Azure AD Anda, terkadang diformat sebagai https://sts.windows.net/TENANT_ID. URI penerbit dapat bervariasi. Untuk menemukan URI penerbit, Anda dapat men-debug JWT menggunakan JWT.io.
    • APPLICATION_ID_URI: URI ID Aplikasi yang digunakan saat Anda mendaftarkan aplikasi di Azure AD.
    • MAPPINGS: Daftar yang dipisahkan koma dari pemetaan atribut yang Anda identifikasi sebelumnya.
    • CONDITIONS: (Opsional) kondisi atribut yang Anda identifikasi sebelumnya.

    Contoh:

    gcloud iam workload-identity-pools providers create-oidc example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \
        --allowed-audiences="api://my-app" \
        --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
    

Mengautentikasi workload

Anda harus melakukan langkah berikut satu kali per workload.

Membuat akun layanan untuk workload eksternal

  1. Enable the IAM, Security Token Service, and Service Account Credentials APIs.

    Enable the APIs

  2. Buat akun layanan yang merepresentasikan workload. Sebaiknya, gunakan akun layanan khusus untuk setiap workload.

    Akun layanan tidak perlu berada dalam project yang sama dengan workload identity pool.

  3. Berikan akses akun layanan untuk resource yang ingin diakses oleh identitas eksternal.

Mengizinkan workload eksternal untuk meniru identitas akun layanan

Agar identitas eksternal dapat meniru identitas akun layanan, berikan peran Pengguna Workload Identity ke identitas eksternal (roles/iam.workloadIdentityUser) pada akun layanan tersebut. Anda dapat memberikan peran ke identitas eksternal tertentu, atau ke beberapa identitas eksternal:

  • Untuk identitas eksternal tertentu, tulis kondisi atribut yang memeriksa atribut google.subject.
  • Untuk grup identitas eksternal, tulis kondisi atribut yang memeriksa atribut google.groups atau atribut khusus attribute.NAME.

Konsol

Agar identitas eksternal dapat meniru identitas akun layanan menggunakan Konsol Google Cloud, lakukan hal berikut:

  1. Di Konsol Google Cloud, buka halaman Workload Identity Pool.

    Buka Workload Identity Pool

  2. Temukan workload identity pool yang ingin Anda perbarui lalu pilih pool tersebut.

  3. Untuk memberikan akses ke workload identity pool yang dipilih, klik Berikan akses.

  4. Dalam daftar Akun layanan, pilih akun layanan untuk ditiru oleh identitas eksternal.

  5. Untuk memilih identitas dalam pool yang dapat meniru identitas akun layanan, lakukan salah satu tindakan berikut:

    • Untuk mengizinkan hanya identitas tertentu dari workload identity pool untuk meniru identitas akun layanan, pilih Hanya identitas yang cocok dengan filter.

      Di daftar Nama atribut, pilih atribut yang ingin Anda filter.

      Di kolom Nilai atribut, masukkan nilai atribut yang diharapkan; contohnya, jika Anda menggunakan pemetaan atribut google.subject=assertion.sub, tetapkan namaAtribut menjadi subject dan Nilai atribut menjadi nilai klaim sub dalam token yang dikeluarkan oleh penyedia identitas eksternal Anda.

  6. Untuk menyimpan konfigurasi, klik Simpan, lalu Tutup.

gcloud

Agar identitas eksternal dapat meniru identitas akun layanan menggunakan gcloud CLI, lakukan hal berikut:

  1. Untuk memperoleh nomor project Anda saat ini, jalankan perintah berikut:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Untuk memberikan peran Pemilik Workload Identity (roles/iam.workloadIdentityUser) ke identitas eksternal yang memenuhi kriteria tertentu:

    Menurut subjek

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
    

    Menurut grup

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
    

    Menurut atribut

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
    

    Ganti kode berikut:

    • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan
    • PROJECT_NUMBER: nomor project dari project yang berisi workload identity pool
    • POOL_ID: ID pool dari workload identity pool
    • SUBJECT: nilai yang diharapkan untuk atribut yang Anda petakan ke google.subject
    • GROUP: nilai yang diharapkan untuk atribut yang Anda petakan ke google.groups
    • ATTRIBUTE_NAME: nama atribut khusus dalam pemetaan atribut Anda

Membuat konfigurasi kredensial

Library Klien Cloud, gcloud CLI, dan Terraform dapat otomatis memperoleh kredensial eksternal, serta menggunakannya untuk meniru identitas akun layanan. Agar library dan alat dapat menyelesaikan proses ini, Anda harus menyediakan file konfigurasi kredensial. File ini menentukan:

  • Tempat Anda dapat memperoleh kredensial eksternal
  • Workload identity pool dan penyedia workload identity yang akan digunakan
  • Akun layanan yang akan ditiru identitasnya

Untuk membuat file konfigurasi kredensial, lakukan langkah berikut:

Konsol

Download file konfigurasi kredensial di konsol Google Cloud:

  1. Di konsol Google Cloud, buka halaman Workload Identity Pool.

    Buka Workload Identity Pool

  2. Temukan workload identity pool berisi IdP yang ingin Anda gunakan, lalu klik pool tersebut.

  3. Pilih Akun layanan yang terhubung.

  4. Temukan akun layanan yang ingin Anda gunakan, lalu klik Download.

  5. Dalam dialog Mengonfigurasi aplikasi Anda, pilih penyedia berisi identitas eksternal yang akan meniru identitas akun layanan.

  6. Berikan setelan tambahan berikut:

    AWS

    Tidak perlu setelan tambahan.

    Azure

    URL ID Aplikasi: URI ID Aplikasi dari aplikasi Azure

  7. Pilih Download konfigurasi untuk mendownload file konfigurasi kredensial, lalu klik Tutup.

gcloud

Untuk membuat file konfigurasi kredensial menggunakan gcloud iam workload-identity-pools create-cred-config, lakukan:

AWS

Untuk membuat file konfigurasi kredensial yang memungkinkan library memperoleh token akses dari metadata instance EC2, lakukan langkah berikut:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --aws \
    --output-file=FILEPATH.json

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project dari project yang berisi workload identity pool
  • POOL_ID: ID workload identity pool
  • PROVIDER_ID: ID penyedia workload identity pool
  • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: masa aktif token akses akun layanan, dalam hitungan detik. Jika masa aktif tidak diberikan, default-nya adalah satu jam. Untuk menentukan masa aktif agar lebih lama dari satu jam, Anda harus mengonfigurasi batasan kebijakan organisasi constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: file untuk menyimpan konfigurasi

Jika Anda menggunakan AWS IMDSv2, flag tambahan --enable-imdsv2 harus ditambahkan ke perintah gcloud iam workload-identity-pools create-cred-config:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --aws \
    --enable-imdsv2 \
    --output-file=FILEPATH.json

Jika tidak dapat menggunakan server metadata AWS, Anda dapat memberikan kredensial keamanan AWS melalui variabel lingkungan AWS berikut:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION atau AWS_DEFAULT_REGION
  • Opsional: AWS_SESSION_TOKEN

Library dan gcloud CLI menggunakan variabel lingkungan AWS ini saat server metadata AWS tidak tersedia.

Azure

Buat file konfigurasi kredensial yang memungkinkan library memperoleh token akses dari Layanan Metadata Instance Azure (IMDS):

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --azure \
    --app-id-uri APPLICATION_ID_URI \
    --output-file=FILEPATH.json

Ganti kode berikut:

  • PROJECT_NUMBER: Nomor project dari project yang berisi workload identity pool
  • POOL_ID: ID workload identity pool
  • PROVIDER_ID: ID penyedia workload identity pool
  • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan
  • APPLICATION_ID_URI: URI ID Aplikasi dari aplikasi Azure
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: masa aktif token akses akun layanan, dalam hitungan detik. Jika masa aktif tidak diberikan, default-nya adalah satu jam. Untuk menentukan masa aktif agar lebih lama dari satu jam, Anda harus mengonfigurasi batasan kebijakan organisasi constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: file untuk menyimpan konfigurasi

Menggunakan konfigurasi kredensial untuk mengakses Google Cloud

Agar alat dan library klien dapat menggunakan konfigurasi kredensial, lakukan langkah berikut di lingkungan AWS atau Azure Anda:

  1. Lakukan inisialisasi variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS dan arahkan ke file konfigurasi kredensial:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    dengan FILEPATH sebagai jalur file relatif ke file konfigurasi kredensial.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    dengan FILEPATH sebagai jalur file relatif ke file konfigurasi kredensial.
  2. Gunakan library klien atau alat yang mendukung workload identity federation dan dapat menemukan kredensial secara otomatis:

    C++

    Library Klien Google Cloud untuk C++ mendukung penggabungan workload identity sejak versi v2.6.0. Untuk menggunakan workload identity federation, Anda harus membangun library klien dengan gRPC versi 1.36.0 atau yang lebih baru.

    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 workload identity federation 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.

    gcloud

    Untuk melakukan autentikasi menggunakan workload identity federation, gunakan perintah gcloud auth login:

    gcloud auth login --cred-file=FILEPATH.json
    

    Ganti FILEPATH dengan jalur file ke file konfigurasi kredensial.

    Dukungan untuk workload identity federation di gcloud CLI tersedia di gcloud CLI versi 363.0.0 dan versi lebih baru.

    Terraform

    Penyedia Google Cloud mendukung workload identity federation jika Anda menggunakan versi 3.61.0 atau versi lebih baru:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Untuk melakukan autentikasi menggunakan workload identity federation, gunakan salah satu metode berikut:

    Saat Anda menggunakan gsutil bersamaan dengan gcloud, login seperti biasa:

    gcloud auth login --cred-file=FILEPATH.json
    

    Saat Anda menggunakan gsutil sebagai aplikasi command line mandiri, edit file .boto untuk menyertakan bagian berikut:

    [Credentials]
    gs_external_account_file = FILEPATH
    

    Dalam kedua kasus tersebut, ganti FILEPATH dengan jalur file ke file konfigurasi kredensial.

    Dukungan untuk workload identity federation di gsutil tersedia di gcloud CLI versi 379.0.0 dan versi lebih baru.

    bq

    Untuk melakukan autentikasi menggunakan workload identity federation, gunakan perintah gcloud auth login, sebagai berikut:

    gcloud auth login --cred-file=FILEPATH.json
    

    Ganti FILEPATH dengan jalur file ke file konfigurasi kredensial.

    Dukungan untuk workload identity federation di bq tersedia di gcloud CLI versi 390.0.0 dan versi lebih baru.

    Jika tidak dapat menggunakan library klien yang mendukung workload identity federation, Anda dapat melakukan autentikasi secara terprogram menggunakan REST API.

Skenario lanjutan

Melakukan autentikasi workload menggunakan REST API

Jika tidak dapat menggunakan library klien, Anda dapat mengikuti langkah ini untuk mengizinkan workload eksternal memperoleh token akses jangka pendek menggunakan REST API:

  1. Dapatkan kredensial dari IdP eksternal:

    AWS

    Buat dokumen JSON berisi informasi yang biasanya akan Anda sertakan dalam permintaan ke endpoint GetCallerIdentity() AWS, termasuk tanda tangan permintaan yang valid.

    Workload identity federation merujuk ke dokumen JSON ini sebagai token GetCallerIdentity. Token ini memungkinkan workload identity federation memverifikasi identitas tanpa mengungkapkan kunci akses rahasia AWS.

    Token GetCallerIdentity terlihat mirip seperti:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    

    Token tersebut berisi kolom berikut:

    • url: URL endpoint AWS STS untuk GetCallerIdentity(), dengan isi permintaan GetCallerIdentity() standar yang ditambahkan sebagai parameter kueri. Contoh, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Sebaiknya gunakan endpoint STS regional dan desain infrastruktur yang andal untuk workload Anda. Untuk informasi selengkapnya, lihat Endpoint AWS STS Regional.
    • method: Metode permintaan HTTP: POST.
    • headers: Header permintaan HTTP, harus mencakup:
      • Authorization: Tanda tangan permintaan.
      • host: Nama host kolom url, misalnya, sts.amazonaws.com.
      • x-amz-date: Waktu saat Anda akan mengirim permintaan, diformat sebagai string ISO 8601 Basic. Nilai ini biasanya ditetapkan ke waktu saat ini dan digunakan untuk membantu mencegah serangan replay.
      • x-goog-cloud-target-resource: Nama lengkap resource penyedia identitas tanpa awalan https:. Contoh:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: Token sesi. Hanya diperlukan jika Anda menggunakan kredensial keamanan sementara.

    Contoh berikut membuat token GetCallerIdentity yang dienkode URL. Ekstrak token yang dienkode URL untuk digunakan nantinya. Tindakan ini juga akan membuat token yang dapat dibaca manusia hanya untuk referensi Anda:

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}",
            },
        )
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {"url": request.url, "method": request.method, "headers": []}
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main() -> None:
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    Lakukan inisialisasi variabel berikut:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    Dengan TOKEN sebagai token GetCallerIdentity yang dienkode URL dan dihasilkan oleh skrip di atas.

    Azure

    Hubungkan Azure VM yang memiliki identitas terkelola yang ditetapkan dan dapatkan token akses dari Layanan Metadata Instance Azure (IMDS):

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Perintah ini menggunakan alat jq. jq tersedia secara default di Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Dengan APP_ID_URI sebagai URI ID Aplikasi dari aplikasi yang sudah Anda konfigurasi untuk workload identity federation.

  2. Gunakan API Layanan Token Keamanan untuk menukar kredensial dengan token akses jangka pendek:

    Bash

    STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \
        --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \
        --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
        --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
        --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
        --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \
        --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token)
    echo $STS_TOKEN
    

    PowerShell

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "audience"           = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
            "grantType"          = "urn:ietf:params:oauth:grant-type:token-exchange"
            "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token"
            "scope"              = "https://www.googleapis.com/auth/cloud-platform"
            "subjectTokenType"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Ganti nilai berikut:

    • PROJECT_NUMBER: Nomor project dari project yang berisi workload identity pool
    • POOL_ID: ID workload identity pool
    • PROVIDER_ID: ID penyedia workload identity pool
  3. Gunakan token dari Layanan Token Keamanan untuk memanggil metode generateAccessToken dari IAM Service Account Credentials API untuk memperoleh token akses:

Bash

ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
    -H "Content-Type: text/json; charset=utf-8" \
    -H "Authorization: Bearer $STS_TOKEN" \
    -d @- <<EOF | jq -r .accessToken
    {
        "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
    }
EOF
)
echo $ACCESS_TOKEN

PowerShell

$AccessToken = (Invoke-RestMethod `
    -Method POST `
    -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
    -Headers @{ "Authorization" = "Bearer $StsToken" } `
    -ContentType "application/json" `
    -Body (@{
        "scope" = , "https://www.googleapis.com/auth/cloud-platform"
    } | ConvertTo-Json)).accessToken
Write-Host $AccessToken

Ganti SERVICE_ACCOUNT_EMAIL dengan alamat email akun layanan.

Langkah selanjutnya