Mengonfigurasi workload identity federation dengan pipeline deployment

Panduan ini menjelaskan cara menggunakan workload identity federation agar pipeline deployment dapat melakukan autentikasi ke Google Cloud.

Tergantung pada sistem CI/CD yang Anda gunakan, pipeline deployment Anda mungkin memiliki akses ke kredensial khusus lingkungan sekitar. Contoh:

  • Pipeline Azure DevOps dapat menggunakan koneksi layanan federation identitas workload Microsoft Entra untuk mendapatkan token ID yang secara unik mengidentifikasi project Azure DevOps.
  • Alur kerja GitHub Actions dapat memperoleh token OIDC GitHub yang mengidentifikasi alur kerja dan repositorinya secara unik.
  • GitLab SaaS memungkinkan tugas CI/CD mengakses token ID yang secara unik mengidentifikasi tugas beserta project, lingkungan, dan repositorinya.
  • Terraform Cloud dapat menyediakan token OIDC untuk konfigurasi Terraform Anda yang secara unik mengidentifikasi ruang kerja dan lingkungannya.

Anda dapat mengonfigurasi pipeline deployment Anda agar dapat menggunakan kredensial ini untuk melakukan autentikasi ke Google Cloud menggunakan workload identity federation. Pendekatan ini menghilangkan beban pemeliharaan dan keamanan yang terkait dengan kunci akun layanan.

Sebelum memulai

Menyiapkan autentikasi

Select the tab for how you plan to use the samples on this page:

Console

When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

gcloud

Di konsol Google Cloud, aktifkan Cloud Shell.

Aktifkan Cloud Shell

Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Python

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

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    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.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk mengonfigurasi penggabungan identitas workload, minta administrator untuk memberi Anda peran IAM Workload Identity Pool Admin (roles/iam.workloadIdentityPoolAdmin) pada project. Untuk mengetahui informasi selengkapnya tentang cara memberikan 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.

Menyiapkan IdP eksternal Anda

Azure DevOps

Agar pipeline DevOps Azure mengautentikasi ke Google Cloud, pertama-tama Anda harus mengonfigurasi koneksi layanan untuk Azure Resource Manager. Koneksi ini memungkinkan pipeline memperoleh token ID, yang kemudian dapat ditukar dengan kredensial Google Cloud.

Untuk membuat koneksi layanan untuk Azure Resource Manager, lakukan hal berikut:

  1. Di Azure DevOps, buka project Anda lalu buka Project Settings.
  2. Buka Pipeline > Koneksi layanan.
  3. Klik Create service connection.
  4. Pilih Azure Resource Manager.
  5. Klik Next.
  6. Pilih Workload Identity federation (otomatis)
  7. Klik Next.
  8. Konfigurasikan setelan berikut:

    • Tingkat cakupan: Pilih langganan.

      Anda harus memilih langganan meskipun tidak berencana menggunakan koneksi layanan untuk mengakses resource Azure.

    • Service connection name: Masukkan nama, misalnya google-cloud.

  9. Klik Save.

Pada langkah berikutnya, Anda memerlukan penerbit dan ID subjek koneksi layanan. Untuk mencari detail ini, lakukan hal berikut:

  1. Klik koneksi layanan yang baru saja dibuat.
  2. Klik Kelola Utama Layanan.
  3. Buka Sertifikat & rahasia > Kredensial gabungan.
  4. Klik kredensial gabungan.
  5. Di halaman Edit kredensial, temukan ID berikut:

    • Penerbit: mengidentifikasi organisasi Azure DevOps Anda secara unik
    • ID subjek: mengidentifikasi koneksi layanan secara unik

Azure DevOps secara otomatis memberikan akses pada langganan yang Anda pilih sebagai cakupan ke akun utama layanan yang terkait dengan koneksi layanan baru Anda. Karena Anda tidak berencana menggunakan koneksi layanan untuk mengakses resource Azure, Anda dapat mencabut akses ini dengan melakukan langkah berikut:

  1. Di portal Azure, buka langganan yang Anda pilih sebagai cakupan.
  2. Buka Kontrol akses (IAM) > Penetapan peran.
  3. Temukan penetapan peran untuk koneksi layanan, lalu hapus.

