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
create platform realms

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

jenkins create jenkins client

Pada capability config, yang wajib diisi

Client authentication : ON
Authorization : ON
Authentication flow : 
 - Standard flow
 - Direct access grants

create client keycloak capability config
klik Save

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.
buat client scope jenkins

Name : jenkins-roles
Display on consent screen : On
Include in token scope : On

Klik tab Mappers, klik lagi Configure a new mapper
buat new mappers

Klik Group Membership
jenkins 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
add 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
add client scopes for jenkins
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 group untuk 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
jenkins admin user
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
set permanent 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
User list keycloak

Konfigurasi Jenkins

Login sebagai admin di jenkins, agar bisa menginstall plugin.

Klik Manage Jenkins -> Manage Plugins
install jenkins plugin

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
jenkins aktifkan openid

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

Jenkins login with openid
Untuk link Well-known configuration endpoint, bisa diambil dari Realms Settings -> Endpoint, copy link OpenID Endpoint Configuration
openid wellknown endpoint
klik Save

2. Konfigurasi Role
Untuk mengkonfigurasi Role, klik Manage Jenkins -> Manage and Assign Roles -> Manage Roles
mange roles and assign roles jenkins

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
jenkins manage user roles

# 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
assign roles to groups

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 jenkins di arahkan ke keycloak
jenkins keycloak login sebagai admin

Login sebagai user
Buka browser yang berbeda atau menggunakan incognito
login as normal user jenkins

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
buat test jobs
pada menu selanjutnya isikan description, lalu klik Save
isikan description jobs

Buka browser yang login dengan user biasa, refresh browser anda, muncul job yang baru dibuat
job muncul di akun user biasa
Anda bisa juga menjalankan job tersebut

job berhasil dijalankan

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
jenkins roles dari keycloak
Untuk mengetahui role yang didapat oleh user akses http://JENKINS-DOMAIN/whoAmI/
jenkins whoami

Leave a comment

Your email address will not be published. Required fields are marked *