Audit Log dalam FreeBSD

Log Sistem

FreeBSD menyediakan logger sistem yaitu syslogd untuk mengelola log. Berkas konfigurasi syslogd ada di /etc/syslog.conf. Konfigurasi ini mengendalikan apa yang syslogd lakukan dengan entri log ketika entri log diterima. Parameter fasilitas mendeskripsikan subsistem mana yang menghasilkan pesan, misalnya kernel atau suatu daemon, dan parameter level mendeskripsikan kondisi dari kejadian yang terjadi.

Nama fasilitas Program apa yang direpresentasikan
AUTH Sistem otorisasi: login(1), su(1), getty(8), dan sebagainya.
AUTHPRIV Sama seperti AUTH, tapi log disimpan ke sebuah berkas yang hanya bisa dibaca oleh pengguna terpilih.
CRON Daemon cron: cron(8).
DAEMON Daemon sistem, seperti routed(8), yang tidak disediakan secara eksplisit oleh fasilitas lain.
FTP Daemon ftp: ftpd(8), tftpd(8).
KERN Pesan yang dihasilkan oleh kernel. Pesan ini tidak dapat dihasilkan oleh proses pengguna apapun.
LOCAL0-LOCAL7 Disediakan untuk penggunaan lokal.
LPR Sistem line printer spooling: lpr(1), lpc(8), lpd(8), dan lain-lain.
MAIL Sistem surat-menyurat.
NEWS Sistem berita jaringan.
SECURITY Subsistem keamanan.
SYSLOG Pesan yang dihasilkan secara internal oleh syslogd(8).
USER Pesan yang dihasilkan oleh proses pengguna yang acak (random user processes).
UUCP Sistem uucp. ipfw(4).
* Semua fasilitas atau program kecuali MARK.
MARK Fasilitas khusus yang digunakan oleh syslogd.
Nama level Apa yang direpresentasikan
EMERG Kondisi panik, biasanya di-broadcast ke semua pengguna.
ALERT Sebuah kondisi yang harus diperbaiki sesegera mungkin, seperti basis data sistem rusak.
CRIT Kondisi kritis, misalnya kesalahan pada perangkat keras.
ERR Kesalahan-kesalahan.
WARNING Pesan peringatan.
NOTICE Kondisi yang bukan merupakan kondisi salah, namun kemungkinan harus ditangani secara khusus.
INFO Pesan informatif.
DEBUG Pesan-pesan yang berisi informasi yang umumnya digunakan ketika men-debug program.
NONE Level khusus untuk menonaktifkan fasilitas.

Dalam FreeBSD, biasanya berkas-berkas log berada di direktori /var/log. Namun kita dapat mengubahnya dalam berkas konfigurasi /etc/syslog.conf. Berkas konfigurasi ini berisi satu baris setiap aksinya, dimana sintaks untuk setiap baris adalah selector field yang diikuti oleh action field. Sintaks untuk selector field adalah fasilitas.level yang berarti pesan log diambil dari fasilitas pada tingkat level atau lebih tinggi. Berikut contoh berkas konfigurasi /etc/syslog.conf:

Rotasi Log

Dalam FreeBSD, newsyslog digunakan untuk mengelola berkas-berkas log. Program bawaan ini secara periodik merotasi dan mengkompresikan berkas log, dan secara opsional membuat berkas log yang hilang dan memberi tahu program ketika berkas log dipindahkan. Dalam konfigurasi default, newsyslog berjalan setiap jam. Berkas konfigurasi newsyslog adalah /etc/newsyslog.conf, yang isinya seperti berikut:

Setiap baris dimulai dengan nama dari log yang dirotasi, diikuti dengan pemilik dan grup untuk berkas log yang dirotasi. Kolom mode untuk menetapkan perizinan pada berkas log dan kolom count untuk mengatur berapa banyak berkas rotasi log harus disimpan. Kolom size dan when untuk mengatur kapan newsyslog merotasi berkas. Berkas log dirotasi ketika ukurannya lebih besar dari size (dalam KB) atau ketika waktu dalam when sudah lewat. Ada dua format waktu:

  1. Format waktu ISO 8601 (dengan prefiks ‘@’):[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]
  2. Format waktu hari, minggu, bulan (dengan prefiks ‘$”):[Dhh], [Ww[Dhh]], dan [Mdd[Dhh]]

Kolom flags untuk memberikan instruksi lebih lanjut, misalnya bagaimana mengkompresikan berkas rotasi atau untuk membuat berkas log jika hilang. Dua kolom terakhir adalah opsional, yaitu untuk menspesifikasikan nama berkas Process ID (PID) dari sebuah proses dan nomor sinyal untuk dikirim ke proses tersebut jika berkas dirotasi.

