Amankan Web Server dengan ModSecurity & Mod Evasive

Sekarang ini kita sering mendengar berita tentang peretasan situs pemerintahan Indonesia oleh orang yang mengatasnamakan dirinya adalah ‘hacker‘. Tak lupa juga pesan yang selalu mereka tinggalkan untuk sang web administrator ataupun kritikan keburukan sistem yang ada. Banyak metode yang bisa dilakukan untuk menyerang suatu website dari mulai PHP Script, Web Server, Web Hosting dan masih banyak cara lainnya.

Mungkin diantara kita sudah tak asing lagi dengan istilah SQL Injection, XSS, Local File Inclusion (LFI), Remote File Inclusion(RFI) dan lain-lain yang digunakan oleh attacker untuk mendapatkan akses  terhadap website ataupun sistem itu sendiri dari celah yang ia temukan. Aplikasi yang bagus harus memperhatikan 3 hal, yaitu : Jaringan(Network), Aplikasi dan Manusia. Ketiga hal tersebut berkesinambungan dalam menjadikan aplikasi yang bagus–dalam artian keamanan–, karena seorang attacker akan melakukan serangan melalui 3 hal tersebut. Bisa jadi aplikasi yang dibuat sudah bagus dan jaringan pun bagus tapi ada celah pada manusia itu sendiri untuk dieksploitasi dengan Social Engineering. Seperti kata pepatah seorang Social Engineer

If you cannot hack the machine, then hack the human

Dalam artikel ini akan membahas untuk melakukan pengamanan dari segi web server. Kita akan menggunakan ModSecurity sebagai Web Application Firewall(WAF) –atau bisa juga menjadi Intrusion Detection System(IDS)– yang berguna untuk melakukan proses filtering terhadap data yang masuk melalui protokol HTTP dan juga mampu melakukan tindakan tertentu sesuai dengan aturan(rules) yang sudah dibuat untuk menangani setiap proses data filtering. Sedangkan, Mod Evasive akan kita gunakan untuk DDoS Protection.

Apa yang bisa dilakukan ModSecurity?

  • Real-time application security monitoring and access control
  • Full HTTP traffic logging
  • Web application hardening
  • etc

Menggunakan ModSecurity membutuhkan rules tambahan agar lebih maksimal dalam mendeteksi serangan. Yang disebut sebagai Core Rule Set(CRS) dan kita masih bisa membuat rules sendiri.

Serangan apa yang bisa dideteksi oleh CRS?

  • HTTP Protection – detecting violations of the HTTP protocol and a locally defined usage policy.
  • Real-time Blacklist Lookups – utilizes 3rd Party IP reputation.
  • HTTP Denial of Service Protection – defense against HTTP flooding and slow HTTP DoS attacks.
  • Common Web Attacks Protection – detecting common web application security attacks.
  • Automation Detection – Detecting bots, crawlers, scanners and other surface malicious activity.
  • Integration with AV Scanning for File Uploads – detects malicious files uploaded through the web application.
  • Tracking Sensitive Data – Tracks credit card usage and blocks leakages.
  • Trojan Protection – Detects trojan horses.
  • Identification of Application Defects – alerts on application mis-configurations.
  • Error Detection and Hiding – Disguising error messages sent by the server.

Sebelum memulai instalasi ModSecurity dan OWASP Core Rule Set, ada baiknya untuk melakukan pembaruan sistem. Saya disini menggunakan CentOS 7 dengan Apache 2 dan untuk distro lain bisa disesuaikan.

yum -y update

Beberapa dependencies diperlukan sebelum melakukan instalasi ModSecurity. Semua tergantung dari konfigurasi server dan paket yang mungkin sudah terinstal. Yum akan melakukan instalasi untuk paket yang belum terpasang dan akan menginformasikan bila sudah terpasang pada sistem

 yum -y install httpd-devel git gcc make libxml2 pcre-devel libxml2-devel curl-devel

Unduh source code dari website ModSecurity. Versi stabil saat ini adalah 2.9.1

cd /opt/
wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz

Extract arsip ModSecurity

tar zxvf modsecurity-2.9.1.tar.gz
cd modsecurity-2.9.1/

Konfigurasi dan lakukan proses kompilasi terhadap source code

./configure
make
make install

Salin konfigurasi bawaan ModSecurity dan file unicode mapping ke direktori Apache

cp modsecurity.conf-recommended /etc/httpd/conf.d/modsecurity.conf
cp unicode.mapping /etc/httpd/conf.d/

Konfigurasi Apache agar menggunakan modul ModSecurity

 echo LoadModule security2_module modules/mod_security2.so >> /etc/httpd/conf/httpd.conf

