Tuesday, February 28, 2017

Membangun Konsep Sistem Single Sign On (SSO) dengan Keycloak (SAML) dan OpenLDAP

  3 comments
Single Sign On - Source Image
Assalamu'alaikum Wr. Wb.
Di artikel ini saya akan menuliskan tentang bagaimana saya membangun Sistem Autentikasi Single Sign On (SSO) dan Single Logout (SLO) untuk sistem autentikasi Aplikasi berbasis Web dengan Keycloak sebagai Access Management dan OpenLDAP sebagai Database Informasi Pengguna.

a. Pengertian
Single Sign On (SSO) merupakan suatu sistem autentikasi yang memudahkan pengguna dalam mengakses banyak layanan namun hanya dengan Satu Kali Login. Kebalikannya, Single Logout (SLO) merupakan suatu sistem yang digunakan untuk me-logout akun kita hanya dengan Satu Kali Logout pada Salah Satu Aplikasi. Selengkapnya...

Keycloak sendiri merupakan sebuah aplikasi Identity and Access Management yang dapat digunakan untuk membangun Sistem Autentikasi terpusat pada Aplikasi berbasis Standalone atau Web. Selengkapnya...

Dan SAML merupakan suatu format autentikasi dan autorisasi yang berbasis XML untuk Web Browser, SAML bekerja dengan cara saling bertukar data dalam format XML antara Identity Provider (Server) dengan Service Provider (Client). SAML terkenal sebagai format standar untuk Autentikasi Single Sign On selain OpenID. Selengkapnya...

b. Latar Belakang
Dengan semakin banyaknya 'tuntutan' untuk memiliki banyak akun di banyak aplikasi, tentu saja ada kalanya kita tidak dapat mengingat detail dari setiap akun pada layanan tersebut. Oleh karena itu, sistem Autentikasi SSO datang menjawab masalah tersebut. Atas dasar itulah saya ingin mencoba membangun sistem autentikasi ini berdasarkan konsep SSO itu sendiri.

c. Maksud dan Tujuan
Dapat mengerti alur proses autentikasi dari Sistem SSO dan dapat membangun Sistem SSO tersebut untuk tujuan mengautentikasi user yang menggunakan layanan atau aplikasi berbasis Web.

d. Waktu Pelaksanaan
Untuk mempelajari dasar dari SSO dan Struktur Data LDAP serta membangun sistem Single Sign On ini dari awal, saya menghabiskan waktu kurang lebih 2 Minggu (1 Minggu untuk Mempelajari, 1 Minggu untuk Mempraktikkannya).

e. Alat dan Bahan
- PC + Kabel UTP RJ45.
- Aplikasi VirtualBox.
- ISO Ubuntu Server 16.04 (64-bit).
- 2x VM Ubuntu Server (Untuk Keycloak dan OpenLDAP).
- 1x Perangkat MikroTik (Untuk Bridging Network) / Alternatif: Gunakan Host-only Network.
- Aplikasi Keycloak.
- OpenJDK & OpenJRE.
- OpenLDAP & phpLDAPadmin.
- CMS Wordpress + Plugin SAML 2.0 Single Sign On
- Nextcloud + Plugin SAML Single Sign On

f. Langkah Kerja
Tips: Lakukan Instalasi Ubuntu Server Satu Kali, Lakukan Konfigurasi Pertama, kemudian Clone 2x. Satu untuk VM yang lain, Satu dijadikan cadangan untuk hal-hal darurat.
Saya mengasumsikan alat dan bahan diatas telah disiapkan dan siap untuk dipakai.
1. Lakukan Instalasi OpenLDAP & phpLDAPadmin.
Hal pertama yang akan kita lakukan adalah melakukan Instalasi OpenLDAP & phpLDAPadmin, teman-teman dapat mengikuti Artikel saya sebelumnya mengenai Instalasi awalnya disini.