Log Aplikasi

Aplikasi Berkas konfigurasi log Berkas log
Apache /usr/local/etc/apache24/httpd.conf /var/log/httpd-access.log /var/log/httpd-error.log
MySQL /usr/local/my.cnf /var/db/mysql/hostname.err
WordPress (custom) /usr/local/etc/apache24/Includes/wordpress.conf (custom) /var/log/wordpress-access_log /var/log/wordpress-error_log

Contoh Log Apache /var/log/httpd-access.log:

Contoh Log Apache /var/log/httpd-error.log:

Contoh Log MySQL /var/db/mysql/foo.err:

Contoh Log WordPress /var/log/wordpress-access_log:

Contoh Log WordPress /var/log/wordpress-error_log:

Log pada WordPress

Tidak ada mekanisme log secara khusus untuk aplikasi WordPress, namun kita dapat memanfaatkan fasilitas log Apache untuk melakukan log WordPress. Pertama, buat sebuah VirtualHost. Buat berkas /usr/local/etc/apache24/Includes/wordpress.conf. Kemudian tulis baris-baris berikut:

  • DocumentRoot = lokasi berkas-berkas PHP/HTML WordPress
  • ServerName = nama domain tempat dimana VirtualHost ini merespon
  • ServerAlias = opsional – digunakan jika kita ingin VirtualHost ini merespon ke lebih dari satu nama domain
  • ErrorLog adan CustomLog = fasilitas log dari Apache

Kemudian ubah berkas /usr/local/etc/apache24/httpd.conf, beri tanda komentar pada baris-baris berikut:

sehingga menjadi terlihat seperti berikut:

Hidupkan kembali Apache:

service apache24 restart

 

Log akses pengguna WordPress

WordPress menyediakan plugin Simple History [5] untuk melalukan beberapa log, termasuk log akses pengguna. Ada juga plugin lainnya seperti WP Security Audit Log [5]. Cari plugin ‘Simple History’ pada menu Search Plugins kemudian klik Install Now:

Jika menemukan pesan ‘Abort class-pclzip.php: Missing zlib extensions” seperti gambar di bawah, artinya instalasi gagal karena modul php zlib belum terinstal (secara default tidak masuk dalam instalasi php). Modul php zlib dapat diinstal menggunakan port /usr/ports/archivers/php56-zlib. Setelah modul php zlib diinstal, instalasi plugin Simple History sudah bisa dilakukan:

Setelah instalasi berhasil, aktivasikan plugin Simple History seperti berikut:

Simple History akan menampilkan pesan berapa banyak kejadian di hari itu:

Sayangnya, dalam WordPress kita tidak dapat melihat informasi kejadian apa saja yang dilog oleh Simple History. Namun kita dapat melihatnya dalam basis data wordpress sebagai berikut:

Tabel wp_simple_history menyimpan setiap kejadian dengan id yang berbeda, waktu kejadian, level kejadian (seperti level pada syslogd), pesan (kejadiannya, misalnya log in/log out), dan sebagainya. Tabel wp_simple_history_contexts menyimpan informasi detil kejadian, history_id dalam tabel ini mengacu ke id dalam tabel wp_simple_history.

Melewatkan log aplikasi ke Syslog

Log Apache dapat dilewatkan ke syslog [2], begitu juga log MySQL (sejak versi 5.1.20) [4]. Log akses pengguna WordPress juga dapat dilewatkan ke syslog dengan mengubah kode fungsi log dalam plugin Simple History. Keuntungan dan kerugiannya adalah sebagai berikut:

Keuntungan Kerugian
Keuntungan sentralisasi log secara umum yaitu kemudahan dalam manajemen log. Kerugian sentralisasi log secara umum yaitu single point of failure.
Jika ada yang menyerang aplikasi, penyerang tidak bisa menghapus jejaknya (lognya). Harus ada konfigurasi tambahan agar log juga ter-backup secara lokal (piped logging)
Tidak perlu menghentikan dan menghidupkan kembali aplikasi untuk sekadar mengkompresikan log.

 

Konfigurasi log Apache ke Syslog

Buat berkas /usr/local/bin/apache_syslog yang berisi kode perl berikut. Kode perl ini intinya memanggil fungsi openlog() untuk membuka koneksi ke syslog dan untuk menggunakan fasilitas local2, fungsi syslog() untuk mengirimkan log dengan level info atau lebih tinggi, dan terakhir fungsi closelog() untuk menutup koneksi.

Pastikan bahwa berkas /usr/local/bin/apache_syslog bersifat eksekutabel:

Kemudian instal p5-Sys-Syslog melalui port sysutils/p5-Sys-Syslog.

# cd /usr/ports/sysutils/p5-Sys-Syslog
# make install clean

