Mengintegrasikan Cloud Run dan Workload Identity Federation


Tutorial ini menjelaskan cara menggunakan Workload Identity Federation untuk mengautentikasi beban kerja yang berjalan di luar Google Cloud, sehingga dapat mengakses microservice yang dihosting oleh Cloud Run. Tutorial ini ditujukan bagi administrator yang ingin mengintegrasikan Workload Identity Federation dengan Penyedia Identitas (IdP) yang sudah ada. Workload Identity Federation memungkinkan Anda menghubungkan beban kerja eksternal ke beban kerja yang berjalan di Google Cloud. Cloud Run dapat digunakan untuk menjalankan microservice dalam container stateless.

Tutorial ini memberikan petunjuk cara mengonfigurasi Jenkins sebagai beban kerja eksternal, Keycloak sebagai IdP, Cloud Run, dan Workload Identity Federation. Setelah menyelesaikan tutorial ini, Anda dapat melihat bagaimana Workload Identity Federation memungkinkan Anda mengautentikasi aplikasi Jenkins dengan Google Cloud menggunakan autentikasi OpenID Connect.

Autentikasi beban kerja eksternal menggunakan Workload Identity Federation

Workload Identity Federation memungkinkan Anda melakukan autentikasi beban kerja di luar Google Cloud tanpa menggunakan kunci akun layanan statis. Semua beban kerja eksternal yang perlu menggunakan layanan di Google Cloud dapat memanfaatkan fitur ini.

Dengan Workload Identity Federation, Anda dapat menggunakan IdP untuk melakukan autentikasi langsung dengan Google Cloud. Untuk mengautentikasi, gunakan OpenID Connect. Cloud Run menerima token OpenID Connect dari IdP Anda untuk autentikasi.

Proses autentikasi saat menggunakan Workload Identity Federation adalah sebagai berikut:

  1. Library autentikasi (AUTHN) Anda mengirimkan permintaan token web JSON (JWT) ke IdP.
  2. IdP Anda menandatangani token web JSON (JWT). Library AUTHN membaca data ini dari variabel.
  3. Library mengirimkan perintah POST ke Layanan Token Keamanan yang menyertakan token yang ditandatangani.
  4. Layanan Token Keamanan melihat penyedia kumpulan pengidentifikasi beban kerja yang Anda konfigurasikan untuk membangun kepercayaan dan memverifikasi identitas pada kredensial.
  5. Layanan Token Keamanan mengirimkan kembali token gabungan.
  6. Library mengirimkan token ke IAM.
  7. IAM menukar token tersebut dengan token OpenID Connect dari akun layanan. Untuk informasi lebih lanjut, lihat Membuat token ID OpenID Connect.
  8. Library menyediakan token OpenID Connect ke Jenkins.
  9. Jenkins menggunakan token ini untuk melakukan autentikasi dengan Cloud Run.

Diagram berikut menunjukkan alur autentikasi:

Alur autentikasi.

Tujuan

  • Mengonfigurasi Jenkins sebagai beban kerja eksternal.
  • Konfigurasikan Keycloak sebagai IdP yang kompatibel dengan OpenID Connect.
  • Menghubungkan Jenkins dengan Keycloak.
  • Instal Library Klien Cloud untuk mendapatkan token JWT dari Keycloak ke Google Cloud.
  • Menghubungkan Google Cloud ke Keycloak dan Jenkins.
  • Mendapatkan JWT untuk pengguna terautentikasi dari Keycloak.

Meskipun tutorial ini menggunakan Keycloak, Anda dapat menggunakan penyedia identitas apa pun yang mendukung OpenID Connect, seperti GitLab, Okta, atau OneLogin.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Siapkan microservice di Cloud Run. Untuk informasi selengkapnya, lihat Panduan Memulai: Men-deploy container ke Cloud Run.

Mengonfigurasi Jenkins

Selesaikan tugas ini di lingkungan non-Google Cloud, seperti lingkungan lokal Anda atau di cloud lain.

Jika sudah memiliki penyedia identitas yang mendukung OpenID Connect dan beban kerja eksternal, Anda dapat melewati langkah ini dan membuka Menginstal Library Klien Cloud.