2. Konfigurasi OpenLDAP & phpLDAPadmin.
Setelah teman-teman melakukan instalasi aplikasi-aplikasi ini, saatnya kita melakukan konfigurasi awal pada OpenLDAP yaitu membangun Struktur Dasarnya. Secara Default, ketika kita melakukan instalasi OpenLDAP aplikasi ini belum membuat Struktur Data nya. Maka dari itu kita akan membuatnya disini.
~# dpkg-reconfigure slapd
Omit OpenLDAP server configuration?
-- Pilih No karena kita hanya ingin membuat Database saja.
DNS domain name:
-- Masukkan Nama Domain yang akan digunakan sebagai Struktur Akar dari Database OpenLDAP
Organization name:
-- Dapat diisi sama dengan Domain Name
Administrator password:
-- Masukkan Password untuk akun Admin nantinya.
Database backend to use:
-- Pilih MDB
Do you want the database to be removed when slapd is purged?
-- Pilih No
Move old database?
-- Pilih No
Allow LDAPv2 Protocol?
-- Ini hanya preferensi, namun bila teman-teman mempunyai aplikasi yang masih memakai Protokol LDAP Versi 2, silahkan pilih Yes. Apabila tidak pilih No saja.

3. Konfigurasikan phpLDAPadmin untuk DB dan Account Binding.
Kita akan sesuaikan konfigurasi dari phpLDAPadmin agar Login Binding nya menuju ke Database dan Akun Admin yang sudah kita buat. Edit file:
~# nano /etc/phpldapadmin/config.php
Silahkan cari value ini:
/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
   auto-detect it for you. */
$servers->setValue('server','base',array('dc=example,dc=com'));
/* The DN of the user for phpLDAPadmin to bind with. For anonymous binds or
   'cookie','session' or 'sasl' auth_types, LEAVE THE LOGIN_DN AND LOGIN_PASS
   BLANK. If you specify a login_attr in conjunction with a cookie or session
   auth_type, then you can also specify the bind_id/bind_pass here for searching
   the directory for users (ie, if your LDAP server does not allow anonymous
   binds. */
$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');


4. Login ke phpLDAPadmin
Setelah Login Binding kita konfigurasi, silahkan teman-teman buka browser masing-masing dan buka phpLDAPadmin melalui:
http://IP_atau_Domain/phpldapadmin
Kemudian Klik Login pada bagian kiri, lalu masukkan password.
5. Buat Struktur Database LDAP
Pada LDAP kita akan mengenal yang namanya Entry. Entry ini memiliki tiga komponen didalamnya yaitu, Distinguished Name (DN) / Relative Distinguished Name (RDN), Kumpulan Attribute, dan Kumpulan Object Class.
Contoh Pencarian Data LDAP yang dilakukan dengan Perintah 
ldapsearch -x -b cn=Fajar\ Ru,cn=siswa,ou=akun,dc=smkn1pedan,dc=com
# Fajar Ru, siswa, akun, smkn1pedan.com
dn: cn=Fajar Ru,cn=siswa,ou=akun,dc=smkn1pedan,dc=com
cn: Fajar Ru
givenName: Fajar
gidNumber: 502
homeDirectory: /home/users/fajar
sn: Ru
loginShell: /bin/sh
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
uidNumber: 1002
uid: fajar
mail: fajaru@smkn1pedan.com
Kita bisa lihat bahwa kita mempunyai:
- Distinguished Name (DN): cn=siswa,ou=akun,dc=smkn1pedan,dc=com
- Relative Distinguished Name (RDN): cn=Fajar Ru
- Gabungan DN dan RDN : dn: cn=Fajar Ru,cn=siswa,ou=akun,dc=smkn1pedan,dc=com
- Kumpulan Attribute : cn, givenName, sn, uid, mail
- Object Class (inetOrgPerson, posixAccount) yang menunjukkan bahwa Entry ini merupakan sebuah akun untuk pengguna. Dan Object Class ini juga yang menentukan Attribute-Attribute apa saja yang dimiliki oleh Entry tersebut.

Setelah teman-teman sedikit mengetahui tentang strukturnya, sekarang kiita akan mulai membuatnya. Kita akan mulai dari yang paling dekat dengan Struktur Akar, Domain Component (DC), dan Organization (O). Yaitu Organization Unit (OU).

Buat Organization Unit (OU):
- Dari menu utama setelah kita login, kita Klik Create new entry here dibawah Entry cn=admin.
- Kemudian pada pemilihan Template, kita pilih Generic: Organization Unit.
- Setelah itu kita isikan nama Organization Unit. Disini saya akan isi dengan akun.
- Setelah itu kita Create Object lalu Commit.

