Keycloak menyediakan fitur User Federation yang mana dapat menyinkronkan data pengguna yang ada di server LDAP dan Active Directory ke Keycloak.

Berikut ini adalah langkah-langkah untuk menggunakan fitur User Federation di Keycloak dengan server LDAP.

Persiapan

  • 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

Kita akan menggunakan docker-compose untuk membuat kontainer Keycloak, Postgres, dan LDAP. Saya sudah menyediakan file docker-compose repositori bernama libreto.

Jalankan perintah docker-compose up -d agar docker membuat container dibalik layar. Gunakan perintah docker-compose ps untuk mengecek apakah ketiga kontainer sudah bisa digunakan.

Berikut hasil dari kedua perintah tersebut.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ 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 sso-keycloak untuk Keycloak, sso-postgres untuk menyimpan data 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.

Csv2ldif digunakan untuk mengkonversi data format csv menjadi format ldif agar bisa dibaca oleh LDAP. Silakan 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

1
tar -xzvf csv2ldif2-1.1.tar.gz

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

1
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 LDAP

Pertama, salin file mock_data.ldif di direktori assets ke dalam kontainer sso-openldap di direktori tmp dengan perintah:

1
docker cp assets/mock_data.ldif sso-openldap:/tmp

Kedua, kita masuk ke dalam kontainer sso-openldap dengan perintah

1
docker exec -it sso-openldap bash

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

Menghubungkan Keycloak dengan LDAP

Pertama, kita buat realm di Keycloak. Realm ini semacam “dunia” yang mana di dalamnya terdapat client apps, users, groups 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.

Untuk mendapatkan IP Address tersebut masukkan perintah:

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

Kata sso-simulation-network adalah network yang sudah saya buat di dalam file docker-compose.

Setelah mendapatkan IP Address dari LDAP, berikutnya atur konfigurasi seperti gambar di bawah ini.

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: 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

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.

Referensi

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