GitHub Actions

Anda tidak perlu membuat perubahan konfigurasi apa pun di akun GitHub Anda.

Setelah Anda configure workload identity pool agar dapat memercayai repositori GitHub Anda, Anda dapat mengizinkan alur kerja dalam repositori tersebut untuk menggunakan token OIDC GitHub-nya untuk mendapatkan kredensial Google Cloud dengan masa berlaku singkat.

GitLab SaaS

Anda tidak perlu membuat perubahan konfigurasi apa pun di akun GitLab Anda.

Setelah Anda configure workload identity pool agar memercayai grup GitLab Anda, Anda dapat mengaktifkan workload identity federation untuk setiap tugas CI/CD.

Terraform Cloud

Anda tidak perlu membuat perubahan konfigurasi apa pun di akun Terraform Cloud.

Setelah Anda configure workload identity pool agar memercayai Terraform Cloud, Anda dapat mengaktifkan workload identity federation untuk setiap ruang kerja.

Mengonfigurasi workload identity federation

Anda harus melakukan langkah ini untuk setiap organisasi GitHub, grup GitLab, atau organisasi Terraform Cloud.

Untuk mulai mengonfigurasi workload identity federation, lakukan hal 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. Make sure that billing is enabled for your Google Cloud project.

  4. Aktifkan API IAM, Resource Manager, Service Account Credentials, and Security Token Service.

    Mengaktifkan API

Menentukan pemetaan atribut

Kredensial khusus lingkungan dari pipeline deployment Anda dapat berisi beberapa atribut, dan Anda harus menentukan atribut mana yang ingin Anda gunakan sebagai ID subjek (google.subject) di Google Cloud.

Secara opsional, Anda dapat memetakan atribut tambahan. Selanjutnya, Anda dapat merujuk ke atribut tambahan ini saat Anda memberikan akses ke resource.

Azure DevOps

Token ID DevOps Azure menyertakan klaim sub yang berisi ID subjek koneksi layanan Anda. ID subjek menggunakan format berikut:

sc://ORGANIZATION/PROJECT/CONNECTION

Gunakan pemetaan atribut berikut untuk memetakan ID ini ke google.subject:

google.subject=assertion.sub

GitHub Actions

Pemetaan atribut Anda dapat menggunakan salah satu klaim di token OIDC GitHub Actions. Kunci klaim token ini dan nilainya dikontrol oleh GitHub. Setidaknya, Anda harus memetakan google.subject ke assertion.sub, yang sesuai dengan subjek token OIDC GitHub Actions:

google.subject=assertion.sub

Nilai untuk subjek token OIDC GitHub Actions dapat bervariasi tergantung pada peristiwa sumber. Atribut klaim lainnya dapat mencakup:

  • repository: Berisi nama pemilik dan repositori–contohnya "google/guava".

  • repository_id: Berisi ID repositori unik–contohnya "20300177".

  • repository_owner: Berisi pemilik, yang dapat berupa nama pengguna atau nama organisasi GitHub–contohnya "google".

  • repository_owner_id: Berisi ID pemilik unik–contohnya "1342004".

Daftar di atas adalah subset dari klaim yang memungkinkan–lihat dokumentasi GitHub tentang contoh klaim untuk mengetahui daftar lengkapnya. Pastikan untuk memetakan klaim apa pun yang akan Anda gunakan sebagai kondisi atribut atau sebagai bagian dari kondisi principalSet mendatang.

GitLab SaaS

Pemetaan atribut Anda dapat menggunakan klaim yang disematkan dalam token ID GitLab sebagai atribut sumber, termasuk berikut ini:

  • sub: nama project dan referensi Git—contohnya, project_path:groupname/projectname:ref_type:branch:ref:main.
  • namespace_id: ID grup unik.
  • project_id: ID project unik.
  • user_id: ID pengguna unik.
  • environment: lingkungan tempat tugas diterapkan.
  • ref_path: referensi Git—contohnya refs/heads/main.

