Join MultiplyOpen a Free ShopSign InHelp
MultiplyLogo
SEARCH

Hendro Wicaksono Personal Website

Journal

Blog EntryMar 30, '12 8:14 PM
for everyone
Buat teman2 developer semua, untuk keragaman coding, beberapa hal ini perlu diperhatikan:
1. Indensi tidak menggunakan tab tetap spasi. Sebesar 4 karakter.
2. Penempatan kurung kurawal pada class dan fungsi pada baris baru. Contoh:

class slims
{
    ............
    ............
}

function public slims_get_biblio ()
{
    ............
    ............
}

3. Sedangkan penempatan kurung kurawal pada logic syntax seperti if, while, foreach, dll, kurawal pertama tidak terletak pada baris baru. Contoh:

if ($kata_orang_tentang_saya == 'ganteng') {
    lakukan ("kasih permen");
} else {
    cuekin ();
}

while ($kata_orang_tentang_saya == 'jelek') {
    lakukan ("tanya lagi");
}

4. Kemudian ketika menggunakan class atau fungsi, sebaiknya dikasi jarak satu spasi kurung memasukkan value-nya. Contoh:

preg_replace ("/jelek/", "ganteng", $kata_orang_tentang_saya);

lebih enak dibaca dibanding dengan:

preg_replace("/jelek/","ganteng",$kata_orang_tentang_saya);

Okeh sekalian dulu masukannya. Terima Kasih

Blog EntryFeb 21, '12 6:18 AM
for everyone
Oke saya punya kasus begini. Saya ingin ketika user login, ditampilkan daftar artikel yang hanya diinput oleh user tersebut. User tersebut tidak bisa mengedit dokumen yang bukan hak nya. Oke begini caranya. Note: ingat modul views dan cck diasumsikan sudah terinstall ya.

1. membatasi user hanya bisa mengedit node yang diinput olehnya. Berarti mainin permission di drupal.

2. Membuat daftar artikel (node) yang diinput oleh user yang bersangkutan. Jawabannya ada di http://stackoverflow.com/questions/2569867/drupal-views-display-recent-nodes-created-by-user-on-profile-page. Untuk mudahnya saya kutip disini:
 

ok, the answer involves creating a drupal view, so you will need the views module and although simple, the answer is lengthy. please bear with me through this... :) (i am actually doing this on a test site as i write the instructions, to make sure i dont miss anything...)

i assume that you know how to download and install the views module. make sure you also enable the views-ui module.

  1. go to site building->views->add.
  2. put "recent_posts_by_user" for view name, "recent posts by user" for description and "node" for view type. hit next.
  3. under the "default" view type, on the "fields" block, hit the "+" sign.
  4. under "groups" select node, then check the "node type", "node title" and "node updated date" fields. hit the "add" button below the list.
  5. under basic settings block (on the left), click on the "10" for "items for display" and change to "5" or however many items you want per page, and hit "update"
  6. under "use pager", click on "no" and "full pager" or "mini pager" and hit "update" again.
  7. under style, hit "unformatted" and change it to "table" set all fields to sortable, then choose the "updated date" as "default sort", then on "default sort order", select "descending". hit update.
  8. hit "save" to save your progress thus far.

default view is done. YAY! lets add the block

  1. now on the drop-down that says "page", select "block" and hit "add display".
  2. hit "arguments" (block title on the center of the screen)
  3. hit "override" and "update"
  4. hit the "+" sign to the right of "arguments"
  5. on the "groups" drop down, select "user" and select "user id". hit "add"
  6. under "Action to take if argument is not present", select the last option "provide default argument", select "user id from url" and check "Also look for a node and use the node author"
  7. under "validator", select "user" and "Allow both numeric UIDs and string usernames"
  8. under "Action to take if argument does not validate" select "hide view/page not found (404)"
  9. hit "update" then "save"

view is created now lets make sure it shows up on the right pages.

  1. go to site building->blocks, search for the "recent posts by user" block and hit "configure"
  2. scroll all the way to the bottom and select "Show on only the listed pages." and put in "users/*" under the "pages" text area
  3. hit "save block"
  4. now find the "recent posts by user" block again and set it to "content bottom" region (or any other region your theme has available).
  5. hit "save blocks"

DONE! Not rocket-science, but lengthy process... drupal 6 views is so much better than drupal 5! :)

now go visit a user page http://site/users/username and see the table show up there!

hit me up if you still have questions about views.

enjoy


3. Setelah dua langkah diatas, user tersebut masih bisa melihat node orang lain meski tidak bisa mengedit. Untuk itu perlu sedikit ditambahkan coding di views di bagian header kemudian pilih tipe PHP (modul PHP Filter harus diaktifkan) dan isikan dengan:

<?php
$clu = explode ("/", $_GET['q']);
global $user;
if ($user->uid) {
    // User is logged in.
    if ($user->name != $clu[2]) {
        die ('Maaf ga boleh ya');
        # atau alternatif lainnya refer ke halaman index
        #header("location: ".$_SERVER['PHP_SELF']."");

    }

}
?>

Selamat mencoba :)

Blog EntryNov 20, '11 3:15 AM
for everyone
Saya termasuk pengguna modul custom_breadcrumbs 2.x di Drupal 6 karena dukungannya tidak hanya untuk node tetapi juga untuk views. Iya karena saya mostly pakai views untuk memformat bagaimana konten ditampilkan. Gawatnya, sampe tulisan ini dibuat, versi 2.x masih release candidate (http://ftp.drupal.org/files/projects/custom_breadcrumbs-6.x-2.0-rc1.tar.gz). Buggy pula dengan notifikasi kesalahan: user notice: The _custom_breadcrumbs_get_breadcrumb() function called token replacement with an array rather than a string for $text in /home/ropegdiknas/www/static/lamanbahasa/sites/all/modules/token/token.module on line 263.

Oke untuk mengatasinya:
1. Pastikan di komputer anda sudah terinstal git. (apt-get install git-core).
2. Clone repositori development custom_breadcrumbs: git clone --branch 6.x-2.x http://git.drupal.org/project/custom_breadcrumbs.git
3. masuk ke direktori: cd custom_breadcrumbs
4. Download patch-nya dari: https://drupal.org/files/invalid_use_of_token_replace-1327960-8.patch

5. Apply patch-nya: git apply -v [patchname.patch]
6. Kemudian lakukan commit:
git commit -a -m "Update patch by hendro"

7. Hapus folder modul custom_breadcrumbs (di sites/all/modules) lama dan ganti dengan yang baru.

Selamat mencoba! :)


