Cara Install dan Konfigurasi ModSecurity pada Web Server Nginx

Cara Install dan Konfigurasi ModSecurity pada Web Server Nginx - Pada kesempatan kali ini saya akan sharing seputar hardening security. Kali ini kita membahas pemasangan modul ModSecurity pada Web Server Nginx. Sebelumnya apa itu Mod Security?

ModSecurity adalah aplikasi firewall, Open source, yang memberikan perlindungan Halaman Web host di server. Pada dasarnya, ModSecurity (mod_security) monitor si menganalisis Lalu lintas real time HTTP dan memberikan perlindungan bagi serangkaian serangan yang bisa terjadi pada halaman web.

Sementara Nginx (dibaca engine x) adalah server HTTP dan Proxy dengan kode sumber terbuka yang bisa juga berfungsi sebagai proxy IMAP/POP3. Kode sumber nginx ditulis oleh seorang warga negara Rusia yang bernama Igor Sysoev pada tahun 2002 dan dirilis ke publik pada tahun 2004. Nginx terkenal karena stabil, memiliki tingkat performansi tinggi dan minim mengonsumsi sumber daya.

itulah kenapa perusahaan perusahaan besar rama rata memilih nginx daripada Apache. Dan juga, di Apache itu semua modul sudah lengkap, bahkan untuk instalasi mod-security di apache2 tinggal pakai apt-get saja. Namun karena modul yang sudah lengkap ini, apache rakus sekali ke memori, bahkan ada beberapa modul apache yang akhirnya cuma buang buang resource karena tidak dipakai, tapi sudah ikut terinstall. 

Sementara di Nginx, semua harus serba di konfigurasi. Dan mungkin buat yang baru kenal atau baru belajar webserver dan membandingkan tingkat kesulitan mengelola apache dan nginx, semua akan setuju mengatakan nginx lebih ribet. Saya pun pernah berpendapat demikian. Namun dengan nginx, ibaratnya kita bakal susah di awal (karena harus konfigurasi sana sini), tetapi pada akhirnya kita akn puas dengan performa nya yang stabil dan tidak rakus memori.

Oke cukup ya pengenalan dan gambaran tentang webservernya, kali ini masuk ke pembahasan instalasi Mod Security pada Nginx. Untuk memasang mod-security pada Nginx kita harus meng-compile Nginx dari sumbernya, bukan hasil install paket repostrity dengan apt-get atau yum.

Pada tutorial ini saya menggunakan server CentOS 7. Untuk pemakai centOs dan keluarganya silahkan ikuti tutorial ini, dan untuk pengguna Ubuntu saya akan bahas di post selajutnya.

Sebelum memulai, kita buat dulu direktori untuk bahan bahan yang harus disiapkan. Sebenarnya step ini opsional saja ya, cuma biar gak ribet.
mkdir build
cd /root/build
Oke sudah siap untuk proses install nya.
Pertama, install dependensi dan dev-tool yang diperlukan terlebih dahulu.
yum groupinstall -y "Development Tools"
yum install -y httpd httpd-devel pcre pcre-devel libxml2 libxml2-devel curl curl-devel openssl openssl-devel
Karena beberapa ketidakstabilan yang dilaporkan pada ModSecurity untuk Nginx master branch, untuk saat ini, secara resmi disarankan untuk menggunakan versi terbaru dari cabang nginx_refactoring bila memungkinkan.
git clone -b nginx_refactoring https://github.com/SpiderLabs/ModSecurity.git
cd ModSecurity
sed -i '/AC_PROG_CC/a\AM_PROG_CC_C_O' configure.ac
sed -i '1 i\AUTOMAKE_OPTIONS = subdir-objects' Makefile.am
Kedua perintah sed diatas untuk mengedit file configure.ac dan Makefile.am untuk menghindari pesan warning jika menggunakan automake versi terbaru.
Oke lanjut :
./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make
Sampai disini persiapan untuk mod-security sudah oke. Sekarang ke Nginx nya.
kalian bisa cek rilisan Nginx disini :
Nginx Download Page
Saat tulisan ini dibuat, nginx versi stabil terbaru adalah versi 1.13.1 .
Sekarang kita download source nya, dan ingat, posisi kita masih di direktori build.
wget https://nginx.org/download/nginx-1.13.1.tar.gz
gunzip -c nginx-1.13.1.tar.gz | tar xvf -
cd  nginx-1.13.1
Oke sebenernya yang ini opsional juga, tapi ya, sekalian kita compile dari awal, dan bebas ngedit ngedit dulu, kenapa gak sekalian dibikin vanity server name nya.
Maksudnya gimana ? Kalian pas cek whois server, pasti ada kan informasi server yang digunakan. Seperti "Server : Apache2", "Server : Nginx", atau "Server: nginx-cloudflare" . nah kita ubah informasi server tersebut. Bisa? Bisa dong pastinya. 😀