Buat Posix Group (Child atau Sub dari Organization Unit):
- Klik pada Organization Unit (ou=akun) atau yang sudah teman-teman buat.
- Kemudian klik Create a child entry.
- Pada pemilihan Template, kita pilih Generic: Posix Group.
- Masukkan nama groupnya. Kemudian klik Create Object lalu Commit.
- Bila teman-teman ingin membuat Grup lebih dari satu, silahkan ulangi lagi.

Hal yang kita lakukan selanjutnya adalah membuat Entry untuk akun pengguna. Disini saya akan membuat satu akun per masing-masing grup.
- Pertama, silahkan klik nama grup teman-teman yang ingin dimasukkan akun didalamnya.
- Kemudian klik Create a child entry.
- Pada pemilihan Template, pilih Generic: User Account.
- Silahkan teman-teman isikan form-form yang tersedia. Hal yang perlu diperhatikan disini adalah Common Name (CN) dan User ID (UID). Untuk akun pengguna, Common Name biasa terisi dengan Nama Lengkap. Sedangkan User ID diisi dengan Username yang akan digunakan.
- Apabila sudah silahkan klik Create Object lalu Commit.
- Untuk menambahkan Email, silahkan teman-teman klik Add New Attribute kemudian pilih Email.
- Ulangi apabila teman-teman ingin membuat akun lagi.

6. Instalasi OpenJDK & OpenJRE
Keycloak merupakan aplikasi berbasis Java, maka dari itu kita perlu menginstall Java Development Kit, dan Java Runtime Environment. Disini saya akan memakai OpenJDK dan OpenJRE

~# apt install default-jdk default-jre

7. Menambahkan User Admin untuk Manajemen Keycloak
Setelah teman-teman mendownload dan meng-extractnya. Silahkan teman-teman menuju folder Keycloak -> Bin.
keycloak/bin# ./add-user-keycloak.sh -r master -u admin -p tekaje
8. Jalankan Keycloak dalam Mode Standalone.
Setelah akun dibuat, kita akan jalankan Keycloak dalam mode Standalone. File yang digunakan untuk menjalankan aplikasi ini ada di folder bin.
keycloak/bin# ./standalone.sh -b 0.0.0.0
Parameter "-b 0.0.0.0" disini digunakan agar Keycloak tidak mem-binding akses nya ke Localhost saja.
9. Akses Admin Panel Keycloak dan membuat Realm baru.
Akses Admin Panel Keycloak dari Web Browser dengan membuka:
http://IP_atau_Domain_Keycloak/auth/admin
Setelah kita masuk, kita klik Master pada Menu Utama, kemudian klik Add realm. Silahkan teman-teman masukkan Nama Realm nya kemudian klik Create. Secara otomatis setelah kita membuatnya, kita akan langsung masuk ke Realm yang baru.
10. Integrasikan Keycloak dengan OpenLDAP
Pada Menu Utama, silahkan klik User Federation. Kemudian pada Add Provider pilih LDAP.
Isikan dan sesuaikan seperti gambar dibawah. Hal yang perlu diperhatikan adalah:
- Connection URL : ldap://<Masukkan IP OpenLDAP disini>
- Users DN : Masukkan DN dari Organization Unit atau Grup yang berisi user-user.
- Bind DN : Masukkan DN dari User Admin LDAP.
- Bind Credential : Masukkan Password dari User Admin LDAP.

Apabila sudah silahkan klik Save lalu klik Synchronize all users. Jika tidak ada permasalahan, maka akan muncul notifikasi Success!. Untuk mengecek apakah Data user dari LDAP sudah diimport, silahkan klik Users pada menu utama lalu klik View all users.

11. Instalasi Wordpress dan Pemasangan Plugin SAML 2.0 Single Sign On.
Saya asumsikan teman-teman bisa dan sudah melakukan Instalasi dari Wordpress. Selanjutnya kita lakukan Instalasi dari Plugin SAML 2.0.
- Dari menu utama, kita Hover pada Menu Plugins kemudian kita Klik Add New.
- Pada menu Upload, silahkan Upload file plugin yang sudah teman-teman download.
- Apabila sudah, klik Activate Plugin untuk mengaktifkan Plugin.