Untuk menyimulasikan beban kerja luar, Anda dapat menggunakan VM dengan Jenkins diinstal di dalamnya. Anda dapat menjalankan Jenkins sebagai image Docker atau menginstalnya langsung ke server. Langkah berikut menunjukkan cara menginstalnya langsung di server.

  1. Di VM pilihan Anda, buka command line.
  2. Menginstal Java:

    $ sudo apt update
    $ sudo apt install openjdk-11-jre
    $ java -version
    
  3. Instal Jenkins:

    curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
    /usr/share/keyrings/jenkins-keyring.asc > /dev/null
    echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null
    sudo apt-get update
    sudo apt-get install jenkins
    
  4. Pastikan Anda dapat mengakses server Jenkins pada port 8080. Jika Anda menggunakan VM yang berada di belakang firewall, pastikan port yang sesuai terbuka.

  5. Dapatkan sandi administrator dan siapkan Jenkins. Untuk mengetahui petunjuknya, lihat Wizard penyiapan pasca-penginstalan.

  6. Selesaikan tindakan berikut untuk menyiapkan SSL:

    1. Jika memiliki penyedia domain, Anda dapat menggunakan certificate authority (CA) mereka untuk meminta sertifikat yang ditandatangani. Atau, Anda bisa mendapatkan sertifikat yang ditandatangani secara gratis yang berlaku selama 90 hari dari zerossl.com.
    2. Download file zip sertifikat Anda, lalu transfer ke server yang menjalankan Jenkins:

      scp -i CERTFILE.pem -r CERTFILE.zip VM_FQDN:/home/USERNAME
      

      Ganti kode berikut:

      • CERTFILE dengan nama file sertifikat yang menyertakan kunci publik Anda.
      • VM_FQDN dengan FQDN server Anda di luar Google Cloud.
      • USERNAME dengan nama pengguna Anda.
    3. Ganti nama file dan hasilkan file .pkcs12 yang dapat digunakan Jenkins:

      openssl rsa -in KEYFILE.com.key -out KEYFILE.com.key

      Ganti KEYFILE dengan nama file sertifikat.

  7. Update file /etc/sysconfig/jenkins:

    1. Buka file di editor teks:

      vi /etc/sysconfig/jenkins
      
    2. Tetapkan JENKINS_PORT ke -1.

    3. Tetapkan JENKINS_HTTPS_PORT ke 8443.

    4. Di bagian bawah file, tambahkan argumen berikut:

      JENKINS_ARGS="--httpsCertificate=/var/lib/jenkins/.ssl/CERTFILE.crt --httpsPrivateKeys=/var/lib/jenkins/.ssl/KEYFILE.pkcs1.key"

      Ganti kode berikut:

      • CERTFILE dengan nama file sertifikat menggunakan format .crt.
      • KEYFILE dengan nama file kunci PKCS.
  8. Mulai ulang server Jenkins Anda.

  9. Pastikan Anda telah membuka port 8443 di firewall dan akses Jenkins di port 8443.

  10. Instal plugin Jenkins yang diperlukan untuk mengintegrasikan Keycloak dengan Jenkins. Anda dapat memilih salah satu opsi berikut:

    Untuk menginstal plugin, lakukan hal berikut:

    1. Di dasbor Jenkins, buka Manage Jenkins > Manage Plugins.
    2. Pilih Tersedia dan telusuri plugin pilihan Anda. Screenshot berikut menampilkan Plugin Manager dengan tab Available dipilih.

      Pengelola plugin Jenkins.

    3. Instal plugin.

Mengonfigurasi Keycloak

