Thursday, September 29, 2016

Inotify Cron (InCron) untuk membangun Sistem Reaktif di Ubuntu 14.04

Pendahuluan

Sebuah sistem reaktif adalah sistem yang peka (aware) dengan sebuah kejadian dari luar (external event). Sebagai contoh:
  1. Pernahkah kita menginginkan sebuah sistem yang dapat mengamati sebuah usaha penetrasi (hijacking) dengan mempelajari pola serangannya (misalnya bruteforcing) kemudian mengambil tindakan atas usaha tersebut misalnya memasukkan intruder tersebut di daftar blacklist, atau menutup sementara layanan tersebut untuk domain atau network tersebut?
  2. Memasukkan file melalui layanan file transfer (FTP, SFTP atau LFTP) dan setelah file tersebut selesai ditransfer, file tersebut langsung di-rename atau di-move pada directory public dengan diatur permisinya sedemikian rupa sehingga file tersebut dapat langsung dapat diakses orang banyak (public).
  3. Mengamati perubahan sebuah file/ direktori yang seharusnya TIDAK boleh dirubah tanpa seijin administrator, seperti file /etc/sudoers atau /etc/passwd atau /home/user/penelitian.docx. Sehingga jika "akan" ada perubahan oleh user non administrator, sistem dapat langsung memberitahu (lewat SMS atau e-mail, atau membunyikan alarm atau melakukan backup file tersebut).
  4. Mengamati matinya layanan utama (primary service) dan secara otomatis membangkitkan server sementara (temporary server) sehingga mengurangi waktu mati (downtime) sebuah layanan.
  5. Dan sebagainya.
Cukup banyak hal yang dapat dilakukan dan dimudahkan dengan sistem reaktif seperti ini. Istilah lain otomatisasi.


Teori

Di sistem operasi linux, kita mengenal cron job sebagai akronim dari chronograph. Cron job adalah sebuah sistem penjadwalan pekerjaan dimana kita bisa mengatur kapan sebuah "kegiatan"  dilakukan. Misalnya jadwal untuk restart sistem secara berkala, update patch, backup dan maintenance database dan sebagainya, sehingga kita tidak perlu melakukannya secara manual yang kadang lupa.
Permasalahan pada cron job adalah sebuah pekerjaan dilakukan menggunakan time based (berbasis waktu), misalnya sistem perawatan database (analyze dan vacuum) kita jadwal setiap bulan tanggal 1 setiap bulan jam 2 pagi. Proses backup data kita laksanakan setiap 6 bulan (per semester) jam 2 pagi dimana sistem biasanya paling tidak sibuk. Dan seterusnya.

Cron job sangat efektif untuk pekerjaan berbasis waktu, tetapi tidak berbasis kejadian (event based). Misalnya kita punya prosedur pengecekan hidup atau mati sebuah layanan yang dilakukan setiap hari pada jam 13.30. Apabila sistem ditengarai mati (misalnya RTO saat di-ping), maka nyalakan sistem pambantu (backup server). Nah disini timbul permasalahan baru. Apabila layanan server mati pada pukul 13.31. (satu menit setelah sistem melakukan pengecekan terakhir), maka sistem backup baru hidup jam 13.30 di hari berikutnya. Artinya down time-nya 23 jam 59 menit!

Solusi yang bisa dilakukan adalah mempercepat proses pengecekan itu misalnya pengecekan dilakukan per menit (waktu terpendek yang bisa dilakukan oleh cron job). Tetapi hal ini memaksa sistem terus menerus melakukan pekerjaan tiap menit!. Sistem menjadi sibuk (karena melakukan rutin pengecekan) dan TETAP saja down time-nya bisa 59 detik.

Event State

Jauh lebih sederhana jika kita memiliki sistem yang reaktif terhadap perubahan state sebuah kejadian yang dijelaskan sebagai berikut:

Saat event state (X) sistem bernilai true maka dibangkitkan sebuah Event E. Pemodelan kondisi X saat Event E di-generate saat context state bernilai true.
Event E berlangsung dalam durasi waktu T yang diilustrasikan pada gambar berikut:
 Gambar 1. Event State

Delta Waktu (T2-T1) adalah waktu dimana sebuah kejadian berlangsung. Misalnya kita mengamati sebuah aktifitas perpindahan file dari satu folder ke folder lainnya. Delta T adalah waktu yang diperlukan dari saat mulai proses perpindahan hingga file tersebut "completely moved".

Sebuah event memiliki sebuah proses aktivasi dan de-aktivasi. Aktivasi sebuah event akan menyebabkan kondisi "sedang berada" (at) bernilai true atau dengan kata lain, proses aktivasi dan de-aktivasi akan merubah kondisi event dari status sebelum (before), sedang (at) atau setelah (after). Hal ini perlu dilakukan pada sequential event  sebagai "tanda" event berikutnya bisa dikerjakan.

Ini berarti sebuah event dapat memiliki 3 kemungkinan kondisi yaitu:
  1. Before (T1)
  2. At (T1<T<T2)
  3. After (T2)