12. Konfigurasi Plugin Wordpress SAML 2.0 Single Sign On.
Setelah instalasi selesai, silahkan hover ke Menu Settings kemudian klik menu Single Sign On.
- Hal pertama yang akan kita lakukan adalah mengisi data dari Service Provider (SP).
- Isikan seperti gambar dibawah dengan penyesuaian dengan milik teman-teman.
13. Download & Import Metadata dari Plugin Wordpress Untuk Dijadikan Template Client Keycloak.
Masih di Plugin Wordpress SAML. Silahkan buka Tab General kemudian Download Metadata nya.
Setelah itu silahkan ke halaman admin Keycloak lalu klik Menu Client, Kemudian Import file Metadata yang telah teman-teman download tadi lalu klik Save.

14. Sesuaikan konfigurasi Client Keycloak.
Pada settingan Plugin Wordpress, kita memilih format NameID Email. Maka di Keycloak kita juga samakan dengan mengganti dari Username ke Email.
15. Import Konfigurasi IDP (Keycloak) ke SP (Wordpress)
Masih pada halaman Client Keycloak, silahkan buka Tab Installation. Pilih SAML Metadata IDPSSODescriptor pada Format Option, kemudian download metadata tersebut. Upload Metadata yang telah didownload tadi ke Webroot manapun asal dapat teman-teman akses dari Browser.
Setelah itu kita kembali ke Konfigurasi Plugin Wordpress, kali ini kita konfigurasikan Tab Identity Provider. Arahkan URL dari Metadata yang sudah teman-teman upload ke URL to IDP Metadata lalu klik Fetch Metadata untuk memudahkan kita mengisi form-form dibawahnya.
Untuk Certificate Fingerprint, Pertama-tama silahkan teman-teman Export Signing Key yang ada di Profile Client Wordpress teman-teman di Keycloak pada Tab SAML Keys. Kemudian teman-teman buka Terminal dan pastikan teman-teman telah menginstall OpenSSL. Untuk mendapatkan Certificate Fingerprint nya, silahkan ketikkan perintah berikut di Terminal.
~# openssl pkcs12 -in <lokasi atau nama file .p12> -nodes -passin pass:<key yang dimasukkan saat export, kosongkan apabila tidak diisi> | openssl x509 -noout -fingerprint

16. Aktifkan Single Sign On Wordpress
Setelah Checklist yang ada di Plugin Wordpress sudah terpenuhi semuanya, silahkan berikan Checklist pada Tab General > Enable SAML Authentication.
17. Setting User Mapping pada Keycloak
Agar data dari LDAP dapat dibaca oleh Wordpress, kita perlu menyesuaikan (mapping) dari LDAP ke Wordpress melalui Keycloak. Untuk melakukannya silahkan teman-teman kembali ke halaman Client Wordpress di Keycloak, kemudian teman-teman buka Tab Mappers. Tambahkan Mapping dengan klik Create. Hal yang harus dibuat adalah sebagai berikut:
Username
- Name: username
- Mapper Type: User Property
- Property: username
- Friendly Name: username
- SAML Attribute Name: username
- SAML Attribute NameFormat: Basic
Firstname
- Name: firstname
- Mapper Type: User Property
- Property: firstName
- Friendly Name: firstname
- SAML Attribute Name: firstname
- SAML Attribute NameFormat: Basic
Lastname
- Name: lastname
- Mapper Type: User Property
- Property: lastName
- Friendly Name: lastname
- SAML Attribute Name: lastname
- SAML Attribute NameFormat: Basic
Email
- Name: email
- Mapper Type: User Property
- Property: mail
- Friendly Name: email
- SAML Attribute Name: email
- SAML Attribute NameFormat: URI Reference
18. Test SSO Wordpress
Silahkan teman-teman buka Wordpress kemudian buka WP-Admin. Apabila tidak ada masalah, seharusnya akan menampilkan Login Page dari Keycloak dan setelah Login akan kembali diarahkan ke WP-Admin.
19. Integrasi Keycloak ke Nextcloud dengan Plugin SSO & SAML authentication yang secara default ada di Nextcloud namun belum di Enable.
Saya asumsikan teman-teman sudah menginstall Nextcloud dan Plugin SSO & SAML authentication sudah di Enable di Main Menu -> Add Apps -> Not Enabled .
- Silahkan teman-teman buka Admin Page melalui User Menu di Pojok kanan atas lalu pilih Admin.
- Klik pada Menu SAML & SSO authentication
- Isikan seperti gambar dibawah ini, dengan Certificate dan Private Key dapat teman-teman generate melalui Terminal (membutuhkan OpenSSL) dengan perintah:
~# openssl req -newkey rsa:2048 -nodes -keyout user_saml.key -x509 -days 1024 -out user_saml.crt
Setelah selesai digenerate, silahkan teman-teman buka menggunakan Teks Editor dan masukkan satu persatu data dari Certificate serta Private Key tersebut ke Form Service Provider.
- Untuk Certificate dari Identity Provider, silahkan teman-teman ambil melalui Keycloak. Ada pada menu Realm Settings -> Keys -> All -> Certificate.
20. Import Metadata Nextcloud ke Keycloak
Setelah data Service Provider dan Identity Provider di Nextcloud diisi dan sudah keluar notifikasi Metadata Valid, silahkan teman-teman Download Metadata tersebut dan Import menjadi Client di Keycloak. Pada hal ini tidak ada hal yang diubah pada Konfigurasi Client nya.
21. Test SSO Nextcloud dan Wordpress
Silahkan teman-teman Logout semua Session yang ada dari Keycloak -> Sessions -> Logout All.
Kemudian silahkan teman-teman untuk login di salah satu aplikasi, Wordpress atau Nextcloud. Apabila sudah cobalah untuk berpindah ke aplikasi lain dan mencoba login. Apabila pada aplikasi kedua teman-teman langsung di redirect kembali dan tidak diminta untuk Login maka kita sudah mendapatkan Konsep dari SSO.