Sekedar mendokumentasikan hasil kerja. Hardware SunFire X2200. Ram 4GB. OS Ubuntu Server 10.04. ditembak dengan command: "ab -n 1000 -c 5 https://hostku.domainku/aplikasi/".
Outputnya:

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking hostku.domainku (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Hiawatha
Server Hostname:        hostku.domainku
Server Port:            443
SSL/TLS Protocol:       TLSv1/SSLv3,AES256-SHA,2048,256

Document Path:          /aplikasi/
Document Length:        5076 bytes

Concurrency Level:      5
Time taken for tests:   123.424 seconds
Complete requests:      1000
Failed requests:        1
   (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Write errors:           0
Total transferred:      5484263 bytes
HTML transferred:       5076263 bytes
Requests per second:    8.10 [#/sec] (mean)
Time per request:       617.118 [ms] (mean)
Time per request:       123.424 [ms] (mean, across all concurrent requests)
Transfer rate:          43.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       14   18   1.0     18      31
Processing:   119  598 502.7    560    5598
Waiting:      119  597 502.7    559    5597
Total:        138  616 502.7    578    5616

Percentage of the requests served within a certain time (ms)
  50%    578
  66%    593
  75%    601
  80%    605
  90%    617
  95%    622
  98%    626
  99%   5543
 100%   5616 (longest request)



Tempohari saya mencoba melakukan instalasi Symfony pada Hiawatha Web Server berdasarkan petunjuk pada tutorial symfony disini. Lumayan jelas petunjuknya hanya saja masih berbasiskan Apache + modrewrite. Jika anda seperti saya, menggunakan Hiawatha web server, maka lakukan beberapa hal berikut ini. (Diasumsikan anda sudah melakukan instalasi Hiawatha seperti petunjuk disini)

I. VirtualHost

Pada tutorial terdapat petunjuk untuk setting konfigurasi Apache sebagai berikut:

# Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:8080

# This is the configuration for your project
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/sfprojects/jobeet/web"
  DirectoryIndex index.php
  <Directory "/home/sfprojects/jobeet/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
  <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

Penyesuaian pada hiawatha web server:
1. Edit file /etc/hiawatha/hiawatha.conf dan pada binding setttings, edit atau tambahkan baris:

Binding {
    Port = 8080
    MaxRequestSize = 20000
    MaxUploadSize = 20
}

2. Masih pada file /etc/hiawatha/hiawatha.conf, tambahkan baris berikut:

UrlToolkit {
    ToolkitID = symfony
    Match ^/index.php/.* Rewrite /index.php
    Match ^/frontend_dev.php/.* Rewrite /frontend_dev.php
    RequestURI exists Exit
    Match .* Rewrite /index.php
}

3. Buat file sites-available/symfonydev dan tambahkan baris berikut:

VirtualHost {
    Hostname = symfonydev
    WebsiteRoot = /home/sfprojects/jobeet/web
    Alias = /sf:/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
    StartFile = index.php
    TimeForCGI = 15
    UseFastCGI = PHP5
    UseToolkit = symfony
    ExecuteCGI = yes
    PreventCSRF = no
    ShowIndex = no
}

II. Update /etc/hosts

Edit pada file /etc/hosts dan tambahkan baris:

127.0.0.1    symfonydev

Sekarang semua telah beres. Silahkan ikuti tutorial untuk melakukan instalasi dan membangun aplikasi jobeet seperti pada tutorial disini. Untuk mengakses aplikasi dengan browser dengan alamat: http://symfonydev:8080 seperti pada gambar.

Selamat mencoba!




Selama ini di banyak tempat, implementasi SLiMS menggunakan web server apache. Jika gagal upload file biasanya karena mentok di setting php.ini: post_max_size dan upload_max_filesize. Tinggal perbesar angka kemudian Restart apache, masalah selesai. Ketika saya coba dengan web server Nginx dan Hiawatha, ternyata tidak cukup hanya dengan mengubah setting php.ini. Tetap muncul error semacam "413 Request Entity Too Large". Ternyata Disisi web server juga ada pembatasan.

Untuk nginx, buka file /etc/nginx/sites-available/default, dan dibawah baris "server {", tambahkan (ubah angka sesuai kebutuhan):

client_max_body_size 20M;

Kemudian restart nginx.

Untuk hiawatha, edit /etc/hiawatha/hiawatha.conf, kemudian cari konfigurasi Binding (yak betul, hiawatha bisa mengatur setting hingga per port, mantapkan!). Cari lah Binding untuk port yang akan diset (gampangnya cari baris "Binding {"). Kemudian tambahkan baris (ubah angka sesuai kebutuhan):

MaxRequestSize = 20000
MaxUploadSize = 20

MaxRequestSize dalam hitungan kilobyte, sedangkan MaxUploadSize dalam itungan megabyte. Jangan lupa restart hiawatha.

Selamat mencoba! :)


Hari ini saya coba install Wine di Ubuntu 10.10. Karena terlalu lama, shell window saya close. begitu mau install aplikasi lagi, muncul error "dpkg: status database area is locked by another process". Sudah di reboot, masalah tetap muncul. Solusinya:

1. reboot komputer
2. Jalankan: "sudo rm /var/lib/dpkg/lock"
3. Jalankan: "sudo dpkg --configure -a"

Selamat mencoba :)

Blog EntryJul 24, '11 6:12 PM
for everyone
Pertama, harus difahami bahwa di Unix/Linux semua device, folder, dll dianggap sebagai berkas. Karenanya untuk membuat ISO dari CD/DVD kita tinggal membaca device CD/DVD kemudian output langsung disimpan kedalam file dan diberi ekstensi ISO. Misalnya berkas device CD drive kita dikenali sebagai /dev/cdrom, maka cara membuat ISO nya (asumsi: CD/DVD yang hendak di buat image ISO sudah dimasukkan terlebih dahulu):

cat /dev/cdrom > namafile.iso

Lama proses tergantung ukuran file didalam CD/DVD. Kalau masih kurang yakin, silahkan cek MD5 dari device dan bandingkan dengan file iso:

md5sum /dev/cdrom
md5sum namafile.iso

Kalau semua berjalan lancar, harusnya output dari proses diatas akan men-generate karakter yang sama.

Selamat mencoba :)

Laptop yang digunakan adalah Lenovo X200. Distro yang digunakan Ubuntu (desktop). Rilis yang digunakan adalah 10.10 Maverick Meerkat, meskipun saat ujicoba (23-24 Juli 2011) rilis 11.04 (Natty Narwhal) sudah tersedia. Pertimbangannya karena laptop akan banyak digunakan untuk kebutuhan pekerjaan, bukan ujicoba fitur-fitur terbaru. Jadi sebaiknya gunakan 1 versi sebelumnya. Kalau utk kebutuhan server, ya gunakan ubuntu server versi LTS terakhir.

Instalasi dilakukan seperti biasa dan biasanya wifi tidak bisa digunakan. Untuk melihat detail hardware Wireless, coba jalankan command "dmesg | grep WiFi" atau "dmesg | grep eth" dan lain-lain yang memungkinkan. Intinya sih kita ingin mengetahui hardware nya apa. Karena di beberapa tempat, Wireless di Lenovo X200 ada yang menggunakan chip Atheros (pakai madwifi) atau Intel WiFi Link. Nah di laptop saya muncul informasi "Intel WiFi Link 5300".

Berikutnya bertanya-tanya ke Paman Google. Ketemulah halaman detail hardwarenya. Kemudian ketemu pula web Intellinuxwireless. Nah disinilah titik temunya bermula. Ada informasi bahwa "The iwlwifi driver has been merged into mainline kernel since 2.6.24". Coba cek di laptop dengan command "uname -a" kernel sudah 2.6.35, berarti aman. Tapi kudu compile ulang kernel? Haduh ga deh.

Baca-baca lagi, dapet lah link project Linux Wireless. Kemudian masuklah ke halaman download tarball nya. Karena di halaman tersebut dipasang anti hotlink, saya kesulitan download via browser. Akhirnya download pakai wget dengan perintah: "wget -c http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2". Kemudian ekstrak dengan perintah: "tar xvf compat-wireless-2.6.tar.bz2".

Berikutnya lakukan:
make
sudo make install
sudo make unload

Untuk lebih yakin, reboot komputer. Yang saya hadapi setelah reboot, wireless tetap ga nyala. Solusinya (yang semoga benar): matikan tombol switch dari off ke On atau On ke off kemudian On lagi. Tunggu beberapa saat. Harusnya semua sudah dikenali. Semoga bermanfaat :)