Dalam tutorial ini, Keycloak mengelola pengguna, grup, dan peran. Keycloak menggunakan realms untuk mengelola pengguna.

  1. Di VM yang berjalan di luar Google Cloud, instal server Keycloak. Untuk tutorial ini, sebaiknya instal Keycloak dari penampung Docker.

  2. Buka Konsol Admin Keycloak.

  3. Buka Setelan realm.

  4. Di tab General, pastikan kolom ditetapkan sebagai berikut:

    • Diaktifkan: ON
    • Akses yang Dikelola Pengguna: OFF
    • Endpoint: Konfigurasi Endpoint OpenID dan Metadata Penyedia Identitas SAML 2.0

    Screenshot berikut menunjukkan kolom yang harus Anda konfigurasi.

    Setelan umum keycloak.

  5. Buat klien sehingga Anda memiliki entitas yang dapat meminta Keycloak untuk mengautentikasi pengguna. Sering kali, klien adalah aplikasi dan layanan yang menggunakan Keycloak untuk menyediakan solusi single sign-on (SSO).

    1. Di konsol Admin Keycloak, klik Klien > Buat.
    2. Masukkan:

      • ID Klien: jenkins
      • Protokol Klien: openid-connect
      • URL root: http://JENKINS_IP_ADDRESS:8080, dengan JENKINS_IP_ADDRESS adalah alamat IP server Jenkins Anda.

      Screenshot berikut menunjukkan kolom yang harus Anda konfigurasi.

      Keycloak tambahkan klien.

    3. Klik Simpan.

  6. Pada tab Penginstalan, pastikan format token adalah Keycloak OIDC JSON. Buat salinan token ini karena Anda akan membutuhkannya untuk menyelesaikan penyiapan Jenkins.

  7. Untuk membuat grup pengujian, lakukan hal berikut:

    1. Di Konsol Admin Keycloak, klik Grup > Baru.
    2. Masukkan nama untuk grup Anda dan klik Simpan.
    3. Buat satu grup pengujian lagi. Anda dapat menetapkan peran ke grup, tetapi tutorial ini tidak mewajibkannya.
  8. Untuk membuat pengguna uji coba yang akan ditambahkan ke grup, lakukan hal berikut:

    1. Di Konsol Admin Keycloak, klik Mengelola pengguna > Tambahkan pengguna.
    2. Isi informasi pengguna, lalu klik Simpan.

      Screenshot berikut menunjukkan contoh informasi untuk akun pengguna.

      Keycloak untuk menambahkan pengguna.

    3. Klik tab Kredensial dan pastikan Temporary disetel ke Off.

    4. Setel ulang sandi.

      Anda akan menggunakan akun ini nanti di JWT untuk autentikasi.

      Screenshot berikut menampilkan tab Kredensial dengan kolom yang harus Anda konfigurasi.

      Keycloak mengubah sandi.

    5. Klik tab Grup dan pilih salah satu grup yang Anda buat sebelumnya.

    6. Klik Gabung.

    7. Ulangi langkah ini untuk membuat lebih banyak pengguna uji coba.

Mengonfigurasi Jenkins untuk konfigurasi OpenID Connect

Bagian ini menjelaskan cara mengonfigurasi plugin OpenID Connect untuk Jenkins.

  1. Di server Jenkins Anda, buka Mengelola Jenkins > Mengonfigurasi Keamanan Global.
  2. Di bagian Ranah Keamanan, pilih Plugin Autentikasi Keycloak. Klik Simpan.

  3. Klik Konfigurasikan Sistem.

  4. Di bagian setelan Keycloak Global, salin JSON penginstalan Keycloak yang Anda buat di Konfigurasikan Keycloak. Jika Anda perlu mendapatkan data JSON lagi, lakukan langkah-langkah berikut:

    1. Di Konsol Admin Keycloak, buka Klien.

    2. Klik nama klien Anda.

    3. Pada tab Penginstalan, klik Opsi Format dan pilih JSON OIDC Keycloak.

    Berikut adalah contoh JSON Keycloak:

    {
        "realm":"master"
        "auth-server-url":"AUTHSERVERURL"
        "ssl-required":"none"
        "resource":"jenkins"
        "public-client":true
        "confidential-port":0
    }
    

    AUTHSERVERURL adalah URL untuk server autentikasi Anda.

  5. Untuk menyimpan konfigurasi OIDC, klik Simpan.

Jenkins kini dapat mengalihkan ke Keycloak untuk mendapatkan informasi pengguna.

Menginstal Library Klien Cloud