g. Referensi
- Wikipedia - Single Sign On
- Wikipedia - Security Assertion Markup Language
- SOA Security - How SAML2 Single Logout Works
- LDAP - Basic LDAP Concept
- LDAP - DIT and the LDAP Root DSE
- DigitalOcean - Understanding the LDAP Protocol, Data Hierarchy, and Entry Components
- DigitalOcean - How To Install and Configure a Basic LDAP Server on an Ubuntu 12.04 VPS
- Keycloak Documentation
- Nextcloud 11 Documentation - Configuring Single Sign On
- CloudForm - Nextcloud and Keycloak (SAML)
- Kurusetra Computer - Linux Single Sign On (SSO)
- Stackoverflow - How to get SHA1 fingerprints from p12 certificate?
- Random Stackoverflow Search
- dan Masih Banyak Referensi yang tidak bisa saya sebutkan satu persatu

h. Kesimpulan
Meski saya sudah berhasil mendapatkan konsep dari Single Sign On dan berhasil mempraktekkannya, namun percobaan ini belumlah sempurna. Saya masih perlu mempelajari lebih dalam mengenai User Provisioning dalam LDAP dan Penyesuaian Mapping nya agar semua aplikasi dapat digunakan sebagaimana mestinya. Karena seperti yang teman-teman lihat, Pada percobaan ini saya masih belum dapat melakukan Login sebagai Admin pada Wordpress dengan Sistem SSO ini, dan Error pada Nextcloud yang disebabkan karena belum adanya Mapping yang benar dan sesuai dengan aplikasinya.


Sekian yang dapat saya tulis, semoga bermanfaat bagi teman-teman semuanya!
Apabila terdapat kekurangan dan kesalahpahaman ataupun salah penulisan saya mohon maaf sebesar-besarnya dan meminta Kritik dan Sarannya.
Dan seperti biasa, Terima Kasih!
Wassalamu'alaikum Wr. Wb.

3 comments :

  1. bang ini plugin wpnya dimana yak? kok aq cari ga ada

    ReplyDelete
    Replies
    1. Sepertinya dari sananya memang sudah nggak bisa didownload mas, mungkin karena memang udah gak diupdate lagi. Untuk alternatifnya coba pakai yang dari Miniorange, ada beberapa orang yang bisa pakai plugin ini dengan Keycloak (https://id.wordpress.org/plugins/miniorange-saml-20-single-sign-on/)

      Delete