Pada tutorial kali ini kita akan menggunakan Keycloak sebagai sumber user dan role yang akan mengakses Jenkins. Saat ini versi yang digunakan
Keycloak 19.0.1 Jenkins 2.346.3 # Plugin jenkins oic-auth 1.8 role-strategy 555.v8d194cc85b_30
Dengan menggunakan Keycloak sebagai authentikasi untuk Jenkins, kita memiliki banyak kelebihan, seperti user bisa diambil dari LDAP atau kerberos. User dari Twitter, Github, Gitlab, Google Workspace, Facebook dan lain sebagainya bisa login kedalam Jenkins. Satu skenario yang bisa digunakan bisa perusahaan anda menggunakan Google Workspace adalah, menghubungkan Google Workspace dengan Jenkins, jadi setiap user yang memiliki email@perusahaan bisa langsung login sebagai user Jenkins.
Hampir setiap langkah yang perlu penjelasan detail disertakan screenshot/tangkapan layar untuk memudahkan pemula sekalipun untuk menjalankan tutorial ini. Cara install Keycloak dan Jenkins tidak dibahas disini, karena tidak relevan. Untuk tutorial ini saya menggunakan keycloak di Kubernetes dan Keycloak di VPS :D
Konfigurasi Keycloak 19
Login ke keycloak sebagai admin
1. Buat Realm Baru
1. Buat realm baru, dengan nama platform
2. Buat Client
Buat client dengan jenkins di realms platform, client ini yang akan diakses oleh aplikasi Jenkins. Nama client ini akan digunakan di config Jenkins nantinya, jadi ada baiknya menggunakan nama yang mudah dipahami, agar memudahkan troubleshooting nantinya.
Bagian yang wajib diisi
Client type : OpenID Connect
Client ID : jenkins
Pada capability config, yang wajib diisi
Client authentication : ON Authorization : ON Authentication flow : - Standard flow - Direct access grants
Pada halaman client details, pada tab Settings isikan Valid redirect URIs dengan domain anda, contoh https://jenkins.jaranguda.com/*, atau bisa dengan *, tetapi untuk production sangat tidak disarankan
klik tab Credentials
, lalu copy dan simpan Client secret
. Client secret ini akan digunakan pada waktu konfigurasi jenkins nantinya.
3. Client Scope
Client scope yang akan kita buat disini berisi, role yang dimiliki oleh user keycloak, yang nantinya digunakan di Jenkins.
Name : jenkins-roles Display on consent screen : On Include in token scope : On
Klik tab Mappers, klik lagi Configure a new mapper
Klik Group Membership
yang perlu diisi
Mapper type : Group Membership
Name : jenkins-roles
Token Claim Name : jenkins-roles
Full group path : On
Add to ID token : On
Add to access token : On
Add to user info : On
kembali ke menu Clients -> jenkins -> Client scopes
kita akan menambahkan scope jenkins-roles, sehingga setiap user melakukan authentikasi, akan dikirimkan informasi jenkins-roles, yang digunakan oleh jenkins untuk mengetahui level akses user tersebut.
klik Add client scope, pilih jenkins-roles
pada tombol Add, pilih Default
4. Buat Group User
Tergantung kebutuhan anda, disini untuk contoh kita akan membuat dua level user, 1 admin satu lagi user biasa. Hak akses yang diberikan ke masing-masing level user ini nanti kita setting dari sisi Jenkins
Buat dua group
jenkins-admin jenkins-user
5. Buat user di Keycloak
Sekarang kita butuh dua user yang akan digunakan sebagai admin dan satu lagi user biasa. Klik menu Users
Untuk user admin
Username : admin
Email : user@domain
Email verified : On
First name : Developer
Last name : User
Enabled : On
Groups : jenkins-admin
klik Create
lalu buat password untuk user admin. Klik tab Credentials -> Set password
Password : SUPERAMAN Password confirmation : SUPERAMAN Temporary : Off
Lakukan hal yang sama untuk user biasa, tetapi dengan perbedaan di username dan Groups
Username : developer
Email : user@domain
Email verified : On
First name : Jenkins
Last name : Users
Enabled : On
Groups : jenkins-user
Bila anda cek menu Users, bisa dilihat kedua user yang telah dibuat
Konfigurasi Jenkins
Login sebagai admin di jenkins, agar bisa menginstall plugin.
Klik Manage Jenkins -> Manage Plugins
plugin yang perlu di install adalah
– role-strategy
– oic-auth
oic-auth : agar bisa terkoneksi dengan keycloak
role-strategy : untuk membagi role yang dimiliki oleh user dari keycloak
setelah menginstall kedua plugin tersebut, kembali ke menu Manage Jenkins -> Configure Global Security, url manage ini biasanya http://[DOMAIN Jenkins]/manage
1. Konfigurasi OpenID
Di tahap ini kita akan mengaktifkan OpenID Auth dari sisi jenkins. Beberapa field yang harus diinput
Security Realm : Login with OpenID Connect Client id : jenkins, dari nama client yang dibuat di keycloak Client Secret : ambil dari client secret di client keycloak Automatic configuration -> Well-known configuration endpoint : http://[KEYCLOAk]/realms/[NAMA REALMS]/.well-known/openid-configuration User name field name : preferred_username Email field name : email Groups field name : jenkins-roles, diambil dari client -> client scope Keycloak Authorization : Role-Based Strategy
Untuk link Well-known configuration endpoint, bisa diambil dari Realms Settings -> Endpoint, copy link OpenID Endpoint Configuration
klik Save
2. Konfigurasi Role
Untuk mengkonfigurasi Role, klik Manage Jenkins -> Manage and Assign Roles -> Manage Roles
Pada Role to add, tambahkan satu-satu jenkins-admin dan jenkins-user, lalu klik Add.
Pada pilihan role, sesuaikan akses dari masing-masing user, contohnya bisa dilihat pada gambar
# untuk admin Role : jenkins-admin Overall : Administer, Read # untuk user Role : jenkins-user Overall : Read Job : Build, Cancel, Read Run : Replay View : Read Metrics : View
Kebutuhan untuk role bisa disesuaikan disini. Akhiri dengan klik Save
2. Assign Group ke Role
Klik menu Manage Jenkins -> Manage and Assign Roles -> Assign Roles
Setelah role tersebut dibuat, sekarang kita mapping dengan user group yang tadi dibuat, sengaja saya buat penamaan yang mirip antara role dan user groupnya, akan lebih memudahkan mappingnya. Untuk nama groupnya ditambahkan tanda / didepan, karena begitu format yang dikirimkan oleh Keycloak untuk nama groupnya, contoh /jenkins-admin dan /jenkins-user
Sekarang semua user jenkins akan dikelola oleh Keycloak, untuk melakukan percobaan, buka link Jenkins dengan browser yang berbeda. Anda otomatis diarahkan ke halaman login Keycloak, disini coba login sebagai admin
Login sebagai user
Buka browser yang berbeda atau menggunakan incognito
Bila dibandingkan keduanya, user admin memiliki menu
New item People Build History Manage Jenkins My Views New View
sedangkan user biasa memiliki menu
People Build History My Views
Testing Jenkins
Sebagai percobaan kita akan membuat 1 job. Dari user admin klik New Item
Item name : test-jobs, klik Freestyle project, akhiri dengan klik Ok
pada menu selanjutnya isikan description, lalu klik Save
Buka browser yang login dengan user biasa, refresh browser anda, muncul job yang baru dibuat
Anda bisa juga menjalankan job tersebut
DEBUG / Troubleshooting
Untuk melihat role yang dikirim oleh Keycloak
curl -s -X POST 'http://[DOMAIN KEYCLOAK]/realms/[NAMA REALMS]/protocol/openid-connect/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=jenkins' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'client_secret=HDh5G1k5VL5q7c9fBXqx6Sa7HCRKz7gK' \ --data-urlencode 'scope=openid' \ --data-urlencode 'username=developer' \ --data-urlencode 'password=developerpassword'
Sesuaikan URL, client_id, client_secret, username dan password. Untuk membaca token JWT tersebut, bisa lewat situs https://jwt.io/, atau lewat command line
curl -L -X POST 'http://192.168.49.2:31806/realms/platform2/protocol/openid-connect/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=jenkins' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'client_secret=HDh5G1k5VL5q7c9fBXqx6Sa7HCRKz7gK' \ --data-urlencode 'scope=openid' \ --data-urlencode 'username=developer' \ --data-urlencode 'password=developerpassword' | jq -r .access_token | jwt decode -
command line ini membutuhkan jq dan jwt
Untuk mengetahui role yang didapat oleh user akses http://JENKINS-DOMAIN/whoAmI/