Untuk mengirim JWT dari Keycloak ke Google Cloud, Anda harus menginstal Library Klien Cloud di server Jenkins. Tutorial ini menggunakan Python untuk berinteraksi dengan Google Cloud menggunakan SDK.

  1. Di server Jenkins, instal Python. Langkah-langkah berikut menunjukkan cara menginstal python3:

    sudo apt update
    sudo apt install software-properties-common
    sudo add-apt-repository ppa:deadsnakes/ppa
    sudo apt update
    sudo apt install python3.8
    
  2. Instal pip3 agar Anda dapat mendownload dan mengimpor Library Klien Cloud:

    pip3 –version
    sudo apt update
    sudo apt install python3-pip
    pip3 –version
    
  3. Instal Library Klien Cloud untuk Python menggunakan pip3:

    pip3 install –upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
    

    Contoh:

    pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
    Collecting google-api-python-client
        Downloading google_api_python_client-2.42.0-py2.py3-none-any.whl (8.3 MB)
            USERNAME | 8.3 MB 19.9 MB/s
    Collecting google-auth-httplib2
        Downloading google_auth_httplib2-0.1.0-py2.py3-none-any.whl (9.3 MB)
    Collecting google-auth-oauthlib
    Downloading google_auth_oauthlib-0.5.1-py2.py3-non-any.whl (19 KB)
    

    Ganti USERNAME dengan nama pengguna Anda.

  4. Instal Google Cloud CLI di server Jenkins Anda. Untuk mengetahui petunjuknya, lihat Panduan memulai: Menginstal gcloud CLI.

Mengonfigurasi lingkungan Google Cloud Anda

Bagian ini menjelaskan langkah-langkah yang harus Anda selesaikan untuk memastikan bahwa lingkungan Google Cloud Anda yang menghosting container tanpa server dapat terhubung dengan Jenkins dan Keycloak.

  1. Di Google Cloud, buat akun layanan sehingga microservice di Cloud Run dapat mengakses izin yang disertakan padanya. Misalnya, untuk membuat akun layanan menggunakan gcloud CLI, lakukan langkah berikut:

    gcloud iam service-accounts create cloudrun-oidc \
      –-description="cloud run oidc sa"  \
      –-display-name="cloudrun-oidc"
    

    Secara default, Cloud Run membuat akun layanan default untuk Anda. Namun, menggunakan akun layanan default bukanlah praktik terbaik keamanan karena akun tersebut memiliki serangkaian izin yang luas. Oleh karena itu, sebaiknya buat akun layanan terpisah untuk microservice Anda. Untuk petunjuk tentang cara membuat akun layanan untuk Cloud Run, lihat Membuat dan mengelola akun layanan.

  2. Buat workload identity pool. Untuk membuat kumpulan menggunakan gcloud CLI, jalankan perintah berikut:

    gcloud iam workload-identity-pools create cloudrun-oidc-pool \
      --location="global" \
      —-description="cloudrun-oidc" \
      —-display-name="cloudrun-oidc"
    
  3. Buat penyedia workload identity pool untuk OpenID Connect:

    gcloud iam workload-identity-pools providers create-oidc cloud-run-provider \
      --workload-identity-pool="cloudrun-oidc-pool" \
      --issuer-uri="VAR_LINK_TO_ENDPOINT" \
      --location="global" \
      --attribute-mapping ="google.subject=assertion.sub,attribute.isadmin-assertion.isadmin,attribute.aud=assertion.aud" \
      --attribute-condition="attribute.isadmin=='true'"
    

    Ganti VAR_LINK_TO_ENDPOINT dengan variabel yang berisi link ke endpoint OIDC Keycloak. Untuk menemukan link ini, di Konsol Admin KeyCloud, di jendela Ranah, klik tab Umum. Endpoint harus berupa HTTPS, yang berarti Anda harus mengonfigurasi server Keycloak dengan HTTPS.