Pemetaan atribut berikut menetapkan google.subject ke klaim sub dari token ID GitLab. Karena klaim sub berisi nama project dan referensi Git, pemetaan ini memungkinkan Anda mengontrol akses berdasarkan repositori dan cabang:

google.subject=assertion.sub

Mengontrol akses berdasarkan repositori dan cabang dapat berguna jika cabang tertentu (contohnya, main) memerlukan akses yang berbeda ke resource dibandingkan cabang lainnya (contohnya, cabang fitur).

Dalam beberapa kasus, Anda mungkin cukup membedakan akses berdasarkan project atau grup. Oleh karena itu, pemetaan berikut mencakup dua atribut tambahan yang berisi project_id dan namespace_id GitLab:

google.subject=assertion.sub
attribute.project_id=assertion.project_id
attribute.namespace_id=assertion.namespace_id

Terraform Cloud

Pemetaan atribut Anda dapat menggunakan klaim yang disematkan dalam token OIDC Terraform Cloud, termasuk klaim berikut

  • terraform_organization_id: Berisi ID unik organisasi—contohnya org-xxxxxxxxxxxxxxxx.
  • terraform_workspace_id: Berisi ID unik ruang kerja—contohnya ws-xxxxxxxxxxxxxxxx.
  • terraform_workspace_name: Berisi nama tampilan ruang kerja.
  • sub: Berisi nama tampilan organisasi, ruang kerja, dan fase—contohnya organization:example-org:workspace:example-workspace:run_phase:apply.

Pemetaan atribut berikut menetapkan google.subject ke klaim terraform_workspace_id dari token OIDC Terraform Cloud:

google.subject=assertion.terraform_workspace_id

Dengan pemetaan ini, Anda dapat mengontrol akses ke resource Google Cloud berdasarkan ruang kerja.

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. Anda harus memiliki pemetaan atribut untuk semua kolom kondisi atribut.

Azure DevOps

Atau, gunakan kondisi atribut untuk membatasi akses ke koneksi layanan tertentu. Misalnya, kondisi berikut membatasi akses ke koneksi di project Azure DevOps tertentu:

assertion.sub.startsWith('sc://ORGANIZATION/PROJECT/')

Ganti kode berikut:

  • ORGANIZATION: nama organisasi Azure DevOps Anda.
  • PROJECT: nama project Azure DevOps Anda.

GitHub Actions

Gunakan kondisi atribut berikut untuk membatasi akses ke token yang dikeluarkan oleh organisasi GitHub Anda:

assertion.repository_owner=='ORGANIZATION'

Ganti ORGANIZATION dengan nama organisasi GitHub Anda.

Secara opsional, perluas kondisi atribut untuk membatasi akses ke subset alur kerja atau cabang. Contohnya, kondisi berikut membatasi akses ke alur kerja yang menggunakan main cabang Git:

assertion.repository_owner=='ORGANIZATION' && assertion.ref=='refs/heads/main'

GitLab SaaS

Gunakan kondisi atribut berikut untuk membatasi akses ke token yang dikeluarkan oleh grup GitLab Anda

assertion.namespace_id=='GROUP_ID'

Ganti GROUP_ID dengan ID grup yang ditampilkan di halaman beranda grup GitLab Anda.

Secara opsional, perluas kondisi atribut untuk membatasi akses ke subset project, cabang, atau lingkungan. Contohnya, kondisi berikut membatasi akses ke tugas yang menggunakan production lingkungan:

assertion.namespace_id=='GROUP_ID' && assertion.environment=='production'

Terraform Cloud

Gunakan kondisi atribut berikut untuk membatasi akses ke token yang dikeluarkan oleh organisasi Terraform Cloud Anda:

assertion.terraform_organization_id=='ORGANIZATION_ID'

Ganti ORGANIZATION_ID dengan ID unik organisasi Anda—contohnya org-xxxxxxxxxxxxxxxx. Secara opsional, perluas kondisi atribut untuk membatasi akses ke subset alur kerja atau cabang. Contohnya, kondisi atribut berikut membatasi akses ke ruang kerja tertentu:

assertion.terraform_organization_id=='ORGANIZATION_ID' && terraform_workspace_id=='WORKSPACE_ID'

Membuat workload identity pool dan penyedia workload

Anda telah mengumpulkan semua informasi yang Anda perlukan untuk membuat workload identity pool dan penyedia workload:

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 informasi berikut:

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

    Azure DevOps

    • Pilih penyedia: OpenID Connect (OIDC).
    • Provider name: nama project Azure DevOps, atau nama kustom.
    • Provider ID: nama project Azure DevOps, atau ID kustom. Anda tidak dapat mengubah ID penyedia nantinya.
    • Penerbit URL: penerbit koneksi layanan yang telah Anda cari sebelumnya.
    • Audiens: Pilih Audiens yang diizinkan dan tempelkan nilai berikut

      api://AzureADTokenExchange
      

    GitHub Actions

    • Pilih penyedia: OpenID Connect (OIDC).
    • Nama penyedia: Nama untuk penyedia.
    • ID Penyedia: ID untuk penyedia. Anda tidak dapat mengubah ID penyedia nantinya.
    • URL Penerbit: https://token.actions.githubusercontent.com/
    • Audiens: Audiens default

    GitLab SaaS

    • Pilih penyedia: OpenID Connect (OIDC).
    • Nama penyedia: Nama untuk penyedia.
    • ID Penyedia: ID untuk penyedia. Anda tidak dapat mengubah ID penyedia nantinya.
    • URL Penerbit: https://gitlab.com
    • Audiens: Audiens default

    Terraform Cloud

    • Pilih penyedia: OpenID Connect (OIDC).
    • Nama penyedia: Nama untuk penyedia.
    • ID Penyedia: ID untuk penyedia. Anda tidak dapat mengubah ID penyedia nantinya.
    • URL Penerbit: https://app.terraform.io
    • Audiens: Audiens default
  5. Klik Lanjutkan.

  6. Di bagian Konfiguraasikan atribut penyedia, tambahkan pemetaan atribut yang telah Anda identifikasi sebelumnya.

  7. Di bagian Kondisi atribut, masukkan kondisi atribut yang telah Anda identifikasi sebelumnya.

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

gcloud

  1. Buat workload identity pool baru:

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

    Ganti nilai berikut:

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

    Azure DevOps

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

    Ganti nilai berikut:

    GitHub Actions

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://token.actions.githubusercontent.com/" \
        --allowed-audiences="api://AzureADTokenExchange" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Ganti nilai berikut:

    GitLab SaaS

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://gitlab.com" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Ganti nilai berikut:

    Terraform Cloud

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://app.terraform.io" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Ganti nilai berikut:

Memperbarui kondisi atribut di penyedia workload identity

Bagian ini menjelaskan cara memperbarui kondisi atribut di penyedia kumpulan identitas workload yang ada untuk membatasi akses ke token yang diterbitkan oleh organisasi GitHub, grup GitLab, atau organisasi Cloud Terraform Anda.

Guna menemukan kondisi atribut yang direkomendasikan untuk pipeline Anda, lihat Menentukan kondisi atribut.

Konsol

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

    Buka Workload Identity Pool

  2. Temukan kumpulan workload identity yang berisi penyedia, lalu klik ikon Expand node untuk kumpulan tersebut.

  3. Temukan penyedia kumpulan workload identity yang ingin Anda edit, lalu klik Edit.

  4. Di Kondisi atribut, masukkan kondisi atribut yang telah Anda identifikasi sebelumnya.

  5. Untuk memperbarui penyedia dan kumpulan workload identity, klik Save.

gcloud

Untuk memperbarui penyedia kumpulan workload identity, jalankan perintah berikut:

gcloud iam workload-identity-pools providers update-oidc PROVIDER_ID \
    --location="global" \
    --workload-identity-pool="POOL_ID" \
    --attribute-condition="CONDITIONS"

Ganti nilai berikut:

Mengautentikasi pipeline deployment

Anda harus melakukan langkah ini untuk setiap alur kerja GitHub Actions atau ruang kerja Terraform Cloud.