Dalam menggunakan drupal 6 biasanya ada dua modul tambahan yang biasanya saya tambahkan. Yaitu "views" dan "cck". Kalau sudah pakai dua modul tersebut biasanya modul-modul lainnya akan ditambahkan sesuai kebutuhan. Salah satunya adalah modul "date" untuk menambahkan jenis field tanggal di cck. Ribetnya pas mau ditampilkan node yang mengandung date via views, suka muncul statement "(All Day)" dibelakang tanggal. Sudah oprek2 bikin jenis date baru, locale, dll, ternyata tidak membantu.

Googling lah saya dengan keyword "how to remove "All Day" in drupal views date" ketemulah sebuah tips yang ga terlalu elegan (tidak memanfaatkan fitur hook nya drupal), tapi kalau sudah kepepet, dilakukan sajalah.

Pertama, masuklah kedalam folder "date" didalam modul "date". (sites/all/modules/date/date). Kemudian editlah file "date.theme", dan cari baris dengan kata-kata (sekitar baris nomor 273):

function theme_date_all_day_label() {
  return '('. date_t('All day', 'datetime') .')';
}


Ubah menjadi:

function theme_date_all_day_label() {
  #return '('. date_t('All day', 'datetime') .')';
  return '';
}

Jangan lupa disimpan. Seharusnya sekarang kata-kata "(All Day)" sudah tidak muncul kembali. Selamat mencoba!

Blog EntryJul 1, '11 1:31 PM
for everyone
Untuk tutorial lebih lengkap tentang rsync untuk backup, silahkan baca tutorial yang ditulis oleh Steven Haryanto di majalah infolinux. Silahkan googling untuk mencarinya. Saya cuma ingin mendokumentasikan satu baris-baris perintah yang paling sering saya gunakan, yaitu:

untuk copy file di lokal:
rsync -av -P PATHSUMBER PATHTUJUAN

untuk copy file dari lokal ke remote via ssh:
rsync -e ssh -av -P -z PATHSUMBER USER@HOST:PATHTUJUAN

untuk copy file dari remote ke lokal via ssh:
rsync -e ssh -av -P -z USER@HOST:PATHSUMBER PATHTUJUAN

agar file di sumber dan tujuan benar-benar sama termasuk menghilangkan file di tujuan yang sudah dihapus di sumbernya (by default rsync tidak melakukan penghapusan file di tujuan yang sudah didelete di sumber), tambhakn opsi --del --force. Contoh:
rsync -e ssh -av -P -z --del --force PATHSUMBER USER@HOST:PATHTUJUAN

Opsi -a untuk masuk ke mode archive, mensinkronkan secara rekursif file dan folder didalamnya.
Opsi -v untuk menampilkan file nama file yang sedang ditransfer.
Opsi -P untuk menampilkan lebih detail lagi progres file yang sedang ditransfer.
Opsi -z untuk mengkompresi file selama proses transfer.

Perlu diingat untuk berhati-hati menggunakan akhiran garis miring. Contoh:

rsync -av -P /home/hendro/documents /media/backup/

Akan meng-copy folder "documents" ke folder "backup" dengan nama sama.

rsync -av -P /home/hendro/documents/ /media/backup/

Akan meng-copy isi folder "documents" ke folder "backup".

rsync -av -P /home/hendro/documents /media/backup/dochendro

Akan meng-copy folder "documents" ke folder "backup" dengan nama "dochendro".

Sebenarnya kelebihan rsync masih buanyak lagi tapi ini yang paling sering saya gunakan dan sudah memecahkan hampir banyak kebutuhan backup sebagai ngadimin.

Selamat mencoba! :)


Seperti yang sudah diterangkan dalam intro di http://hendrowicaksono.multiply.com/journal/item/71/Instalasi_Hiawatha_Web_Server_PHP5_via_FastCGI_atau_PHP-FPM_dan_MySQL_di_Ubuntu_Server_10.04, salah satu alasan saya menggunakan Hiawatha adalah alasan keamanan. Tetapi saya juga tidak mau kehilangan Nginx yang sudah terbukti mantap dalam melayani konten statik.

Skenario yang akan digunakan dalam tulisan ini adalah:

  1. Menggunakan Nginx sebagai reverse proxy

  2. Menggunakan Nginx untuk konten statik

  3. Nginx dijalankan pada port standar HTTP (80) dan HTTPS (443)

  4. Hiawatha dijalankan pada port 8080 dan di set hanya menerima request HTTP dari local (127.0.0.1).

  5. Konten dinamis via PHP dilakukan oleh Hiawatha. Jadi Nginx akan meforward request ke file PHP ke Hiawatha.

Pertama lakukan instalasi Hiawatha seperti pada http://hendrowicaksono.multiply.com/journal/item/71/Instalasi_Hiawatha_Web_Server_PHP5_via_FastCGI_atau_PHP-FPM_dan_MySQL_di_Ubuntu_Server_10.04. Ingat HTTPS tidak diaktifkan karena akan dilakukan oleh Nginx.

Jangan lupa update sedikit /etc/hiawatha/hiawatha.conf agar hanya menerima dari IP lokal dengan pertimbangan sekuriti (IP Binding). Kira-kira jadinya seperti ini:

Binding {
    Port = 8080
    Interface = 127.0.0.1
}

Berikutnya adalah instalasi Nginx.

Rilis resmi Nginx pada paket resmi Ubuntu masih menggunakan versi yang lama. Untuk mendapatkan update paling baru paket Nginx ada di PPA Launchpad di https://launchpad.net/~nginx/. Untuk production, selalu gunakan versi stabil karena itu pilih https://launchpad.net/~nginx/+archive/stable. Untuk menambahkan paket PPA kedalam sistem Ubuntu:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx-extras

Catatan: terkadang masih ada bugs yang muncul terkait uninstall dan atau instalasi paket nginx dari PPA (bukan bugs di nginx nya loh ya). Silahkan mencari workaround yang sesuai. Yang saya lakukan antara lain:

  • instalasi aplikasi ppa-purge dari ppa:xorg-edgers/ppa

  • remove ppa:nginx/stable dengan command: “sudo ppa-purge ppa:nginx/stable”

  • menghapus isi folder /etc/apt/source.list.d

  • melakukan penambahan kembali (sudo add-apt-repository ppa:nginx/stable)

Untuk mengaktifkan servis Nginx:

sudo /etc/init.d/nginx start

Edit file /etc/nginx/sites-available/default, cari baris:

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

dan ubah menjadi:

# Arahkan proxy ke server hiawatha 127.0.0.1:8080
# atau dengan nama domain seperti backend.serverku.com:8080
#
location ~ \.php$ {
    proxy_pass http://127.0.0.1:8080;
}

Restart Nginx. Selamat mencoba. :)

NB: jika sudah men-generate serverkey untuk koneksi koneksi HTTPS seperti diceritakan pada tutorial sebelumnya, di Nginx bisa dengan mengedit baris di sites-available/default dan mengaktifkan baris konfigurasi terkait. arahkan ssl_certificate dan ssl_certificate_key pada file yg sama. Untuk optimasinya silahkan baca: http://nginx.org/en/docs/http/configuring_https_servers.html