Dalam berkas konfigurasi Apace /usr/local/apache24/httpd.conf ganti direktif ErrorLog dan CustomLog seperti berikut:

Arti dari baris tersebut adalah kita memerintahkan ErrorLog untuk dilewatkan ke Syslog dengan menggunakan fasilitas local1 dan memerintahkan CustomLog (log akses) untuk mengeksekusi kode perl yang sudah dibuat sebelumnya. Namun karena sebelumnya kita menggunakan VirtualHost untuk log pada WordPress, maka log akan disimpan ke berkas-berkas yang ditetapkan di VirtualHost. Oleh karena itu, kita nonaktifkan VirtualHost dengan risiko log pada /var/log/wordpress-access_log dan /var/log/wordpress-error_log tidak akan aktif lagi.

Tambahkan beberapa baris pada berkas konfigurasi Syslog /etc/syslog.conf sebagai berikut. Artinya log dengan fasilitas local1 (yang telah ditetapkan untuk ErrorLog) dan dengan level apapun akan disimpan dalam berkas /var/log/httpd-error1.log. Begitu pula log dengan fasilitas local2 (yang telah ditetapkan untuk CustomLog) dan dengan level apapun akan disimpan dalam berkas /var/log/httpd-access1.log.

Buat berkas-berkas log dengan perintah berikut:

# touch /var/log/httpd-error.log /var/log/httpd-access.log

Tambahkan baris-baris berikut pada berkas /etc/newsyslog.conf untuk menentukan rotasi log:

Hidupkan kembali syslogd dan apache24:

Berikut isi berkas log /var/log/httpd-access1.log:

Dan berikut isi berkas log /var/log/httpd-error1.log:

 

Konfigurasi log MySQL ke Syslog

Log pada MySQL secara default menggunakan fasilitas daemon, kita dapat menggantinya dengan fasilitas yang lain (local0-local7) agar tidak tercampur dengan log yang lain. Sayangnya fasilitas log pada MySQL di-hard-code dalam mysqld_safe. Oleh karena itu kita harus melakukan beberapa perubahan dalam berkas /usr/local/bin/mysqld_safe sebagai berikut. Intinya adalah kita mendefinisikan fasilitas log sebagai variabel syslog_facility (yang nilai defaultnya daemon) sehingga kita dapat menetapkan nilainya sesuka hati.

Sekarang, kita perintahkan mysqld_safe untuk melewatkan log ke Syslog dan mengganti fasilitas log menjadi local3 dengan menambahkan tiga baris berikut pada berkas konfigurasi MySQL /usr/local/my.cnf. Kemudian mulai/hidupkan mysqld_safe dengan perintah berikut:

# mysqld_safe --defaults-file=/usr/local/my.cnf

Tambahkan baris berikut berkas konfigurasi Syslog /etc/syslog.conf. Baris ini berarti bahwa log dengan fasilitas local3 (yang telah ditetapkan untuk log MySQL) dan dengan level apapun akan disimpan dalam berkas /var/log/mysqld.log.

Buat berkas log dengan perintah berikut, kemudian hidupkan kembali syslogd.

# touch /var/log/mysqld.log

Berikut isi dari berkas log /var/log/mysqld.log:

 

Konfigurasi log akses pengguna WordPress ke Syslog

Dengan mengetahui fakta bahwa terdapat fungsi openlog(), syslog(), dan closelog() dalam PHP (PHP 4 dan PHP 5) mirip seperti pada kode perl sebelumnya, kita dapat menyelipkan kode tersebut ketika plugin Simple History melakukan kueri insert ke basis data. Fungsi dimana plugin Simple History melakukan kueri insert ke basis data adalah fungsi log() dari kelas SimpleLogger dalam berkas /usr/local/www/apache24/data/wp-content/plugins/simple-history/loggers/SimpleLogger.php. Untuk jaga-jaga, salinan berkas SimpleLogger.php.old dibuat sebelum melakukan perubahan.

Dalam fungsi log() ada dua kali kueri insert karena plugin Simple History memiliki dua tabel yaitu tabel wp_simple_history dan tabel wp_simple_history_contexts. Agar tidak terjadi redudansi log, penyelipan kode syslog() dilakukan di satu tempat saja yaitu setelah kueri insert ke tabel wp_simple_history_contexts karena tabel ini menyimpan informasi detil setiap kejadian. Kode yang ditambahkan adalah yang diberi komentar “TAMBAHKAN …” sebagai berikut.

Dalam kode di atas terlihat bahwa fasilitas local0 yang ditetapkan. Tambahkan baris berikut berkas konfigurasi Syslog /etc/syslog.conf. Baris ini berarti bahwa log dengan fasilitas local0 (yang telah ditetapkan untuk log akses pengguna WordPress) dan dengan level apapun akan disimpan dalam berkas /var/log/wordpress.log.