Mendapatkan JWT untuk pengguna terautentikasi dari Keycloak

  1. Di VM yang menjalankan Keycloak, download token ke file teks. Misalnya, di Linux, jalankan perintah berikut:

    curl -L -X POST 'https://IP_FOR_KEYCLOAK:8080/auth/realms/master/protocol/openid-connect/token' -H 'Content-Type: application/x-www-form-urlencoded' \
      --data-urlencode 'client_id=jenks' \
      --data-urlencode 'grant_type=password' \
      --data-urlencode 'client_secret=CLIENT_SECRET \
      --data-urlencode 'scope=openid' \
      --data-urlencode 'username=USERNAME' \
      --data-urlencode 'password=PASSWORD' | grep access_token | cut -c18-1490 > token.txt
    

    Ganti kode berikut:

    • IP_FOR_KEYCLOAK dengan alamat IP server Keycloak.
    • CLIENT_SECRET dengan rahasia klien Keycloak.
    • USERNAME dengan pengguna Keycloak.
    • PASSWORD dengan sandi untuk pengguna Keycloak.

    Perintah ini mencakup client ID, rahasia klien, nama pengguna, dan sandi. Sebagai praktik terbaik keamanan, sebaiknya gunakan variabel lingkungan untuk menyamarkan nilai ini, bukan menggunakan command line. Perintah contoh akan mengalihkan kredensial ke file bernama token.txt.

    Secara opsional, untuk mengotomatiskan langkah ini, Anda dapat membuat skrip bash.

  2. Validasi token di jwt.io.

  3. Di VM, buat file kredensial Anda:

    gcloud iam workload-identity-pools create-cred-config \
    projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/providers/cloud-run/provider \
      --output-file=sts-creds.json \
      --credential-source-file=token.txt
    

    Untuk informasi selengkapnya, lihat gcloud iam workload-identity-pools create-cred-config.

    File output Anda akan terlihat seperti berikut:

    {
        "type": "external_account",
        "audience": "//iam.google.apis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/subject/USER_EMAIL",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "credential_source": {
            "file" "token.txt" }
    }
    

    PROJECT_NUMBER adalah nomor project Anda.

  4. Di VM, tetapkan file sts.creds.json sebagai variabel untuk ADC:

    export GOOGLE_APPLICATION_CREDENTIALS=/Users/USERNAME/sts-creds.json
    

    Ganti USERNAME dengan nama pengguna UNIX Anda.

    Sebelum Workload Identity Federation diluncurkan, nilai ini merupakan kunci akun layanan. Dengan Workload Identity Federation, nilai ini akan menjadi file kredensial yang baru dibuat.

  5. Buat binding peran bagi pengguna untuk meniru identitas akun layanan:

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT \
        --role roles/iam.workloadIdentityUser \
        --member "principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/subject/USER_EMAIL
    

    Ganti kode berikut:

  6. Izinkan akun layanan mengakses layanan Cloud Run:

    gcloud run services add-iam-policy-binding SERVICE_NAME
      --member-"serviceAccount:SERVICE_ACCOUNT" \
      --role="roles/run.invoker"
    

    Ganti kode berikut:

    • SERVICE_NAME dengan nama microservice yang berjalan di Cloud Run.

    • SERVICE_ACCOUNT dengan alamat email akun layanan untuk Cloud Run.

    Untuk informasi lebih lanjut, lihat gcloud run services add-iam-policy-binding.

  7. Menghasilkan token ID:

    #!/usr/bin/python
    from google.auth import credentials
    from google.cloud import  iam_credentials_v1
    
    import google.auth
    import google.oauth2.credentials
    
    from google.auth.transport.requests import AuthorizedSession, Request
    
    url = "https://WORKLOAD_FQDN"
    aud = "https://WORKLOAD_FQDN"
    service_account = 'SERVICE_ACCOUNT'
    
    name = "projects/-/serviceAccounts/{}".format(service_account)
    id_token = client.generate_id_token(name=name,audience=aud, include_email=True)
    
    print(id_token.token)
    
    creds = google.oauth2.credentials.Credentials(id_token.token)
    authed_session = AuthorizedSession(creds)
    r = authed_session.get(url)
    print(r.status_code)
    print(r.text)
    

    Ganti kode berikut:

    • WORKLOAD_FQDN dengan FQDN untuk beban kerja Anda.

    • SERVICE_ACCOUNT dengan alamat email akun layanan untuk Cloud Run.

Token yang Anda gunakan dapat memanggil API Identity and Access Management, yang akan memberi Anda JWT baru yang diperlukan untuk memanggil layanan Cloud Run.

Anda dapat menggunakan token dalam pipeline Jenkins untuk memanggil container serverless yang Anda jalankan di Cloud Run. Namun, langkah-langkah ini berada di luar cakupan tutorial ini.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project Anda.

Menghapus project

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Langkah selanjutnya