Kalau anda pernah dihadapi tantangan mengelola infrastruktur aplikasi web yang hits nya super intensif dan sumberdaya hardware terbatas, maka mau tidak mau kita harus melakukan pendekatan ekstrim alias tidak biasanya. Misalnya dengan tehnik caching. Itu pun bukan dengan caching ala rata-rata CMS seperti drupal yang melakukan caching dengan cara men-generate blok konten dan menyimpannya di flat table untuk mengurangi overhead saat mengeksekusi SQL statement yang kaya JOIN; tapi dengan men-generate konten statik berupa file HTML. Salah satu alat bantu yang jadi andalan saya untuk itu adalah httrack. Dalam tulisan ini saya tidak hendak menulis soal itu tetapi yang lain lagi: mencari alternatif web server yang lebih hemat resource tanpa harus mengorbankan aspek keamanan.

Sebenarnya sudah lama saya ingin meninggalkan Apache Web Server yang saat ini sudah cenderung gemuk dan lumayan banyak makan resource. Tapi sialnya saya belum berani lepas dari ketergantungan terhadap modsecurity (http://www.modsecurity.org/) yang saat ini baru tersedia di Apache. Salah satu alternatifnya adalah Hiawatha Web Server yang fitur keamanannya sudah built-in. Seperti: DoS/flooding protection (mod evasive di Apache), Cross-site Scripting (XSS) prevention, Cross-site Request Forgery (CSRF/XSRF) prevention, dan SQL injection prevention. Sebagian fitur tersebut (seperti SQL injection prevention) masih kalah advanced dibanding modsecurity yang bisa dikustom pattern anti serangannya, tapi ini sudah lumayan banget. Plus dokumentasinya juga lengkap. Mari kita coba bersama :)

Operating System yang digunakan Ubuntu Server versi 10.04 LTS. Pastikan sudah terkoneksi ke internet dan sistem instalasi sudah berjalan dengan baik.

Instalasi PHP5 dan MySQL

sudo apt-get install mysql-server mysql-client php5-cgi php5 php5-cli php5-mysql php5-curl php5-gd php-pear php5-imagick php5-mcrypt php5-tidy php5-suhosin php5-xcache

Instalasi Development Libraries

sudo apt-get install libc6-dev libssl-dev dpkg-dev debhelper fakeroot libxml2-dev libxslt1-dev

Download source code Hiawatha versi terbaru (sampai tulisan ini dibuat, versi terbaru ada 7.4)

wget -c http://www.hiawatha-webserver.org/files/hiawatha-7.4.tar.gz

Lakukan ekstrasi dan masuk ke folder source code Hiawatha:

tar -xvf hiawatha-7.4.tar.gz
cd hiawatha-7.4

---------------------------------------------------------------
Catatan: jika menggunakan versi 7.4.1, anda tidak perlu lagi melakukan patch seperti diterangkan dibawah ini.

Lakukan patch keamanan seperti dijelaskan pada http://www.hiawatha-webserver.org/weblog/16. Buka file “hiawatha.c”, pada baris ke 421, ganti baris:

if (content_length < 0) {

dengan

if ((content_length < 0) ||
(INT_MAX - content_length - 2 <= header_length)) {

dan pada awal file tambahkan juga baris:

#include “limits.h”

---------------------------------------------------------------

Kemudian lakukan konfigurasi dan generate file paket deb. Setelah itu lakukan instalasi.

./configure
make deb
cd ..
sudo dpkg -i hiawatha_7.4_i386.deb

Harusnya servis web hiawatha akan langsung diaktifkan. Kira-kira teks yang akan muncul:

Selecting previously deselected package hiawatha.
(Reading database ... 31852 files and directories currently installed.)
Unpacking hiawatha (from hiawatha_7.4_i386.deb) ...
Setting up hiawatha (7.4) ...
Starting webserver: Hiawatha
Processing triggers for ureadahead ...
ureadahead will be reprofiled on next reboot
Processing triggers for man-db ...

Oke, sekarang kita coba mengaktifkan SSL Bindings (HTTP encrypted via SSL) jika kita butuh layanan terenkripsi. Pertama kita buat dulu file sertifikat.

openssl genrsa -out serverkey.pem 2048
openssl req -new -x509 -days 3650 -key serverkey.pem -out server.crt
echo "" >> serverkey.pem
cat server.crt >> serverkey.pem
echo "" >> serverkey.pem
rm -f server.crt
sudo cp serverkey.pem /etc/hiawatha/

Edit file /etc/hiawatha/hiawatha.conf

#Binding {
# Port = 443
# Interface = ::1
# MaxKeepAlive = 30
# TimeForRequest = 3,20
# SSLcertFile = hiawatha.pem
#}

menjadi

Binding {
Port = 443
# Interface = ::1
# MaxKeepAlive = 30
# TimeForRequest = 3,20
SSLcertFile = /etc/hiawatha/serverkey.pem
}

Sekarang restart servis hiawatha:

/etc/init.d/hiawatha restart

Berikutnya mengaktifkan PHP via FastCGI (http://www.fastcgi.com). Edit file “/etc/hiawatha/php-fcgi.conf”, kemudian ubah baris:

#Server = /usr/bin/php5-cgi ; 127.0.0.1:2005 ; www-data ; /etc/php5/cgi/php.ini

menjadi

Server = /usr/bin/php5-cgi ; 127.0.0.1:2005 ; www-data ; /etc/php5/cgi/php.ini

Kemudian jalankan servis fastcgi:

sudo php-fcgi -c /etc/hiawatha/php-fcgi.conf

Sekarang edit file konfigurasi hiawatha di “/etc/hiawatha/hiawatha.conf”, dari:


#FastCGIserver {
# FastCGIid = PHP5
# ConnectTo = 10.0.0.100:2005, 10.0.0.101:2005
# Extension = php, php5
# SessionTimeout = 30
#}

menjadi:


FastCGIserver {
FastCGIid = PHP5
ConnectTo = 127.0.0.1:2005
Extension = php
SessionTimeout = 30
}
UseFastCGI = PHP5

terakhir menambahkan permission agar CGI bisa dieksekusi. Tambahkan juga baris:

ExecuteCGI = yes

Kemudian simpan file dan restart servis hiawatha.

Untuk melakukan pengetesan, pada direktori “/var/www/hiawatha/” buat file dengan nama “info.php”, edit dan isi dengan baris:

<?php phpinfo(); ?>

akses dengan browser, misalnya pada alamat: http://localhost/info.php

Harusnya muncul informasi konfigurasi PHP di sistem server.

Oke sekarang mari kita coba meningkatkan keamanan di sisi server. Pertama mari kita lihat beberapa settting di php.ini yang mungkin bisa di-tune-in. Edit file “/etc/php5/cgi/php.ini” dan cari beberapa baris berikut ini dan ubah:

display_errors = Off

Untuk tidak menampilkan error PHP (jika terjadi). Tapi di server development, sebaiknya di-set “On” agar mudah melakukan troubleshooting.

allow_url_fopen = Off

Untuk men-disable fungsi membuka file via http/ftp. Tapi terkadang beberapa aplikasi membutuhkan fitur ini. Gunakan sesuai kebutuhan.

safe_mode = On

Untuk menjalankan PHP dalam mode safe_mode. Beberapa fungsi PHP tidak jalan ketika safe_mode diaktifkan. Beberapa aplikasi juga membutuhkan ini, jadi gunakan sesuai kebutuhan.

disable_function =

Untuk men-disable beberapa fungsi yang mungkin bisa disalahgunakan secara tidak bertanggungjawab seperti: system, show_source, symlink, exec, dl, shell_exec, passthru, phpinfo, escapeshellarg, escapeshellcmd. Misalnya kita ingin men-disable fungsi shell_exec dan phpinfo, maka:

disable_function = shell_exec, phpinfo

Kalau sudah selesai, restart servis fastcgi:

sudo php-fcgi -k -c /etc/hiawatha/php-fcgi.conf
sudo php-fcgi -c /etc/hiawatha/php-fcgi.conf

Pada Hiawatha, beberapa setting sekuriti hanya berlaku pada virtual host, karenanya kita juga harus mendefinisikannya terlebih dahulu. Setting Virtual Host bisa dilakukan langsung pada file “/etc/hiawatha/hiawatha.conf”. Tetapi untuk kemudahan administrasi kita akan memisahkan setting Virtual Host pada folder “enabled-sites”. Untuk itu pada file “/etc/hiawatha/hiawatha.conf” tambahkan baris:

Include
/etc/hiawatha/enabled-sites/

Buat folder “/etc/hiawatha/enabled-sites”:

sudo mkdir -p /etc/hiawatha/enabled-sites

Sekarang misalnya kita ingin membuat Virtual Host untuk myhost.mydomain.com. Buat file “/etc/hiawatha/enabled-sites/myhost.mydomain.com”. Kemudian edit dan tambahkan baris-baris berikut ini:

VirtualHost {
Hostname = www.myhost.mydomain.com, myhost.mydomain.com
WebsiteRoot = /var/www/hiawatha
StartFile = index.php
AccessLogfile = /var/log/hiawatha/access.myhost.mydomain.com.log
ErrorLogfile = /var/log/hiawatha/error.myhost.mydomain.com.log
TimeForCGI = 15
UseFastCGI = PHP5
DenyBody = ^.*%3Cscript.*%3C%2Fscript%3E.*$
ExecuteCGI = yes
PreventCSRF = yes
PreventSQLi = no
PreventXSS = yes
RequireSSL = no
ShowIndex = no
DenyBot = Googlebot:/
DenyBot = twiceler:/
DenyBot = MSNBot:/
DenyBot = yahoo:/
DenyBot = BaiDuSpider:/
DenyBot = Ask:/
DenyBot = Yahoo! Slurp:/
DenyBot = Sogou web spider:/
DenyBot = Sogou-Test-Spider:/
DenyBot = Baiduspider+:/
DenyBot = Yandex:/
DenyBot = UniversalFeedParser:/
DenyBot = Mediapartners-Google:/
DenyBot = Sosospider+:/
DenyBot = YoudaoBot:/
DenyBot = ParchBot:/
DenyBot = Curl:/
DenyBot = msnbot:/
DenyBot = NaverBot:/
DenyBot = taptubot:/
}

Oke, coba restart hiawatha dan coba akses berdasarkan nama domain tersebut.

# Hiawatha main configuration file

# GENERAL SETTINGS
ServerId = www-data
ConnectionsTotal = 500
ConnectionsPerIP = 20
SystemLogfile = /var/log/hiawatha/system.log
GarbageLogfile = /var/log/hiawatha/garbage.log
#ExecuteCGI = yes
ServerString = Apache
CGIwrapper = /usr/sbin/cgi-wrapper
BanOnSQLi = 60
BanOnFlooding = 10/1:15

# BINDING SETTINGS
# A binding is where a client can connect to.
#
Binding {
Port = 80
# Interface = 127.0.0.1
MaxKeepAlive = 30
TimeForRequest = 3,20
MaxRequestSize = 256
MaxUploadSize = 2
}
#
Binding {
Port = 443
# Interface = ::1
MaxKeepAlive = 30
TimeForRequest = 3,20
SSLcertFile = /etc/hiawatha/serverkey.pem
MaxRequestSize = 256
MaxUploadSize = 2
}

# BANNING SETTINGS
# Deny service to clients who misbehave.
#
BanOnGarbage = 300
ConnectionsPerIP = 20
BanOnMaxPerIP = 5
BanOnMaxReqSize = 300
#KickOnBan = yes
#RebanDuringBan = yes


# COMMON GATEWAY INTERFACE (CGI) SETTINGS
# These settings can be used to run CGI applications. Use the 'php-fcgi'
# tool to start PHP as a FastCGI daemon.
#
#CGIhandler = /usr/bin/perl:pl
#CGIhandler = /usr/bin/php-cgi:php
#CGIhandler = /usr/bin/python:py
#CGIhandler = /usr/bin/ruby:rb
#CGIhandler = /usr/bin/ssi-cgi:shtml
#CGIextension = cgi
#
FastCGIserver {
FastCGIid = PHP5
ConnectTo = 127.0.0.1:2005
Extension = php, php5
SessionTimeout = 30
}

# URL TOOLKIT
# This URL toolkit rule was made for the Banshee PHP framework, which
# can be downloaded from http://www.hiawatha-webserver.org/banshee
#
#UrlToolkit {
# ToolkitID = banshee
# RequestURI isfile Return
# Match ^/(css|files|images|js)/ Return
# Match ^/(favicon.ico|robots.txt|sitemap.xml)$ Return
# Match .*\?(.*) Rewrite /index.php?$1
# Match .* Rewrite /index.php
#}

# DEFAULT WEBSITE
# It is wise to use your IP address as the hostname of the default website
# and give it a blank webpage. By doing so, automated webscanners won't find
# your possible vulnerable website.
#
Hostname = 192.168.1.9
WebsiteRoot = /var/www/hiawatha
StartFile = index.html
AccessLogfile = /var/log/hiawatha/access.log
ErrorLogfile = /var/log/hiawatha/error.log
LogFormat = extended
#ErrorHandler = 404:/error.cgi


# VIRTUAL HOSTS
Include /etc/hiawatha/enabled-sites/

# Use a VirtualHost section to declare the websites you want to host.
#
#VirtualHost {
# Hostname = www.my-domain.com
# WebsiteRoot = /var/www/my-domain/public
# StartFile = index.php
# AccessLogfile = /var/www/my-domain/log/access.log
# ErrorLogfile = /var/www/my-domain/log/error.log
# TimeForCGI = 5
# UseFastCGI = PHP5
# UseToolkit = banshee
#}


# DIRECTORY SETTINGS
# You can specify some settings per directory.
#
#Directory {
# Path = /home/baduser
# ExecuteCGI = no
# UploadSpeed = 10,2
#}

Isi file “/etc/hiawatha/hiawatha.conf”

# PHP FastCGI configuration

# Path to PID-file.
# PidFile = <filename>
#
PidFile = /var/run/php-fcgi.pid

# Number of forks per server.
# Forks = <number>
#
Forks = 3

# Number of maximum requests per fork before respawning.
# MaxRequests = <number>
#
MaxRequests = 100

# Set environment variables for the FastCGI processes.
# Setenv <key> = <value>
#

# PHP FastCGI servers to start.
# Server = <php-cgi executable>;<binding>;<UID>[:<GIDs>][;<PHP configuration file>]
#
#Server = /usr/bin/php5-cgi ; 127.0.0.1:2005 ; www-data
#Server = /usr/bin/php5-cgi ; 127.0.0.1:2005 ; 1000:100,101
Server = /usr/bin/php5-cgi ; 127.0.0.1:2005 ; www-data ; /etc/php5/cgi/php.ini
#Server = /usr/chroot|usr/bin/php5-cgi ; 127.0.0.1:2005 ; www-data

Isi file “/etc/hiawatha/php-fcgi.conf”

Untuk meningkatkan keamanan dari beberapa serangan dengan pola tertentu dengan mengecek “Request Body”, kita bisa menambahkan dari berbagai referensi. Misalnya saya mencoba memasukkan pola serangan pada http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks dan menambahkannya di setting virtual host dan menambahkan pada variabel DenyBody. Contohnya pada konfigurasi dibawah ini.

VirtualHost {
Hostname = www.myhost.mydomain.com, myhost.mydomain.com
WebsiteRoot = /var/www/hiawatha
StartFile = index.php
AccessLogfile = /var/log/hiawatha/access.myhost.mydomain.com.log
ErrorLogfile = /var/log/hiawatha/error.myhost.mydomain.com.log
TimeForCGI = 15
UseFastCGI = PHP5
DenyBody = ^.*%3Cscript.*%3C%2Fscript%3E.*$
# Added rules from

# http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks
DenyBody = /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
DenyBody = /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))/i
DenyBody = /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
DenyBody = /((\%27)|(\'))union/ix
DenyBody = /((\%27)|(\'))select/ix
DenyBody = /((\%27)|(\'))insert/ix
DenyBody = /((\%27)|(\'))delete/ix
DenyBody = /((\%27)|(\'))update/ix
DenyBody = /((\%27)|(\'))drop/ix
DenyBody = /exec(\s|\+)+(s|x)p\w+/ix
DenyBody = /((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix
DenyBody = /((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/I
DenyBody = /((\%3C)|<)[^\n]+((\%3E)|>)/I
ExecuteCGI = yes
PreventCSRF = yes
PreventSQLi = no
PreventXSS = yes
RequireSSL = no
ShowIndex = no
DenyBot = Googlebot:/
DenyBot = twiceler:/
DenyBot = MSNBot:/
DenyBot = yahoo:/
DenyBot = BaiDuSpider:/
DenyBot = Ask:/
DenyBot = Yahoo! Slurp:/
DenyBot = Sogou web spider:/
DenyBot = Sogou-Test-Spider:/
DenyBot = Baiduspider+:/
DenyBot = Yandex:/
DenyBot = UniversalFeedParser:/
DenyBot = Mediapartners-Google:/
DenyBot = Sosospider+:/
DenyBot = YoudaoBot:/
DenyBot = ParchBot:/
DenyBot = Curl:/
DenyBot = msnbot:/
DenyBot = NaverBot:/
DenyBot = taptubot:/
#WrapCGI = jail_myhost_mydomain_com
}

Bosen dan ingin mencoba komparasi menggantikan Fastcgi dengan PHP-FPM? Gampang. Update "/etc/apt/source.list" dan tambahkan:

deb http://ppa.launchpad.net/brianmercer/php/ubuntu lucid main
deb-src http://ppa.launchpad.net/brianmercer/php/ubuntu lucid main

Kemudian update informasi GPGPubkey:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8D0DC64F
sudo apt-get update
sudo apt-get install php5-fpm

Jalankan servis php-fpm yang akan berjalan pada port 9000

sudo service php5-fpm start

atau

sudo /etc/init.d/php5-fpm start

Kemudian edit "/etc/hiawatha/hiawatha.conf", cari baris:

ConnectTo = 127.0.0.1:2005

dan ganti menjadi

ConnectTo = 127.0.0.1:9000

Edit juga file /etc/hiawatha/php-fcgi.conf:

Server = /usr/bin/php5-fpm ; 127.0.0.1:9000 ; www-data ; /etc/php5/fpm/php.ini

Restart servis hiawatha:

sudo /etc/init.d/hiawatha restart

Cek dengan phpinfo dan cari baris dengan keyword FPM untuk memastikan sudah berjalan dengan baik. Konfigurasi terkait PHP-FPM ada di "/etc/php5/fpm/". Selamat Mencoba! Semoga bermanfaat. :)




Blog EntryDec 19, '10 1:51 AM
for everyone
Saya telah selesai mensetup sebuah laptop untuk keperluan pelatihan. Menggunakan OS Debian Lenny (netinstall). Semua sudah berjalan dengan baik. Detail instalasi tidak diterangkan disini karena diluar cakupan penulisan. Sewaktu setupa awal, saya menginstall beberapa program yang dibutuhkan dengan command:

apt-get install apache2 postgresql apache2-threaded-dev build-essential libapache2-mod-security2 libapache2-mod-evasive less

Karena suatu hal, saya butuh php di apache. Sebenarnya gampang tinggal install paketnya dari Debian. Tapi "ngeri" file /etc/apache2/sites-available/default akan berubah. Padahal nyekrip nya agar mod_jk dan mod_security2 berjalan dibuatin orang dan saya ga tahu detailnya (ga bisa java soale :D).

Cara paling mudah tanpa menyentuh banyak file, adalah dengan menginstall apache sebagai CGI. Caranya dengan mendownload source code PHP dari php.net. Kemudian ekstrak. Selanjutnya dari dalam direktori source code PHP:

./configure --prefix=/usr/local/php-5.3.4 --enable-cli --enable-cgi --enable-libxml --with-zlib --with-bz2 --enable-calendar --enable-bcmath --with-curl --enable-exif --with-gd --with-gettext --enable-mbstring --with-mcrypt --with-mysql --with-mysqli=/usr/bin/mysql_config --disable-soap --enable-zip --with-pear=DIR

Kemudian kompilasi:

make

Setelah itu sebagai root, lakukan instalasi:

make install

Edit file /etc/apache2/sites-available/default dan tambahkan:

ScriptAlias /php-bin /usr/local/php-5.3.4/bin
AddType application/x-httpd-php .php
Action application/x-httpd-php /php-bin/php-cgi
<Directory "/usr/local/php-5.3.4/bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

Restart Apache dan cek php berjalan dengan baik melalui skrip phpinfo. Selamat mencoba! :)

NB: tidak direkomendasikan menggunakan PHP dengan CGI seperti dibawah ini utk lingkup production.



Kenapa pula meluangkan waktu mencoba web server Hiawatha? Kan sudah ada Nginx yang lebih woosh woosh woosh? Ada beberapa alasan:

1. Nginx belum punya modul semacam modsecurity di Apache. Padahal saya merasa butuh modul keamanan semacam itu. Hiawatha punya fungsi2 built-in untuk sekuriti karena pembuatnya (Hugo Leisink) mendesain keamanan sebagai faktor yang utama. Coba lihat daftar fitur extra-nya disini: http://www.hiawatha-webserver.org/features. Buat saya sungguh menggiurkan.

2. Sebuah studi bahkan memperlihatkan Hiawatha tidak kalah cepat (bahkan bberapa lebih cepat) dibanding Nginx yang didengung2kan cepat.

3. Buat saya di layer depan semacam load balancer atau proxy, nginx tetap yang utama, tetapi Hiawatha rasa2nya pas betul untuk menjadi backend server menggantikan Apache+modsecurity.

Oke Tutorial ini akan mencoba berbagi cara instalasi Hiawatha di Ubuntu Server Lucid Lynx. Di repository resmi belum tersedia. Bukankah pria sejati melakukan instalasi dari source code :D

Pertama, pastikan paket development dan libssl-dev sudah terinstall. Atau jalankan perintah ini:
sudo apt-get install build-essential libssl-dev libxslt1-dev

Kedua, download source code hiawatha dari http://www.hiawatha-webserver.org/. Misalnya: http://www.hiawatha-webserver.org/files/hiawatha-7.3.tar.gz

wget -c http://www.hiawatha-webserver.org/files/hiawatha-7.3.tar.gz

Ekstrak:

tar -xvzf hiawatha-7.3.tar.gz

cd hiawatha-7.3
./configure --prefix=/usr/local/hiawatha-7.3
make
sudo make install

cd /usr/local
sudo ln -s hiawatha-7.3 hiawatha

sudo mkdir -p hiawatha/var/lib/hiawatha

jalankan daemon:

sudo /usr/local/hiawatha/sbin/hiawatha -c /usr/local/hiawatha/etc/hiawatha

Selamat mencoba :)

Blog EntryOct 21, '10 5:22 AM
for everyone
Load balancing dengan Nginx? Iya, simple load-balancing (round-robin and client IP) across backend servers.backend server bisa pake Nginx juga bisa pakai yang lain semacam Apache. Oke untuk contoh tulisan ini, environment yang saya gunakan adalah Linux Centos dengan virtualisasi menggunakan Xen Hypervisor. Saya install dua guest OS dengan Centos juga. Masing2 sudah terinstall Nginx dengan teknik instalasi seperti disini. Masing2 dengan IP 192.168.122.159 dan 192.168.122.113. Untuk memudahkan melihat hasilnya pada file index.html di masing2 server 159 dan 113 saya tambahkan informasi bahwa ini dari server 159 atau 113. Jadi nanti tes load balancing ketahuan ini dapet dari server yang mana.

Oke di server yang akan menjadi load balancer (Host OS) saya install dulu nginx seperti petunjuk disini. Setelah itu saya edit file nginx.conf dan saya tambahkan baris:

upstream webcluster {
    server 192.168.122.159 weight=1;
    server 192.168.122.113 weight=5;
}


Perhatikan, opsi weight itu opsional. Kalau spek server yang dijadikan bagian dari load balancing adalah sama dan setara, weight mungkin tidak perlu ditambahkan. Jadi cukup jadi:

upstream webcluster {
    server 192.168.122.159;
    server 192.168.122.113;
}


Selanjutnya cari baris:

        location / {
            root   html;
            index  index.html index.htm;
        }


dan update menjadi:

        location / {
            proxy_pass http://webcluster;
            index  index.html index.htm;
        }


Oke begitu saja cukup. Sekarang silahkan start/restart nginx :

kill `cat /usr/local/nginx/logs/nginx.pid`
/usr/local/nginx/sbin/nginx


Wokeh coba akses ip / url dari server dengan load balancer. refresh untuk melihat perubahan2 yang terjadi. Jangan lupa kasi informasi penanda di index.html utk melihat bahwa ini di jawab oleh server yang mana.

Selamat mencoba :)


Blog EntryOct 21, '10 3:55 AM
for everyone
Nginx di Centos? Kenapa tidak. Masalahnya adalah ternyata di default repo centos, paket centos belum tersedia. Mau tidak mau anda harus mencari repo lain seperti jasonlitka dll atau install dari source code *yeah pria sejati*. Tutorial singkat ini akan mencoba instalasi nginx dari source code.

Pertama install development tools. Jalankan perintah:

yum groupinstall 'Development Tools'

Kemudian install library development yang dibutuhkan:

yum install pcre-devel openssl-devel

Download source code nginx:

wget -c http://nginx.org/download/nginx-0.8.53.tar.gz

Ekstrak:

tar -xvzf nginx-0.8.53.tar.gz

masuk ke folder, lakukan konfigurasi, kompilasi dan instalasi:

cd nginx-0.8.53
./configure --prefix=/usr/local/nginx-0.8.53
make
make install
ln -s /usr/local/nginx-0.8.53 /usr/local/nginx

Jalankan nginx:
/usr/local/nginx/sbin/nginx

Sekarang bagaimana di Ubuntu Lucid? Gampang kok. Bisa melalui paket dengan cara:

sudo apt-get install nginx

atau melalui source code seperti di atas. Hanya saja beberapa software yang harus tersedia adalah:

sudo apt-get install libpcre3-dev libssl-dev

Langkah berikutnya sama dengan diatas:

tar -xvzf nginx-0.8.53.tar.gz
cd nginx-0.8.53
./configure --prefix=/usr/local/nginx-0.8.53
make
sudo make install
sudo ln -s /usr/local/nginx-0.8.53 /usr/local/nginx


Coba akses. Selamat mencoba.


Blog EntryOct 15, '10 5:47 AM
for everyone
Terkait dengan posting terdahulu Hikmah Ngadministrasi Sistem Server CPNS Online, saya akan nyicil mendokumentasikan apa yang sudah saya lakukan di sisi server. Oke pertama adalah mengaktifkan kemampuan blokade serangan flooding di level IP Firewall, dalam hal ini, karena saya menggunakan Ubuntu Server Lucid Lynx (10.04), maka tentulah saya menggunakan iptables.

Salah satu tehnik untuk melawan anti flooding adalah dengan TARPIT. Dikutip dari http://en.wikipedia.org/wiki/Tarpit_(networking) :
------------
A tarpit (also known as Teergrube, the German word for tarpit (German pronunciation: [ˈteːɐ̯ˌɡʁuːbə])) is a service on a computer system (usually a server) that delays incoming connections for as long as possible. The technique was developed as a defense against a computer worm, and the idea is that network abuses such as spamming or broad scanning are less effective if they take too long. The name is analogous with a tar pit, in which animals can get bogged down and slowly sink under the surface.
------------

Di iptables, implementasi tarpit tidak datang by-default. Bahkan saat ini masih sulit menemukan distro linux yang datang dengan iptables+tarpit. Beberapa (termasuk Ubuntu Server) bahkan harus mengcompile dari source. yang artinya di server production kudu install tools development. Padahal salah satu prinsip best-practice security, jangan sekali2 install tools development di production server. tapi bagaimana lagi, saat ini di Ubuntu untuk dg dukungan tarpit, kita terpaksa melakukan pelanggaran tersebut.

Tarpit di iptables berupa addons. Untuk melakukan instalasinya:

sudo apt-get install xtables-addons-common
sudo apt-get install xtables-addons-source

Itu belum selesai. Berikutnya melakukan kompilasi:

sudo module-assistant --verbose --text-mode auto-install xtables-addons


Oke, untuk amannya setelah itu lakukan restart. Karena (setahu saya) addons ini melakukan patching ke kernel Linux.

Setelah itu, mainkan iptables nya. Misalnya saya ingin anti flooding dipasang untuk request ke layanan web (port 80). Maka jalankan:

sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j TARPIT

Untuk layanan https (port 443):

sudo iptables -A INPUT -p tcp -m tcp --dport 443 -j TARPIT

Gampang kan? Selamat mencoba. :)

Beberapa catatan:
Sebaiknya tarpit iptables diaktifkan setelah semua sistem (termasuk aplikasi) berjalan dengan baik. Jadi kalau troubleshooting lebih mudah.



Blog EntryOct 14, '10 8:21 PM
for everyone
Ada banyak hikmah yang saya dapatkan waktu membantu ngadministrasi server penerimaan cpns online yang mulai beberapa waktu lalu. Beberapa diantaranya:
  • Sadar diri. Maksudnya kalau kira-kira tuh server bakal diserbu orang se-Indonesia, ya investasi hardware harus seimbang. Kalau cuma pengumuman doang sih, satu atau dua server juga cukup asal OS dan Web server tepat pilihannya. tapi kalau disana ada aplikasi dinamis semacam PHP, koneksi SSL, pakai web server Apache, maka itu semua adalah hardware-hungry. Jadi investasi hardware jangan lupa.
  • Pilih software yang hemat resource. Kemampuan investasi hardware biasanya terbatas. Nah untuk menutupi keterbatasan tersebut, pilihlah software yang hemat resource. Misalnya: jangan pakai Apache. Pakai Apache di server yang bakal diserbu orang se Indonesia, sama saja dengan bunuh diri. Apalagi kalau cuman bermodal satu atau dua server. Dijamin proses apache bakal menghabisi hampir 90% lebih Processing Power server anda.
  • Caching, caching, caching! Gunakan segala macam tehnik caching yang bisa anda lakukan untuk menghemat resource dan mempercepat proses. Seperti menggunakan memcached untuk caching session dan koneksi ke database, APC untuk akselerator PHP, tehnik caching di sisi konten (kalau bisa pakai cms yang support caching nya bagus, atau bahkan bisa generate page html statik lebih oke), dan lain-lain.
  • Paranoid soal keamanan. Di internet itu banyak orang gila. Gila pintarnya, gila isengnya. Pada dasarnya setiap server yang terkoneksi ke internet, saat itu juga dia vulnerable dengan beragam serangan di internet. Di sisi server aman, eh infrastruktur yang diserang. Nah disini mau tidak mau duit yang bicara. Daya tahan server anda terhadap serangan tergantung resource hardware juga. Kalau hardware bagus, bisa lebih lama menahan serangan.
  • Disisi software, tambahkan banyak layer keamanan. Misalnya: (1) aktifkan firewall di level IP misalnya iptables (biar mudah saya pakai UFW untuk interfacenya), sekalian juga tambah addons iptables untuk anti flooding (sangat bermanfaat mengurangi serangan flooding paket) semisal TARPIT, (2) gunakan firewall di level web server seperti mod-security (baru tersedia di Apache, karena butuh ini makanya saya masih pakai Apache), tambahkan juga mod-evasive untuk anti flooding. (3) Gunakan firewall level database semisal GreenSQL. Perlu diperhatikan bahwa instalasi dan setup serta penyesuaian tools sekuriti butuh waktu. Ada instalasi yang agak ribet, tuningnya yang kriting, dan lain-lain.
  • Meski infrastuktur dan server lancar jaya, aplikasi tetep wajib aman. Bahkan menurut saya beberapa tools keamanan ga perlu kalau kita bisa jamin 100% aplikasi kita aman. Pengalaman kemarin, ternyata orang pintar gila banyak banget. Keamanan Mod-security dan aplikasi dilewatin, untung aja masih ke block di greenSQL *fiuh*. Pake panduan OWASP untuk dasar membangun aplikasi web yang aman.
  • Berhati-hatilah jika ingin menggunakan variabel email dalam business logic aplikasi anda. Bukan apa-apa. Pengalaman saya, email delivery is so damn difficult to be predicted. Pas ujicoba jalan, pas production ga jalan. Ada yang sebagian sampe ada yang nggak. Kita juga bingung email siapa saja yang ga sampe. Jadi kalau ga perlu pakai email sebagai salah satu sarana otentikasi, ga usah pakai atau opsional saja.
  • berdoa! Jangan lupa. berdoa agar server baik2 saja. berdoa agar tidak ada orang iseng yang mau ngejahilin. berdoa agar honor lancar hehehehe
Oke nanti dilanjut lagi dg tutorial sepotong2. Nyicil ye.

Kenapa tutorial ini ditulis? Karena instalasi modsecurity di Lucid Lynx, seperti ditunjukkan di banyak website, sungguh menyakitkan alias ga berhasil. Padahal sudah mengambil dari repo resmi. Gagalnya dimana? Ya gagal ketika apache mau di start/restart. Katanya variable "SecPcreMatchLimit" invalid command gitu deh. Kalau baca2 di manualnya modsecurity (modsecurity.org) kayanya gegara apache pake libpcre bundle-nya sendiri sedangkan modsecurity-nya pake bawaannya OS (libpcre3). Doh, padahal dulu jaman LTS 8.04 masalahnya lisensi modsecurity tidak memungkinkan agar tersedia paket modsecurity di repo. Sekarang giliran lisensi modsecurity sudah berubah, ealah paket modsec & apache agak2 ga kompak.

Sampe disini cukup pusinglah saya bagaimana agar apache ambil library pcre-nya dari OS. Solusi paling gampang adalah solusi lelaki sejati: instal dari source code. Tutorial ini mencoba mendokumentasikan instalasi modsecurity di Ubuntu Lucid Lynx dari source code. Buat kebutuhan sehari2 nanti bair ga pusing lagi cari wangsit. Diasumsikan apache, mysql dan php sudah berjalan dengan baik di sistem ini. :)

Oke pertama download-lah modsecurity dari modsecurity.org. Sampai tulisan dibuat, versi terbaru adalah modsecurity-apache_2.5.12(.tar.gz). Kemudian ekstrak.

tar -xvzf modsecurity-apache_2.5.12.tar.gz

cd modsecurity-apache_2.5.12/apache2


Sebelum mulai kompilasi, kita harus menginstal dulu beberapa paket development:

sudo apt-get install build-essential apache2-dev libxml2-dev libcurl3-dev libcurl3-gnutls-dev liblua5.1-dev

sudo apt-get autoremove


Sekarang mulai melakukan kompilasi:
$ ./configure
$ make
$ make install

Buat file /etc/apache2/mods-available/mod-security2.load dengan editor favorit anda dan isi dengan:

LoadFile /usr/lib/libxml2.so
LoadFile /usr/lib/liblua5.1.so.0
LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so

Aktifkan modul mod-security2:
sudo a2enmod mod-security2

Sekarang melakukan copy rules firewall ke /etc/apache2:
$ cd ..
$ sudo cp -R rules /etc/apache2/modsec-rules
$ sudo cp modsecurity.conf-minimal /etc/apache2/modsec-rules/modsecurity.conf

Saat ini konfigurasinya kita buat minimal, yang penting modsecurity jalan dulu, setalah itu nanti akan kita

tambahkan rules yang lain.

Buat file /etc/apache2/conf.d/mod-security2.conf dan isi dengan:

<ifmodule mod_security2.c>
    Include /etc/apache2/modsec-rules/modsecurity.conf
</ifmodule>

Berikutnya membuat log:
$ sudo mkdir -p /var/log/apache2/mod_security
$ sudo touch /var/log/apache2/mod_security/modsec_audit.log
$ sudo touch /var/log/apache2/mod_security/modsec_debug.log

Edit file /etc/apache2/modsec-rules/modsecurity.conf, dan update baris:

SecDebugLog logs/modsec_debug.log
SecAuditLog logs/modsec_audit.log

menjadi berikut:

SecDebugLog /var/log/apache2/mod_security/modsec_debug.log
SecAuditLog /var/log/apache2/mod_security/modsec_audit.log

Sekarang coba restart apache:
$ sudo vim /etc/init.d/apache2 restart

Kalau ada pesan [OK] maka sudah berhasil proses instalasinya. Bisa juga dengan melihat file

/var/log/apache2/error.log:

$ tail -n 5 /var/log/apache2/error.log

Oke itu sekarang saatnya kita menambahkan rules lain yang sesuai dengan kebutuhan kita. Edit file

/etc/apache2/conf.d/mod-security2.conf dan ubah isinya menjadi:

<ifmodule mod_security2.c>
    Include /etc/apache2/modsec-rules/modsecurity.conf
    Include /etc/apache2/modsec-rules/modsecurity_crs_10_config.conf
    Include /etc/apache2/modsec-rules/base_rules/*.conf
</ifmodule>

Sekarang coba restart apache:
$ sudo vim /etc/init.d/apache2 restart

Selamat mencoba! :)



Pages:1234