Contoh:
Sebuah file A akan diamati Event State-nya:
  1. Saat file A tersebut dibuka.
  2. Saat file A tersebut dimodifikasi.
  3. Saat file A tersebut disimpan.
Inotify Cron

Incron atau inotify cron adalah software (service lebih tepatnya) pengembangan dari software cron biasa. Pada dasarnya kedua jenis cron job ini (cron dan incron) adalah sebuah subsistem pada kernel Linux yang digunakan untuk melakukan task secara otomatis dengan kondisi tertentu. Letak perbedaannya adalah: inotify cron bertindak terhadap perubahan dari file system (event based), sedangkan cron bertugas untuk penjadwalan yang memungkinkan eksekusi sebuah aksi dalam interval waku tertentu. 

Incron menyediakan cara sederhana bagaimana memecahkan banyak kejadian dengan banyak solusi. Keadaan disini dimaksud dengan jenis event pemicu dijalankannya aksi, karena setiap kejadian yang terjadi di file system merupakan pekerjaan untuk incron. Sedangkan solusi pengerjaan job menggunakan perintah-perintah monitoring yang didukung oleh incron, seperti monitoring terhadap manipulasi file.

Metode-metode dalam Incron

Incron memiliki metode sebagai berikut:


Metode   Event Trigger
IN_ACCESS  File/ Folder yang diamati sedang diakses.
IN_ATTRIB  Perubahan Metadata pada sebuah File/ Folder yang diamati (read/write/execute).
IN_CLOSE_WRITE  File/ Folder yang diamati selesai ditulis dan selesai di-save.
IN_CLOSE_NOWRITE  File/ Folder yang diamati dibuka tetapi tidak untuk ditulis dan selesai di-save.
IN_CREATE  File/ Folder yang diamati selesai dibuat.
IN_DELETE  File/ Folder yang diamati selesai dihapus.
IN_DELETE_SELF  File/ Folder yang diamati selesai dihapus di dirinya sendiri.
IN_MODIFY  File/ Folder yang diamati sedang di-edit.
IN_MOVE_SELF  File/ Folder yang diamati selesai dipindahkan di dirinya sendiri.
IN_MOVED_FROM  File/ Folder selesai dipindahkan dari tempat yang sedang diamati.
IN_MOVED_TO  File/ Folder selesai dipindahkan ke tempat yang sedang diamati.
IN_OPEN  File/ Folder yang diamati sedang dibuka.

Aturan Penulisan:
Aturan penulisan yang diberikan untuk menjalankan aksi tertentu adalah sebagai berikut:

direktori_yang_diamati     INCRON_METHOD     aksi_yang_dijalankan

misalnya:
/home/haruno/public/ IN_CLOSE_WRITE sudo chmod 777 -R /home/haruno/public/

Implementasi

Operating System yang saya gunakan untuk menjalankan program incron ini adalah Ubuntu 14.04 64 bit.

1. Tahapan Instalasi

Untuk instalasi layanan incron pada OS Ubuntu 14.04 cukup sederhana:
# apt-get install incron



Gambar 2: Instalasi Incron

2. Tahapan Konfigurasi

Setelah proses instalasi, tahapan berikutnya adalah mengijinkan siapa yang boleh dan tidak boleh menjalankan layanan incron ini. File yang digunakan untuk konfigurasi adalah:
  • /etc/incron.allow
  • /etc/incron.deny
Jika kita sudah memiliki whitelist dan blacklist user, kita bisa atur user yang bisa melakukan incron dari daftar ini dengan mengaturnya di /etc/incron.conf.
Contoh: Kita tambahkan root untuk bisa melakukan incron
# echo root >> /etc/incron.allow
Gambar 3: User yang dapat menjalankan Incron

3. Menambahkan Aturan incron Baru
Setelah kita daftarkan user "root" ke dalam /etc/incron, kita dapat menambah aturan incron baru dengan perintah:
# incrontab -e

Nah disini kita terapkan metode di atas yang tepat untuk memicu aksi apa yang diharapkan.

Contoh: kita akan membuat permisi untuk setiap file yang datang ke watched directory (misalnya: direktori /home/haruno/public/) dengan permisi 777. Perintah yang diberikan adalah:

/home/haruno/public IN_CLOSE_WRITE sudo chmod 777 -R /home/haruno/public/
4. Melihat Table incron
Kita dapat melihat table incron dengan perintah:
# incrontab -l

Gambar 4: Tabel Aturan Incron
5. Memperbarui table incron
Setelah aturan baru dibuat, jangan lupa layanan incron di direstart agar aturan baru tersebut dapat berjalan.
# /etc/init.d/incron restart

Testing

Untuk menguji apakah aturan tersebut berjalan atau tidak, kita coba copy sebuah file ke directory /home/haruno/public seperti pada gambar berikut:



Gambar 5:Pengujian Incron


Penggunaan incron ini bisa sangat luas asal kita dapat berimajinasi dan berinovasi.

Selamat Mencoba