Implementasi Server OPAC Senayan

Pendahuluan


Senayan (http://senayan.diknas.go.id) merupakan aplikasi berbasis web untuk manajemen perpustakaan yang dikembangkan dengan model Open Source (http://www.opensource.org) dengan lisensi GPL versi 3 (http://www.gnu.org/licenses/gpl.html). Dengan begini setiap orang mempunyai kebebasan untuk mendownload, mempelajari, memodifikasi, dan redistribusi serta harus dilisensikan dibawah GPL.

Yang mungkin tidak banyak diketahui orang adalah, developer Senayan semuanya adalah pustakawan, atau paling tidak background formal pendidikannya adalah Jurusan Ilmu Perpustakaan. Karena itu bisa dikatakan Senayan adalah software dari pustakawan untuk pustakawan. Belakangan mulai muncul orang dengan background IT yang ikut berkontribusi dalam pengembangan Senayan. Silahkan lihat http://senayan.diknas.go.id/web/?q=developers untuk melihat profil singkat para developer Senayan.


Senayan dibuat dengan bahasa pemrogaman web PHP (http://www.php.net) dan database MySQL (http://www.mysql.com). Senayan dikembangkan dengan sangat aktif oleh para developer-nya dari beberapa kota di Indonesia seperti Jakarta, Bogor dan Jogja.

Perpustakaan Diknas sebagai institusi yang membuat, menggunakan dan menjadi basecamp nya para developer Senayan, ingin membangun OPAC (Online Public Access Catalog)-nya yang berbasis Senayan yang bisa diakses via http://perpustakaan.diknas.go.id. Berikut ini adalah beberapa catatan teknis yang dilakukan untuk meng-online-kan Senayan di web.

Operating System (OS)

Dengan alasan keamanan, diputuskan untuk membuat server sendiri bagi kebutuhan OPAC. Tadinya OS yang akan digunakan adalah OpenBSD 4.3 (http://www.openbsd.org). Tetapi karena sebagian hardware tidak dapat dikenali, akhirnya digunakan OpenSUSE 11 (http://www.opensuse.org) yang merupakan distribusi Linux berbasis di Eropa dengan teknik engineering khas Jerman. Default instalasi OpenSUSE yang aman ditambah lagi dengan Yast, sangat memudahkan administrasi sistem untuk server publik di internet.

Apache, PHP dan MySQL

Apache (http://httpd.apache.org, web server), PHP (http://www.php.net, server-side scripting language), dan MySQL (http://www.mysql.com, database server) diinstall dari paket binary OpenSUSE. Beberapa bahkan sudah ditingkatkan keamanannya misalnya patch PHP dengan Suhosin (http://www.hardened-php.net/suhosin/). Dengan menginstall software dari paket binary distro OpenSUSE, proses upgrade software relatif lebih simpel dan mudah dilakukan. Modul untuk secure socket layer (SSL) di Apache juga diaktifkan. Dokumentasi cara mengaktifkan SSL di Apache untuk OpenSUSE bisa dibaca di http://en.opensuse.org/Apache_Howto_SSL.

Firewall dengan iptables

Karena kebutuhan yang masih sederhana, setup firewall (iptables) dilakukan melalui Yast2 (Yet Another Setup Tool). Port yang dibuka buat publik adalah port 80 (http), 443 (https), dan 22 (ssh). Akses http dan https untuk mengakses layanan web. Sedangkan akses ssh bergunakan untuk transfer update data terenkripsi dari server produksi perpustakaan diknas ke server opac. Tetapi akses ssh, meskipun akses datanya terenkripsi, diasumsikan sebagai akses backdoor sehingga membuka aksesnya terhadap publik dapat dianggap merupakan celah keamanan. Untuk itu akses ssh dibatasi hanya menerima dari IP tertentu. Cara dengan mengedit file /etc/hosts.allow dan tambahkan entri:

sshd : xxx.xxx.xxx.xxx : allow
sshd : ALL : deny


xxx.xxx.xxx.xxx adalah  alamat IP yang diizinkan untuk mengakses port 22/ssh. Selain itu akses langsung sebagai root/superuser dicegah dengan mengedit file /etc/sshd_config dan mengubah baris:
#PermitRootLogin yes menjadi PermitRootLogin no. Detailnya bisa dibaca di: http://en.opensuse.org/SUSE_Security_Lockdown_-_Hardening_Your_Linux_System.

Firewall aplikasi web: mod_security

Untuk meningkatkan keamanan aplikasi web, diinstal juga mod_security (http://www.modsecurity.org/) yang merupakan modul Apache. mod_security berada di level aplikasi web dan membantu menutupi kemungkinan celah yang muncul dari lemahnya sebuah aplikasi web seperti kemungkinan injeksi sql, cross-site scripting, web intrusion, dan lain-lain. mod_security bekerja dengan cara mencegah semua trafik http, mengeceknya dengan rules yang sudah didefinisikan, dan mencegah aktifitas yang dinilai mencurigakan.

mod_security bisa didownload di http://www.modsecurity.org/download/direct.html. Di OpenSUSE, harus diinstall melalui source code. Detail cara instalasinya bisa dibaca di: http://www.howtoforge.com/installing-mod-security-on-sles10. Pada beberapa server yang diakses berdasarkan IP address, default rules mod_security akan menimbulkan error. Untuk mengatasi hal tersebut, edit file modsecurity_crs_21_protocol_anomalies.conf, cari baris:

# Check that the host header is not an IP address

tambahkan karakter “#” pada baris dibawahnya (#SecRule REQUEST_HEADERS:Host "^[\d\.]+$" "phase:2).

Firewall database: greensql

Untuk menambahkan keamanan di level database dari serangan injeksi SQL, ditambahkan firewall greensql (http://www.greensql.net/). Jadi kalau digambarkan keterhubungan antara Apache, PHP, MySQL, mod_security dan greensql, kira-kira akan seperti ini:

Apache --- mod_security --- PHP --- greensql --- MySQL

Paket instalasi untuk OpenSUSE dalam bentuk binary (RPM) sudah tersedia di situs greensql. Untuk menginstal-nya ketikkan:

rpm -ivh greensql-fw-0.9.4-12.1.i586.rpm

Ketika proses instalasi ada beberapa pertanyaan yang harus diisi terkait dengan username dan password untuk database greensql.

greensql akan berjalan sebagai service pada port 3305. Pastikan service greensql berjalan ketika start-up (gunakan Yast2). greensql hanya menerima koneksi via TCP/IP, tidak menerima koneksi via socket. Nantinya setting koneksi di senayan untuk port diarahkan dari 3306 (MySQL) langsung ke 3305. Host nya diubah dari localhost ke 127.0.0.1.

Untuk memudahkan memonitor trafik sql, install juga greensql console. Merupakan aplikasi berbasis web (PHP) yang melihat alert trafik, meng-allow trafik, mengamati log, dan lain-lain. Tinggal ekstrak greensql-console ke web document root. Sesuaikan konfigurasi database dengan meng-edit file config.php.

Pada beberapa server dengan setting keamanan PHP tinggi, default instalasi greensql-console akan bermasalah karena beberapa file processing instruction PHP-nya tidak lengkap (hanya <?, bukan <?php ). Versi greensql-console yang sudah saya patch dan saya tambahkan fitur pembatasan akses berdasarkan port dan IP bisa didownload di http://perpustakaan.diknas.go.id/download/greensql-console.0.4.4-patched.tar.gz. Silahkan baca file notes.txt untuk detail perubahannya.

Instalasi Senayan

Memindahkan Senayan ke server lain sebenarnya mudah saja. Cukup kopi folder senayan yang berada di bawah web document root (dengan asumsi setting default) dan dump data MySQL untuk database Senayan. Setelah di kopi ke server opac, buat database Senayan di server opac. Login ke MySQL console sebagai user yang punya akses untuk membuat database dan user, serta memberikan pembatasan akses.

mysql> CREATE DATABASE senayandb;
mysql> GRANT SELECT ON senayandb.* TO 'senayanuser'@'localhost' IDENTIFIED BY 'rahasia';


Perintah pertama membuat database dengan nama senayandb. Perintah kedua memberikan HANYA akses SELECT ke database “senayandb” untuk user dengan nama “senayanuser” dan dengan password “rahasia”. Karena OPAC di Senayan hanya membutuhkan akses SELECT ke database, maka seandai ada hacker yang berhasil melewati pengamanan di mod_security dan greensql, dia tidak bisa melakukan akses tulis.

Sekarang import dump data MySQL (sebagai user yang punya hak untuk insert data):
shell> mysql -u root -p senayandb < senayandata.sql

Kemudian kopi folder senayan di web document root. Berikan akses agar web server bisa menulis ke folder “files” dan “images”. Edit file sysconfig.inc.php dan ubah setting koneksi ke MySQL, kira-kira menjadi seperti ini:

define('DB_HOST', '127.0.0.1');
define('DB_PORT', '3305');
define('DB_NAME', 'senayandb');
define('DB_USERNAME', 'senayanuser');
define('DB_PASSWORD', 'rahasia');


Untuk meningkatkan keamanan, hapus folder admin yang terdapat didalam folder Senayan karena OPAC tidak membutuhkannya.

Akses lebih cepat dengan halaman statik

Untuk mempercepat akses halaman utama, usahakan agar user tidak mengakses file index.php secara langsung ketika pertama kali mengakses OPAC. Buatlah halaman HTML statik. Ada banyak cara yang bisa digunakan, salah satunya dengan menggunakan program lynx (browser berbasis teks). Jalankan perintah (diasumsikan sedang berada di server opac, baik langsung maupun remote):

shell> lynx -source http://localhost/senayanopac/index.php > /srv/www/htdocs/senayanopac/index.html

(Pada OpenSUSE, web document root berada pada “/srv/www/htdocs”).
Jadi nanti ketika user berkunjung, diarahkan ke file index.html yang diakses lebih cepat karena berupa HTML statik.

Update data berkala

Update di set setiap jam server perpustakaan melakukan sinkronisasi dengan server opac. Agar aman transfer data dilakukan dengan protokol ssh. Untuk itu ada beberapa hal yang harus dilakukan.

Membangun login non-interaktif

Agar server perpustakaan bisa meng-update data di server opac, server perpustakaan harus bisa melakukan login ke server opac secara non-interaktif. Untuk itu server opac harus menyimpan informasi public key dari server perpustakaan.

Pada server perpustakaan (diasumsikan berada pada root directory), lakukan:
shell> ssh-keygen

Akan tercipta dua file pada direktori “.ssh”. Yaitu id_rsa dan id_rsa.pub. File id_rsa.pub nanti akan di copy ke direktori .ssh pada server opac dan diberinama authorized_keys.
shell> scp .ssh/id_rsa.pub hendro@yyy.yyy.yyy.yyy:.ssh/authorized_keys
yyy.yyy.yyy.yyy adalah alamat IP atau nama host server opac. “hendro” adalah username untuk login ke server opac. Setelah ini setiap kali hendak melakukan login dari server perpustakaan ke server opac, tidak akan ditanyakan username dan password lagi.

Membuat skrip update pada server perpustakaan

Buat direktori output_dir yang akan dijadikan tempat menampung file-file yang akan dikopi ke server opac. File dan direktori yang akan di kopi ke server opac adalah:
  1. File berisi dump data sql. Lakukan dengan program mysqldump dengan menggunakan user database yang punya hak akses untuk melakukan aksi dump data.
  2. Direktori images dan files yang berada di direktori Senayan.
Sebelumnya buat direktori “output_dir” yang akan menampung hasil dari proses dump data sql dan copy direktori images dan files. Kemudian buat file “updatesenayan.sh” dan masukkan baris-baris berikut ini (diasumsikan nama direktori senayan di server perpustakaan adalah “libsenayan”):

#!/bin/sh
/usr/bin/mysqldump -u root --password='rahasiadong' senayandb > /home/hendro/output_dir/senayan.sql
cp -R /usr/local/httpd22/htdocs/libsenayan/files /home/hendro/output_dir/
cp -R /usr/local/httpd22/htdocs/libsenayan/images /home/hendro/output_dir/
rsync -e ssh -a -z /home/hendro/output_dir hendro@118.98.232.10:/home/hendro/


Baris kedua adalah sintak untuk melakukan dump data sql dengan mysqldump. Opsi --password digunakan agar proses bisa dijalankan non-interaktif. Outputnya disimpan dalam direktori output_dir dan diberinama “senayan.sql”.
Baris ketiga dan keempat meng-copy folder “images” dan “files” dan menyimpan ke direktori output_dir.
Baris keempat melakukan proses sinkronisasi dengan program program rsync, melalui protokol ssh (secure connection). Folder yang disinkronkan adalah folder output_dir.
Jangan lupa, pastikan file updatesenayan.sh diberi file permission untuk eksekusi (chmod 700).

Untuk menjalankannya secara periodik otomatis, gunakan cron di Linux. Ketikkan “crontab -e”, tekan i (masuk ke insert mode), ketikkan:
59 * * * * /home/hendro/cron_script/updatesenayan.sh
atau
0 * * * * /home/hendro/cron_script/updatesenayan.sh

Hasilnya sama saja, menjalankan file updatesenayan.sh setiap 60 menit sekali. Untuk keluar dan menyimpan dari editor crontab, tekan escape (Esc), titik dua (:), w dan q (wq), kemudian Enter.

Membuat skrip update pada server opac

Hampir sama dengan skrip updatesenayan.sh pada server perpustakaan, yang dilakukan pada server opac adalah sebaliknya. Hanya saja proses dijalankan oleh user yang mempunyai akses tulis ke database senayandb dan ke web document root (direktori senayanopac).  Diasumsikan nama direktori senayan di server perpustakaan adalah “senayanopac”.

#!/bin/sh
/usr/bin/mysql -u root –password='rahasiadong' senayandb < /home/hendro/output_dir/senayan.sql
cp -R /home/hendro/output_dir/images /srv/www/htdocs/senayanopac/
cp -R /home/hendro/output_dir/files /srv/www/htdocs/senayanopac/
lynx -source http://localhost/senayanopac/index.php > /srv/www/htdocs/senayanopac/index.html


Jangan lupa masukkan ke cron dengan cara seperti pada server perpustakaan.

Selamat mencoba! :)


¶ Tulisan ini diposting ulang tanpa perubahan tanpa penyuntingan teks , teks asli diarsipkan dari Blog Multiply Pak Hendro Wicaksono , Arsip Multiply diakses pada 25 Oktober 2016
¶ Sumber Foto https://mobile.facebook.com/photo.php?fbid=10154309756769538 diakses pada 3 Oktober 2018