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.
|
|
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 | |
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
|
|
Berikutnya, masuk pindahkan data MOCK_DATA.csv
ke dalam folder csv2ldif2-1.1
dan jalankan perintah
|
|
-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.
Pertama, salin file mock_data.ldif
di direktori assets
ke dalam kontainer sso-openldap
di direktori tmp
dengan perintah:
|
|
Kedua, kita masuk ke dalam kontainer sso-openldap
dengan perintah
|
|
Ketiga, masuk ke direktori tmp
dan jalankan perintah di ldapmodify
untuk mengimpor data sembarang tadi ke dalam LDAP.
|
|
Di sini kita sudah berhasil dan lanjut ke tahap berikutnya.
Menghubungkan Keycloak dengan LDAP
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
.
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:
|
|
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.