Di direktori source nginx edit file http_header_filter_module
nano src/http/ngx_http_header_filter_module.c
Lalu cari baris berikut :
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
Ubah menjadi :
static char ngx_http_server_string[] = "Server: NekoPoi" CRLF;
static char ngx_http_server_full_string[] = "Server: NekoPoi" CRLF;
bebas diedit. Silahkan sesusaikan sendiri ya.
Sip, sekarang lanjut ke compile Nginx dengan tambahan modul mod-security.
./configure --user=nginx --group=nginx --add-module=/root/build/ModSecurity/nginx/modsecurity
make
make install
Karena kita tadi set compile nginx agar menggunakan user nginx dan grup nginx, kita buat juga akun nya. Tidak perlu diberi akses login, dan memang sebaiknya jangan diberi akses login.
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin -M nginx
sed -i "s/#user  nobody;/user nginx nginx;/" /usr/local/nginx/conf/nginx.conf
Berikut lokasi dari semua file konfigurasi nginx yang terinstall.
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
Nah, untuk memudahkan, kita buat symlink ke binary file nginx.
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
Sekarang kalian bisa memanggilnya secara langsung.
Contoh :
nginx -t
Output :
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Biar lebih nyaman lagi, kita setup juga file systemd nya.
nano /lib/systemd/system/nginx.service
Isinya :
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillStop=/usr/local/nginx/sbin/nginx -s stop
KillMode=process
Restart=on-failure
RestartSec=42s
PrivateTmp=true
LimitNOFILE=200000
[Install]
WantedBy=multi-user.target
Sekarang kalian bisa menjalankan perintah
service nginx restart | start | stop
Sekarang adalah setup Mod Security. Disini saya menggunakan rule yang biasa digunakan dan sudah disediakan yaitu ModSecurity OWASP CRS .
nano /usr/local/nginx/conf/nginx.conf
Lalu cari kode 
location / {
    root   html;
    index  index.html index.htm;
}
Lalu sisipkan kode berikut sebelum path root dari nginx server nya.
ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;
Sehingga jadinya :
location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsec_all.conf;
    root   html;
    index  index.html index.htm;
Oke selanjutnya buat file modsec_allconf .
nano /usr/local/nginx/conf/modsec_all.conf
isinya :
include modsecurity.conf
include owasp-modsecurity-crs/crs-setup.conf
include owasp-modsecurity-crs/rules/*.conf
Selanjutnya inport konfigurasi mod-security.
cp /usr/src/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /usr/src/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Kita ubah sedikit file modsecurity.conf nya :
sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/nginx/conf/modsecurity.conf
Langkah selanjutnya adalah menambahkan rule Modsecurity CRS
cd /usr/local/nginx/conf
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
cd owasp-modsecurity-crs
mv crs-setup.conf.example crs-setup.conf
cd rules
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
Jika sudah oke, restart nginx.
service nginx restart
Lalu coba kita lakukan xss pada server kita menggunakan browser.
http://linuxsec.org/?param="><script>alert(1);</script>
Cek di log nginx nya.
grep xss /usr/local/nginx/logs/error.log
Akan ada notice dari mod-security.
Sebagai tambahan, saya anjurkan juga konfigurasi HTTP Header Security nya.
Oke sekian tutorial kali ini, semoga bermanfaat. Jika ada yang kurang jelas silahkan bertanya.

Posting Komentar untuk "Cara Install dan Konfigurasi ModSecurity pada Web Server Nginx"