Oke, sekarang restart Apache

systemctl restart httpd.service

Sebelum memasuki langkah selanjutnya, pastikan tidak menampilakan kesalahan saat restart service Apache. Bila tidak terjadi kesalahan, maka langkah selanjutnya unduh OWASP Core Rule Set

cd /etc/httpd
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

Konfigurasi OWASP Core Rule Set

cd owasp-modsecurity-crs/
cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_config.conf

Selanjutnya, tambahkan ruleset ke konfigurasi Apache dengan menambahkan ruleset di /etc/httpd/conf/httpd.conf agar ModSecurity terkonfigurasi sesuai acuan pada CRS.

Include owasp-modsecurity-crs/modsecurity_crs_10_config.conf
Include owasp-modsecurity-crs/base_rules/*.conf

Restart kembali Apache

systemctl restart httpd.service

Secara bawaan, ModSecurity berjalan dengan mode detection-only. Yang artinya akan melakukan log terhadap semua event tapi tidak akan ada tindakan. Setelah melakukan peninjauan terhadap log, maka selanjutnya kita memilih untuk membuat sebuah ruleset, memodifikasi ruleset yang sedang berjalan atau bahkan menonaktifkan ruleset dikarenakan oleh laporan yang tidak sesuai. Untuk melihat log bisa dengan menggunakan

tail -f /var/log/httpd/error_log

Ini adalah contoh laporan dari ModSecurity ketika mendapatkan masalah serangan dengan menggunakan sqlmap pada FreePBX

[Wed May 25 02:05:34.479028 2016] [:error] [pid 8617] [client 127.0.0.1:33566] [client 127.0.0.1] ModSecurity: Warning. Matched phrase "sqlmap" at REQUEST_
HEADERS:User-Agent. [file "/etc/httpd/owasp-modsecurity-crs/base_rules/modsecurity_crs_35_bad_robots.conf"] [line "20"] [id "990002"] [rev "2"] [msg "Reque
st Indicates a Security Scanner Scanned the Site"] [data "sqlmap"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "9"] [tag "OWASP_
CRS/AUTOMATION/SECURITY_SCANNER"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [hostname "localhost"] [uri "/"] [unique_id "V0Sl-uzP6k
mJvN1VzL9@UQAAAAE"]
[Wed May 25 01:36:01.538262 2016] [:error] [pid 7544] [client 192.168.88.239:49880] [client 192.168.88.239] ModSecurity: Warning. Pattern match "([\\\\~\\\\!\\\\@\\\\#\\\\$\\\\%\\\\^\\\\&\\\\*\\\\(\\\\)\\\\-\\\\+\\\\=\\\\{\\\\}\\\\[\\\\]\\\\|\\\\:\\\\;\\"\\\\'\\\\\\xc2\\xb4\\\\\\xe2\\x80\\x99\\\\\\xe2\\x80\\x98\\\\`\\\\<\\\\>].*?){5,}" at ARGS:display. [file "/etc/httpd/owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "159"] [id "981173"] [rev "2"] [msg "Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded"] [data "Matched Data: > found within ARGS:display: digium_phones'Xevqgx<'\\x22>WnvtYc"] [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [hostname "192.168.88.238"] [uri "/admin/config.php"] [unique_id "V0SfESTRGH0AZV7O5GDHRQAAAAA"]
[Wed May 25 01:36:01.538636 2016] [:error] [pid 7544] [client 192.168.88.239:49880] [client 192.168.88.239] ModSecurity: Warning. Pattern match "(?i:(?:in\\\\s*?\\\\(+\\\\s*?select)|(?:(?:n?and|x?x?or|div|like|between|and|not |\\\\|\\\\||\\\\&\\\\&)\\\\s+[\\\\s\\\\w+]+(?:regexp\\\\s*?\\\\(|sounds\\\\s+like\\\\s*?[\\"'`\\xc2\\xb4\\xe2\\x80\\x99\\xe2\\x80\\x98]|[=\\\\d]+x))|([\\"'`\\xc2\\xb4\\xe2\\x80\\x99\\xe2\\x80\\x98]\\\\s*?\\\\d\\\\s*?(?:--|#)) ..." at ARGS:display. [file "/etc/httpd/owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "239"] [id "981246"] [msg "Detects basic SQL authentication bypass attempts 3/3"] [data "Matched Data: 'Xevqgx<'\\x22 found within ARGS:display: digium_phones'Xevqgx<'\\x22>WnvtYc"] [severity "CRITICAL"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [hostname "192.168.88.238"] [uri "/admin/config.php"] [unique_id "V0SfESTRGH0AZV7O5GDHRQAAAAA"]
[Wed May 25 01:36:01.645388 2016] [:error] [pid 7544] [client 192.168.88.239:49880] [client 192.168.88.239] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/etc/httpd/owasp-modsecurity-crs/base_rules/modsecurity_crs_60_correlation.conf"] [line "37"] [id "981204"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 19, SQLi=2, XSS=0): 981246-Detects basic SQL authentication bypass attempts 3/3"] [hostname "192.168.88.238"] [uri "/admin/config.php"] [unique_id "V0SfESTRGH0AZV7O5GDHRQAAAAA"]

Untuk merubah ModSecurity dari mode detection-only menjadi protection, cukup buka file /etc/httpd/conf.d/modsecurity.conf dan rubah

SecRuleEngine DetectionOnly

menjadi

SecRuleEngine On

Bila ingin melakukan perubahan terhadap ruleset yang ada atau menonaktifkan ruleset, bisa modifikasi file /etc/httpd/owasp-modsecurity-crs/modsecurity_crs_10_config.conf . Informasi lebih lanjut bisa melihat pada bagian referensi untuk melakukan konfigurasi ruleset.

Baca Juga:  Alternatif IDM untuk Linux? Ada kok!

Perlu dicatat, bagi yang menggunakan CodeIgniter sebagai web framework nya, sangat tidak disarankan untuk menampilkan ci_session di HTTP Header. Karena itu akan membuat ModSecurity memberikan laporan yang salah dengan isi dari ci_session yang mengandung karakter khusus yang sudah dikategorikan sebagai sebuah serangan. Karena apa yang ada pada CRS itu adalah data pattern yang bisa identik dengan serangan pada umumnya, diperlukan konfigurasi ulang bila memang menjumpai kasus yang berbeda.

Setelah proses instalasi dan konfigurasi ModSecurity, sekarang kita lanjutkan proses tahap instalasi Mod Evasive untuk DDoS/DoS Protection.

Mod Evasive

Mod_evasive adalah sebuah evasive modul yang disediakan oleh Apache untuk menangani sebuah serangan seperti HTTP DoS, DDoS dan brute force pada Apache Server.  Modul ini bekerja dengan membuat internal dynamic hash table untuk IP Adress dan URI, dan melakukan penolakan request bila sesuai dengan kriteria berikut:

  • Melakukan request pada halaman yang sama berkali-kali dalam jangka waktu yang singkat
  • Membuat lebih dari 50 request bersamaan pada proses yang sama per detik
  • Membuat request ketika status masih dalam blacklist

Sebelum melakukan instalasi, kita diharuskan sudah memasang EPEL Repo pada sistem bila menggunakan CentOS.

Untuk CentOS 7:

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

Untuk CentOS 6:

sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Oke, sekarang kita lakukan instalasi untuk modul mod_evasive

sudo yum install mod_evasive -y

Lakukan pengecekan terlebih dahulu untuk mengetahui bahwa mod_evasive sudah ter-load oleh Apache

sudo  httpd -M | grep evasive

Bila sudah terpasang, maka akan tampil seperti ini

evasive20_module (shared)

Konfigurasi mod_evasive

Sekarang saat nya melakukan proses konfigurasi untuk mod_evasive agar berjalan sesuai dengan kondisi yang kita inginkan. Semua konfigurasi berada di /etc/httpd/conf.d/mod_evasive.conf . Maka, kita buka file tersebut

sudo nano /etc/httpd/conf.d/mod_evasive.conf

Saya akan jelaskan masing-masing kegunaan parameter yang terdapat pada file konfigurasi

DOSPageCount

DOSPageCount untuk menentukan jumlah batasan per request pada halaman yang sama dalam jangka waktu 1 detik oleh IP Address. Ketika request menyentuh batas dari yang ditentukan, maka IP akan dimasukkan kedalam blocked list karena dianggap tidak wajar. Kita bisa mengatur sesuai dengan kebutuhan masing-masing, misal menjadi 20 atau 30.

DOSSiteCount

DOSSiteCount hampir sama dengan DOSPageCount, hanya saja ini berhubungan dengan berapa banyak request keseluruhan yang bisa dilakukan sesuai dengan interval DOSSiteInterval.

DOSBlockingPeriod

DOSBlockingPeriod untuk menentukan durasi setiap IP yang terblokir dalam satuan detik.

DOSEmailNotify

Uncomment #DOSEmailNotify untuk mengaftikan pemberitahuan melalui email setiap ada serangan.

DOSSystemCommand

Uncomment #DOSSystemCommand untuk menggabungkan mod_evasive dengan perintah lain. Seperti menggabungkan mod_evasive dengan fail2ban.

DOSLogDir

Uncomment #DOSLogDir untuk mengaktifkan logging pada setiap aktivitas yang terjadi di Apache. Contoh, kita akan menggunakan /var/log/mod_evasive sebagai direktori tempat penyimpanan. Maka lakukan hal berikut:

sudo mkdir /var/log/mod_evasive

Lalu, berikan hak akses kepada user apache

sudo chown -R apache:apache /var/log/mod_evasive

Maka, set DOSLogDir ke direktori yang sudah kita buat sebelumnya

DOSLogDir           "/var/log/mod_evasive"

Bila sudah, sekarang kita harus restart service Apache agar modul mod_evasive terpasang.

systemctl restart httpd.service

Testing mod_evasive

Baca Juga:  Alternatif IDM untuk Linux? Ada kok!

Setelah kita melalui tahap instalasi dan juga konfigurasi, sekarang saat nya kita melakukan uji coba terhadap sistem yang sudah diterapkan. Kita akan melakukan uji coba dengan hal yang sangat sederhana. Yaitu menggunakan test script yang diberikan oleh mod_evasive untuk melakukan uji coba terhadap konfigurasi. Kita diharuskan untuk memasang Perl terlebih dahulu

sudo yum install -y perl

Test script sudah terpasang di /usr/share/doc/mod_evasive-1.10.1/test.pl . Seperti berikut:

#!/usr/bin/perl

# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..100) {
  my($response);
  my($SOCKET) = new IO::Socket::INET( Proto   => "tcp",
                                      PeerAddr=> "127.0.0.1:80");
  if (! defined $SOCKET) { die $!; }
  print $SOCKET "GET /?$_ HTTP/1.0\n\n";
  $response = <$SOCKET>;
  print $response;
  close($SOCKET);
}

Rubah nilai 100 menjadi nilai yang lebih besar untuk melakukan uji coba request. Misal kita ingin merubah menjadi 500. Simpan dan kemudian jalankan script tersebut

sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

Kita akan mendapatkan tampilan yang menandakan bahwa request tersebut sudah ditolak seperti berikut:

HTTP/1.1 302 Found
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Untuk melihat log aktivitas nya cukup menggunakan perintah berikut

sudo tailf /var/log/messages

Maka, akan tampil seperti berikut

May 25 13:01:02 localhost mod_evasive[18866]: Blacklisting address 127.0.0.1: possible DoS attack.

Kesimpulan

ModSecurity dan mod_evasive cukup bagus untuk langkah pencegahan dari serangan yang banyak terjadi. Dengan adanya fitur Web Application Firewall, Intrusion Detection System, dan DoS/DDoS Protection sangat membantu dalam mengamankan Web Server ataupun Web Application. Tapi, tidak menutup kemungkinan adanya serangan lain yang bisa saja masuk dengan berbagai cara. Yang perlu diingat bahwa “No System is safe” .

Akhir kata, semoga artikel ini bermanfaat.

 

Referensi

  • https://github.com/SpiderLabs/ModSecurity/wiki/ModSecurity-Frequently-Asked-Questions-(FAQ)
  • https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#OWASP_ModSecurity_Core_Rule_Set_CRS_Project
  • http://www.owasp.org
  • http://resources.infosecinstitute.com/avoiding-mod-security-false-positives-white-listing/
  • http://ezine.echo.or.id/ezine19/e19.010.txt
  • Social Engineering: The Art of Human Hacking
  • https://www.vultr.com/docs/modsecurity-and-owasp-on-centos-6-and-apache2
  • http://www.zdziarski.com/blog/?page_id=442
  • https://www.digitalocean.com/community/tutorials/how-to-protect-against-dos-and-ddos-with-mod_evasive-for-apache-on-centos-7
Baca Juga:  (G)UFW: Linux Firewall Anti Ribet

Aan Wahyu

Hanya seorang penyuka Wayang( Terutama Wayang Golek) dan penggiat Open Source serta penikmat dan pembuat puisi. Saat ini memakai distro Arch Linux sebagai OS yang digunakan untuk kebutuhan sehari-hari. Founder dari Sinau Development. Tertarik dengan Research Development dan Non-Profit Organization yang bersifat Open Source dan juga sebagai kontributor di RumahVOIP serta Indonesian Research and Development Center( RNDC ) dan aktif juga diforum Open Source lainnya.
Aan Wahyu