User Storage Federation di Keycloak

Federation merupakan sebuah standar umum dan protokol yang digunakan untuk mengelola dan memetakan identitas pengguna antara penyedia identitas (identity provider) lintas organisasi. Federation berkaitan dengan Single Sign On (SSO) atau autentikasi satu pintu untuk mengakses berbagai macam aplikasi.

Bagi kamu yang baru pernah mendengar SSO, ini seperti kita mempunyai akun Gmail milik Google dan jika sudah punya kita bisa mengakses aplikasi mereka seperti Youtube, Google Drive, Google Photos, dan lain-lain.

Membuat SSO dari nol itu sulit namun ada beberapa perangkat lunak terbuka (open-source) yang menyediakan hal ini di antaranya Keycloak dan CAS (Central Authentication Service). Jika ingin melihat perbandingannya bisa dilihat di sini: Perbandingan penyedia layanan SSO.

Di tulisan ini saya akan membahas Keycloak dan user federation di Keycloak. Bagi yang belum tahu, Keycloak adalah aplikasi open source yang menangani Open Source Identity dan Access Management dengan keribetan yang minimum. Didalamnya terdapat fitur mumpuni seperti User Federation, Identity Brokering dan Social Login.

Banyak perusahaan memiliki database pengguna yang sudah ada dan berisikan password atau kredensial lainnya. Dalam banyak kasus, tidak mungkin untuk memindahkan data yang sudah ada tersebut ke dalam penyebaran Keycloak murni (pure Keycloak deployment). Keycloak dapat menggabungkan database pengguna eksternal yang sudah ada dengan menggunakan LDAP (Lighweight Directory Access Protocol) dan Active Directory.

Berikut saya akan mendemokan cara menggunakan fitur user federation di Keycloak dengan bantuan LDAP.

Persiapan yang dibutuhkan:

  • Pengetahuan dasar tentang Docker. Jika kamu belum memiliki pengetahuan dasar tentang Docker silakan tonton channel Programmer Zaman Now.
  • Docker untuk membuat kontainer Keycloak, Postgres dan LDAP.
  • CSV2LDIF untuk mengkonversi data sembarang format CSV ke format LDIF.

Membuat kontainer Keycloak, Postgres dan LDAP

Untuk membuat tiga kontainer tersebut kita akan menggunakan bantuan docker-compose agar tidak capek membuat kontainer satu per satu. Saya sudah menyediakan repositori bernama sso-simulation dan jalankan perintah docker-compose up -d agar docker membuat container dibalik layar (background) dan untuk mengetahui kontainer mana yang sudah berjalan bisa menggunakan docker-compose ps. Berikut hasil dari kedua perintah tersebut.

$ docker-compose up -d
Creating network "sso-simulation-network" with the default driver
Creating volume "sso-simulation-db" with default driver
Creating sso-openldap ... done
Creating sso-postgres ... done
Creating sso-keycloak ... done
$ docker-compose ps
    Name                  Command               State                Ports             
---------------------------------------------------------------------------------------
sso-keycloak   /opt/jboss/tools/docker-en ...   Up      0.0.0.0:8080->8080/tcp         
sso-openldap   /container/tool/run              Up      0.0.0.0:10389->389/tcp, 636/tcp
sso-postgres   docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp

Kontainer yang dihasilkan adalah kontainer sso-postgres untuk menyimpan data Keycloak, sso-keycloak untuk Keycloak dan sso-openldap untuk OpenLDAP.

Membuat data sembarang untuk LDAP

Kita akan membuat data sembarang untuk testing LDAP dengan menggunakan Mockaroo dan csv2ldif. Mockaroo digunakan untuk membuat data user test random dan dihasilkan dengan format csv dan csv2ldif digunakan untuk mengkonversi data format csv menjadi format ldif agar bisa dibaca oleh LDAP. Silahkan masuk ke website Mockaroo dan masukkan isian berikut

Field Name Type Options
uid GUID
objectClass Character Sequence inetOrgPerson
givenName First Name
sn Last Name
cn Full Name
mail Email Address
userPassword Password

Kita akan mencetak sebanyak 1000 data dengan format CSV kemudian tinggal unduh data tersebut. Umumnya nama file bernama MOCK_DATA.csv.

Konversi data CSV ke LDIF

Silakan unduh CSV2LDIF dan ekstrak dengan perintah

tar -xzvf csv2ldif2-1.1.tar.gz

Berikutnya, masuk pindahkan data MOCK_DATA.csv ke dalam folder csv2ldif2-1.1 dan jalankan perintah

