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 mengautentikasi 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.
Workload Identity Federation memungkinkan Anda 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:
- Library autentikasi (AUTHN) Anda mengirimkan permintaan token web JSON (JWT) ke IdP.
- IdP Anda menandatangani token web JSON (JWT). Library AUTHN membaca data ini dari variabel.
- Library mengirimkan perintah POST ke Layanan Token Keamanan yang menyertakan token yang ditandatangani.
- Layanan Token Keamanan melihat penyedia kumpulan pengidentifikasi beban kerja yang Anda konfigurasikan untuk membangun kepercayaan dan memverifikasi identitas pada kredensial.
- Layanan Token Keamanan mengirimkan kembali token akses gabungan.
- Library mengirimkan token akses federasi ke IAM.
- IAM menukar token akses federasi dengan token ID. Untuk informasi selengkapnya, lihat Membuat token ID OpenID Connect (OIDC).
- Library menyediakan token ID ke Jenkins.
- Jenkins menggunakan token ini untuk melakukan autentikasi dengan Cloud Run.
Diagram berikut menunjukkan alur autentikasi:
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.
- Di VM pilihan Anda, buka command line.
- Menginstal Java: - $ sudo apt update $ sudo apt install openjdk-11-jre $ java -version
- Instal Jenkins: - curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.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
- Pastikan Anda dapat mengakses server Jenkins pada port 8080. Jika Anda menggunakan VM yang berada di belakang firewall, pastikan port yang sesuai terbuka. 
- Dapatkan sandi administrator dan siapkan Jenkins. Untuk mengetahui petunjuknya, lihat Wizard penyiapan pasca-penginstalan. 
- Selesaikan tindakan berikut untuk menyiapkan SSL: - 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.
- 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: - CERTFILEdengan nama file sertifikat yang menyertakan kunci publik Anda.
- VM_FQDNdengan FQDN server Anda di luar Google Cloud.
- USERNAMEdengan nama pengguna Anda.
 
- Ganti nama file dan hasilkan file .pkcs12 yang dapat digunakan Jenkins: - openssl rsa -in KEYFILE.com.key -out KEYFILE.com.key- Ganti - KEYFILEdengan nama file sertifikat.
 
- Update file - /etc/sysconfig/jenkins:- Buka file di editor teks: - vi /etc/sysconfig/jenkins
- Tetapkan - JENKINS_PORTke- -1.
- Tetapkan - JENKINS_HTTPS_PORTke- 8443.
- 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: - CERTFILEdengan nama file sertifikat menggunakan format .crt.
- KEYFILEdengan nama file kunci PKCS.
 
 
- Mulai ulang server Jenkins Anda. 
- Pastikan Anda telah membuka port 8443 di firewall dan akses Jenkins di port 8443. 
- Instal plugin Jenkins yang diperlukan untuk mengintegrasikan Keycloak dengan Jenkins. Anda dapat memilih salah satu opsi berikut: - Untuk menginstal plugin, lakukan hal berikut: - Di dasbor Jenkins, buka Manage Jenkins > Manage Plugins.
- Pilih Tersedia dan telusuri plugin pilihan Anda. Screenshot berikut menampilkan Plugin Manager dengan tab Available dipilih.  
- Instal plugin. 
 
Mengonfigurasi Keycloak
Dalam tutorial ini, Keycloak mengelola pengguna, grup, dan peran. Keycloak menggunakan realms untuk mengelola pengguna.
- Di VM yang berjalan di luar Google Cloud, instal server Keycloak. Untuk tutorial ini, sebaiknya instal Keycloak dari container Docker. 
- Buka Konsol Admin Keycloak. 
- Buka Setelan realm. 
- 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.  
- 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). - Di konsol Admin Keycloak, klik Klien > Buat.
- 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.  
- Klik Simpan. 
 
- Pada tab Penginstalan, pastikan format token adalah Keycloak OIDC JSON. Buat salinan token ini karena Anda akan membutuhkannya untuk menyelesaikan penyiapan Jenkins. 
- Untuk membuat grup pengujian, lakukan hal berikut: - Di Konsol Admin Keycloak, klik Grup > Baru.
- Masukkan nama untuk grup Anda dan klik Simpan.
- Buat satu grup pengujian lagi. Anda dapat menetapkan peran ke grup, tetapi tutorial ini tidak mewajibkannya.
 
- Untuk membuat pengguna uji coba yang akan ditambahkan ke grup, lakukan hal berikut: - Di Konsol Admin Keycloak, klik Mengelola pengguna > Tambahkan pengguna.
- Isi informasi pengguna, lalu klik Simpan. - Screenshot berikut menunjukkan contoh informasi untuk akun pengguna.  
- Klik tab Kredensial dan pastikan Temporary disetel ke Off. 
- Setel ulang sandi. - Anda akan menggunakan akun ini nanti di JWT untuk autentikasi. - Screenshot berikut menampilkan tab Kredensial dengan kolom yang harus Anda konfigurasi.  
- Klik tab Grup dan pilih salah satu grup yang Anda buat sebelumnya. 
- Klik Gabung. 
- 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.
- Di server Jenkins Anda, buka Mengelola Jenkins > Mengonfigurasi Keamanan Global.
- Di bagian Ranah Keamanan, pilih Plugin Autentikasi Keycloak. Klik Simpan. 
- Klik Konfigurasikan Sistem. 
- 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: - Di Konsol Admin Keycloak, buka Klien. 
- Klik nama klien Anda. 
- 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. 
- 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.
- 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
- Instal pip3 agar Anda dapat mendownload dan mengimpor Library Klien Cloud: - pip3 –version sudo apt update sudo apt install python3-pip pip3 –version
- 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. 
- Instal Google Cloud CLI di server Jenkins Anda. Untuk mengetahui petunjuknya, lihat Panduan memulai: Menginstal gcloud CLI. 
Mengonfigurasi Google Cloud lingkungan Anda
Bagian ini menjelaskan langkah-langkah yang harus Anda selesaikan untuk memastikan bahwa lingkunganGoogle Cloud yang menghosting container serverless Anda dapat terhubung dengan Jenkins dan Keycloak.
- 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. 
- 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"
- 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_ENDPOINTdengan 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
- 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_KEYCLOAKdengan alamat IP server Keycloak.
- CLIENT_SECRETdengan rahasia klien Keycloak.
- USERNAMEdengan pengguna Keycloak.
- PASSWORDdengan 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. 
- Validasi token di jwt.io. 
- 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_NUMBERadalah nomor project Anda.
- Di VM, tetapkan file - sts.creds.jsonsebagai 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. 
- 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: - SERVICE_ACCOUNTdengan alamat email akun layanan yang Anda buat di Konfigurasi lingkungan Google Cloud Anda. Untuk informasi lebih lanjut, lihat gcloud iam service-accounts add-iam-policy-binding.
- USER_EMAILdengan alamat email Anda.
 
- 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_NAMEdengan nama microservice yang berjalan di Cloud Run.
- SERVICE_ACCOUNTdengan alamat email akun layanan untuk Cloud Run.
 - Untuk informasi lebih lanjut, lihat gcloud run services add-iam-policy-binding. 
- 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' client = iam_credentials_v1.IAMCredentialsClient() 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_FQDNdengan FQDN untuk beban kerja Anda.
- SERVICE_ACCOUNTdengan 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.