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.

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

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

Share this awesome article to the world, so everyone knows it :)

LinkedIn
Reddit
WhatsApp
Hacker News
Telegram