csv2ldif2-1.1/csv2ldif2.pl -b dc=example,dc=org < MOCK_DATA.csv > mock_data.ldif

-b adalah basis DN dan MOCK_DATA.csv adalah file yang kita dapatkan dari website Mockaroo. Hasilnya adalah file bernama mock_data.ldif.

Impor data LDIF ke dalam LDAP

Untuk mengimpor data LDIF ke dalam LDAP, kita diharapkan memiliki aplikasi LDAP yang terinstalasi di komputer kita. Namun, karena instalasinya cukup rumit kita harus mencari jalan alternatif yakni menggunakan kontainer sso-openldap yang sudah kita buat.

Langkah pertama, salin file mock_data.ldif tadi ke dalam kontainer sso-openldap di direktori tmp dengan perintah:

docker cp mock_data.ldif sso-openldap:/tmp

Jika lokasi mock_data.ldif berada di direktori lain maka tinggal mainkan saja path directory nya.

docker cp your/path/directory/storedata/mock_data.ldif sso-openldap:/tmp

Langkah kedua, kita masuk ke dalam kontainer sso-openldap dengan perintah

docker exec -it sso-openldap bash

Langkah ketiga, masuk ke direktori tmp dan jalankan perintah di ldapmodify untuk mengimpor data sembarang tadi ke dalam LDAP.

root@402ba6e3d523# cd tmp
root@402ba6e3d523:/tmp# ldapmodify -x -H ldap://localhost -D "cn=admin,dc=example,dc=org" -w admin -a -f mock_data.ldif
adding new entry "uid=efb5daf2-b000-4015-9fcf-6ea843e42de9,dc=example,dc=org"

adding new entry "uid=7da84176-1df2-45dd-9bbd-feb6af07c310,dc=example,dc=org"

adding new entry "uid=1209756b-22aa-4d28-b6bc-3a1af3f7babb,dc=example,dc=org"

...... // Sistem akan menambahkan entri data sampai 1000 baris

Di sini kita sudah berhasil dan lanjut ke tahap berikutnya.

Menghubungkan Keycloak dengan LDAP

Berikutnya, kita akan menghubungkan Keycloak dengan LDAP melalui user federation.

Langkah pertama, kita buat realm di Keycloak. Realm ini semacam dunia yang mana di dalamnya terdapat daftar aplikasi (client apps), data user dan konfigurasi lainnya. Setiap realm berbeda satu sama lain. Arahkan kursor ke arah Master realm di sisi kiri atas dan buat realm baru bernama ldap-demo.

Langkah kedua, masuk ke menu User Federation dan pilih provider ldap. Kita perlu mengetahui IP Address dari kontainer LDAP yang kita buat dari docker-compose. Nah, perlu diketahui bahwa saat membuat ketiga kontainer tersebut, saya mendaftarkannya dalam satu network yakni sso-simulation-network. Untuk mendapatkan IP Address tersebut masukkan perintah:

$ docker inspect --format '{{ $network := index .NetworkSettings.Networks "sso-simulation-network" }}{{ $network.IPAddress }}' sso-openldap
$ 172.21.0.2 # hasil output...

Setelah mendapatkan IP Address dari LDAP, berikutnya pasang konfigurasi seperti gambar di bawah

Federation settings

Parameter Value
Console Display Name LDAP
Edit Mode READ_ONLY
Sync Registrations OFF
Vendor Other
Username LDAP Attribute uid
RDN LDAP Attribute uid
UUID LDAP Attribute entryUUID
User Object Classes inetOrgPerson
Connection URL ldap://172.21.0.2:389
Users DN dc=example,dc=org
Bind Type simple
Bind DN cn=admin,dc=example,dc=org
Bind Credential [OpenLDAP password]. Password umum: admin
Search Scope One Level
Validate Password Policy Off
Use Truststore SPI Only for ldaps
Connection Pooling ON
Connection Timeout n/a
Read Timeout n/a
Pagination ON

Untuk pengaturan Kerberos Integeration, Sync Settings dan Cache Settings dibiarkan saja. Kemudian klik tombol save dan sync all users. Jika berhasil maka akan muncul pesan yang menandakan bahwa 1000 user berhasil disinkron. Untuk melihat user yang telah disinkron, masuk ke menu Users dan klik view all users.

Sekian dan semoga bermanfaat.

Referensi

  1. LDAP Federation with Keycloak
  2. Go Templates and Parsing Errors When Hyphen is Used