Buat berkas log dengan perintah berikut, kemudian hidupkan kembali syslogd.

# touch /var/log/wordpress.log

 

Berikut isi dari berkas log /var/log/wordpress.log. Kita dapat menentukan pesan apa yang ingin ditampilkan dalam log agar mudah untuk dibaca. Namun karena keterbatasan waktu, pesan yang ditampilkan adalah semua key:value kejadian yang disimpan dalam tabel wp_simple_history_contexts sehingga ada nilai value yang NULL atau redundan. Intinya adalah bahwa log akses pengguna WordPress yang disimpan dalam basis data terbukti dapat dilewatkan ke Syslog, yaitu dengan menyelipkan kode ke dalam plugin Simple History.

Remote Logging

Dalam FreeBSD, pengumpulan, penggabungan, dan rotasi berkas log tersentralisasi dapat dikonfigurasikan menggunakan syslogd dan newsyslog. Untuk mensimulasikan remote logging, kita dapat menggunakan dua jendela VMware, satu untuk mesin virtual server log dan satu untuk mesin virtual klien log. Misalkan server log yang bernama fooserver akan mengumpulkan informasi log untuk jaringan lokal. Klien log yang bernama foo akan dikonfigurasikan untuk mengirimkan informasi log ke server log. Kedua mesin virtual menggunakan sistem operasi FreeBSD 10.1.

Konfigurasi Server Log

Sebelum mengkonfigurasikan server log, perhatikan hal-hal berikut:

  1. Jika terdapat firewall antara server log dan klien log, pastikan bahwa ruleset firewall mengizinkan UDP port 514 untuk kedua klien dan server.
    Berikut adalah contoh ruleset firewall dari klien log foo (server log fooserver tidak dipasang firewall) dalam berkas /etc/pf.conf. Setelah dilakukan perubahan ruleset, jangan lupa bahwa ruleset harus dimuat agar dapat digunakan.
  2. Server log dan semua mesin klien harus memiliki entri dalam DNS lokal.
    Berikut adalah berkas /etc/hosts pada server log fooserver: Dan berikut adalah berkas /etc/hosts pada klien log foo:

Pada server log fooserver, ubah /etc/syslog.conf untuk menspesifikasikan nama klien yang mengirimkan entri, fasilitas log yang digunakan, dan nama log untuk menyimpan log klien. Kemudian hidupkan kembali syslogd. Berikut contoh ditambahkannya hostname foo, log semua fasilitas, dan simpan entri log dalam /var/log/logfoo.log:

Kemudian konfigurasikan /etc/rc.conf dan hidupkan kembali jaringan:

Entri pertama untuk memulai syslogd ketika sistem boot. Entri kedua untuk mengizinkan entri log dari klien foo, meningkatkan verbosity dari pesan log (-vv), dan mengizinkan log dari banyak klien (-a). Terakhir buat berkas log:

# touch /var/log/logfoo.log

Konfigurasi Klien Log

Selain mengirimkan entri log ke server log fooserver, klien log foo juga menyimpan entri log secara lokal. Setelah server log dikonfigurasi, ubah /etc/rc.conf pada klien log sebagai berikut kemudian hidupkan kembali jaringan:

Entri pertama untuk memulai syslogd ketika sistem boot. Entri kedua untuk mencegah klien foo menerima entri log dari klien lain (-s) dan meningkatkan verbosity dari pesan log (-vv). Kemudian, definisikan server log fooserver dalam /etc/syslog.conf klien foo. Dalam contoh berikut, semua fasilitas log dikirim ke server log fooserver. Setelah perubahan disimpan, jangan lupa untuk menghidupkan kembali syslogd.

Untuk menguji apakah pesan log berhasil dikirim melalui jaringan, gunakan logger(1) pada klien untuk mengirimkan sebuah pesan ke syslogd. Pesan ini seharusnya muncul dalam /var/log/messages pada klien log foo dan /var/log/logfoo.log pada server log fooserver.

# logger "halooooo fooserver"

Berikut isi dari berkas log /var/log/logfoo.log dalam server log fooserver:

Referensi:

  1. https://www.freebsd.org/doc/en/books/handbook/configtuning-syslog.html
  2. http://www.blissfulidiot.com/2011/09/if-you-need-to-use-syslog-to-send.html
  3. http://archive.oreilly.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html
  4. http://shinguz.blogspot.com/2010/01/mysql-reporting-to-syslog.html
  5. https://wordpress.org/plugins/wp-security-audit-log/screenshots/

Leave a Reply

Your email address will not be published. Required fields are marked *