Membuat akun layanan untuk pipeline deployment

  1. Aktifkan API IAM, Security Token Service, and Service Account Credentials.

    Mengaktifkan API

  2. Membuat akun layanan yang mewakili workload. Sebaiknya Anda gunakan akun layanan khusus untuk setiap pipeline deployment.

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

  3. Memberikan akun layanan akses ke resource yang ingin diakses oleh identitas eksternal.

Mengizinkan pipeline deployment untuk meniru identitas akun layanan

Agar identitas eksternal dapat meniru identitas akun layanan, berikan peran Pengguna Workload Identity (roles/iam.workloadIdentityUser) kepada mereka 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

Mengonfigurasi pipeline deployment

Sekarang Anda siap menggunakan workload identity federation di pipeline deployment Anda.

Azure DevOps

Edit file azure-pipelines.yml Anda dan tambahkan kode berikut ke konfigurasi pekerjaan Anda:

variables:
- name: Azure.WorkloadIdentity.Connection
  value: CONNECTION
- name: GoogleCloud.WorkloadIdentity.ProjectNumber
  value: PROJECT_NUMBER
- name: GoogleCloud.WorkloadIdentity.Pool
  value: POOL_ID
- name: GoogleCloud.WorkloadIdentity.Provider
  value: PROVIDER_ID
- name: GoogleCloud.WorkloadIdentity.ServiceAccount
  value: SERVICE_ACCOUNT_EMAIL
- name: GOOGLE_APPLICATION_CREDENTIALS
  value: $(Pipeline.Workspace)/.workload_identity.wlconfig

steps:
  - task: AzureCLI@2
    inputs:
      connectedServiceNameARM: $(Azure.WorkloadIdentity.Connection)
      addSpnToEnvironment: true
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |
        echo $idToken > $(Pipeline.Workspace)/.workload_identity.jwt
        cat << EOF > $GOOGLE_APPLICATION_CREDENTIALS
        {
          "type": "external_account",
          "audience": "//iam.googleapis.com/projects/$(GoogleCloud.WorkloadIdentity.ProjectNumber)/locations/global/workloadIdentityPools/$(GoogleCloud.WorkloadIdentity.Pool)/providers/$(GoogleCloud.WorkloadIdentity.Provider)",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "$(Pipeline.Workspace)/.workload_identity.jwt"
          },
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(GoogleCloud.WorkloadIdentity.ServiceAccount):generateAccessToken"
        }
        EOF

Ganti nilai berikut:

  • CONNECTION: nama koneksi layanan Anda
  • 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

Konfigurasi tersebut akan melakukan hal berikut:

  1. Menggunakan tugas AzureCLI untuk mendapatkan token ID untuk koneksi layanan, dan menyediakannya dalam variabel bernama idToken.
  2. Menyimpan token ID ke file sementara yang bernama .workload_identity.jwt.
  3. Membuat file konfigurasi kredensial yang menginstruksikan library klien untuk membaca token ID dari .workload_identity.jwt dan menggunakannya untuk meniru akun layanan.
  4. Menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS agar mengarah ke file konfigurasi kredensial.

GitHub Actions

Tindakan google-github-actions/auth memungkinkan Anda secara otomatis membuat file konfigurasi kredensial selama eksekusi alur kerja. Alat dan library klien seperti terraform dapat kemudian menggunakan file konfigurasi kredensial ini untuk secara otomatis mendapatkan kredensial Google.

Edit file YAML GitHub Actions Anda dan tambahkan hal berikut ini:

  • Izinkan tugas untuk mengambil token ID GitHub dengan menambahkan konfigurasi berikut:

    permissions:
      id-token: write
      contents: read
    
  • Tambahkan langkah untuk membuat file konfigurasi kredensial:

    - id: 'auth'
      name: 'Authenticate to Google Cloud'
      uses: 'google-github-actions/auth@v1'
      with:
        create_credentials_file: true
        workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
        service_account: 'SERVICE_ACCOUNT_EMAIL'
    

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
  • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan

Contoh:

jobs:
  build:
    # Allow the job to fetch a GitHub ID token
    permissions:
      id-token: write
      contents: read

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v1'
        with:
          create_credentials_file: true
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'

Untuk mengetahui detail lebih lanjut tentang penggunaan tindakan google-github-actions/auth, lihat Menyiapkan Workload Identity Federation.

GitLab SaaS

Edit file .gitlab-ci.yml Anda dan tambahkan kode berikut ke konfigurasi tugas:

job:
  variables:
    WORKLOAD_IDENTITY_PROJECT_NUMBER: PROJECT_NUMBER
    WORKLOAD_IDENTITY_POOL: POOL_ID
    WORKLOAD_IDENTITY_PROVIDER: PROVIDER_ID
    SERVICE_ACCOUNT: SERVICE_ACCOUNT_EMAIL
    GOOGLE_APPLICATION_CREDENTIALS: $CI_BUILDS_DIR/.workload_identity.wlconfig

  id_tokens:
    WORKLOAD_IDENTITY_TOKEN:
      aud: https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID

  script:
    - |-
      echo $WORKLOAD_IDENTITY_TOKEN > $CI_BUILDS_DIR/.workload_identity.jwt
      cat << EOF > $GOOGLE_APPLICATION_CREDENTIALS
      {
        "type": "external_account",
        "audience": "//iam.googleapis.com/projects/$WORKLOAD_IDENTITY_PROJECT_NUMBER/locations/global/workloadIdentityPools/$WORKLOAD_IDENTITY_POOL/providers/$WORKLOAD_IDENTITY_PROVIDER",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "credential_source": {
          "file": "$CI_BUILDS_DIR/.workload_identity.jwt"
        },
        "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$SERVICE_ACCOUNT:generateAccessToken"
      }
      EOF

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
  • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan

Konfigurasi tersebut akan melakukan hal berikut:

  1. Instruksikan GitLab untuk mengeluarkan token ID, dan menyediakannya di variabel lingkungan bernama WORKLOAD_IDENTITY_TOKEN. Token ID menggunakan penyedia workload identity pool Anda sebagai audiens.
  2. Simpan token ID ke file sementara yang bernama .workload_identity.jwt.
  3. Buat file konfigurasi kredensial yang menginstruksikan library klien untuk membaca token ID dari .workload_identity.jwt dan gunakan untuk meniru identitas akun layanan.
  4. Tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS agar mengarah ke file konfigurasi kredensial.

Terraform Cloud

Konfigurasikan ruang kerja Terraform Cloud Anda agar menggunakan workload identity federation untuk melakukan autentikasi ke Google Cloud:

  1. Di Terraform Cloud, buka ruang kerja Anda, lalu buka Variabel.

  2. Tambahkan variabel berikut:

    Kategori variabel Kunci Nilai
    Variabel lingkungan TFC_GCP_PROVIDER_AUTH true
    Variabel lingkungan TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL Alamat email akun layanan, contohnya terraform@my-project-123.iam.gserviceaccount.com
    Variabel lingkungan TFC_GCP_PROJECT_NUMBER Nomor project dari project yang berisi workload identity pool
    Variabel lingkungan TFC_GCP_WORKLOAD_POOL_ID ID workload identity pool
    Variabel lingkungan TFC_GCP_WORKLOAD_PROVIDER_ID ID penyedia workload identity pool

    Secara opsional, Anda dapat menambahkan variabel lingkungan tambahan untuk mengizinkan Terrform Cloud menggunakan akun layanan yang berbeda untuk fase plan dan apply. Untuk mengetahui informasi selengkapnya, lihat Variabel Lingkungan Opsional.

  3. Dalam daftar variabel, pastikan Kategori ditetapkan menjadi env untuk lima variabel yang Anda tambahkan di langkah sebelumnya.

  4. Pastikan konfigurasi Terraform Anda menggunakan penyedia Google Cloud versi 4.48.0 atau yang terbaru, dan perbarui jika perlu, seperti berikut:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 4.48.0"
        }
      }
    }
    
  5. Kirim perubahan ke repositori kode sumber Anda.

Langkah selanjutnya