LibModSecurity adalah aplikasi web application firewall (WAF) yang free dan open-source yang dapat digunakan untuk melindungi server Nginx dari berbagai jenis serangan cyber. Muncul dengan Core Rule Set termasuk SQL injection, cross-site scripting, Trojans dan banyak lagi. Ia bekerja dengan memonitor lalu lintas HTTP secara real-time dan melawan kerentanan menggunakan OWASP ModSecurity Core Rule Set. LibModSecurity dapat digunakan dengan Apache, Nginx, dan IIS dan juga kompatibel dengan Debian, Ubuntu, & CentOS.
Dalam tutorial ini, kami akan menunjukkan kepada Anda cara mengunduh dan mengkompilasi LibModSecurity dengan dukungan Nginx di CentOS 8.
Persyaratan
- Server yang menjalankan CentOS 8.
- Masuk sebagai root atau user dengan hak sudo.
Sebelum Mulai
Sebelum memulai, perbarui server Anda dengan versi terbaru menggunakan perintah berikut:
dnf update
Setelah server Anda up-to-date, restart untuk meminimalisir terjadinya kesalahan pada sistem.
Instal Repository dan Dependensi yang Diperlukan
Pertama, instal repositori EPEL dan REMI pada sistem. Anda dapat menginstalnya dengan perintah berikut:
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Langkah berikutnya instal semua dependensi yang diperlukan dengan perintah berikut:
dnf install gcc-c++ flex bison yajl curl-devel zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config wget openssl openssl-devel nano
Setelah semua paket diinstal, Anda dapat menginstal dependensi lain menggunakan repositori PowerTool:
dnf --enablerepo=PowerTools install doxygen yajl-devel
Instal GeoIP menggunakan repositori REMI dengan menjalankan perintah berikut:
dnf --enablerepo=remi install GeoIP-devel
Setelah semua paket diinstal, Anda dapat melanjutkan ke langkah berikutnya.
Download dan Compile LibModsecurity
Pertama, Anda harus download source LibModsecurity dan mengompilasinya di sistem Anda. Untuk melakukannya, masuk ke direktori /opt
dan download versi terbaru LibModsecurity dari repositori Git :
cd /opt/ git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
Masuk ke direktori ModSecurity
dan download kode libInjection
dengan perintah berikut:
cd ModSecurity git submodule init git submodule update
Konfigurasikan LibModsecurity menggunakan perintah berikut:
./build.sh ./configure
Terakhir, compile dan instal LibModSecurity dengan perintah berikut:
make make install
Pada titik ini, LibModsecurity telah diinstal pada sistem. Anda sekarang dapat melanjutkan untuk menginstal Nginx dengan dukungan LibModsecurity.
Download dan Compile Nginx dengan Dukungan LibModsecurity
Pertama, Anda harus membuat user sistem dan grup untuk Nginx. Anda dapat membuatnya dengan perintah berikut:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
Selanjutnya, Anda perlu download Nginx dan mengompilasinya dengan dukungan LibModsecurity.
Untuk melakukannya, pertama download konektor ModSecurity-nginx dari repositori Git dengan perintah berikut:
cd /opt git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Selanjutnya, download versi terbaru dari Nginx dengan perintah berikut:
wget http://nginx.org/download/nginx-1.17.6.tar.gz
Setelah diunduh, ekstrak file yang diunduh menggunakan perintah berikut:
tar -xvzf nginx-1.17.6.tar.gz
Selanjutnya, masuk ke direktori Nginx dan konfigurasikan dengan perintah berikut:
cd nginx-1.17.6 ./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/opt/ModSecurity-nginx
Selanjutnya Install Nginx dengan perintah berikut :
make make install
Pada titik ini, Nginx telah diinstal dengan dukungan LibModsecurity. Anda sekarang dapat melanjutkan untuk mengkonfigurasi Nginx.
Konfigurasikan Nginx dengan ModSecurity
Pertama, Anda perlu menyalin file konfigurasi sampel ModSecurity dari direktori source Nginx ke direktori konfigurasi Nginx.
Anda dapat menyalinnya dengan perintah berikut:
cp /opt/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf cp /opt/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Selanjutnya, buat symbolic link dari Nginx binary ke /usr/sbin/
dengan perintah berikut:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
Selanjutnya, buat direktori Nginx log, direktori ini berfungsi untuk mencatat semua akses maupun error yang ada pada Nginx, untuk membuat direktori Nginx log gunakan perintah berikut:
mkdir /var/log/nginx
Selanjutnya, buka file konfigurasi Nginx dengan perintah berikut:
nano /usr/local/nginx/conf/nginx.conf
Buat perubahan berikut:
user nginx; worker_processes 1; pid /run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name ganti_dengan_alamat_IP_atau_hostname_atau_domain; modsecurity on; modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Jika Anda mempunyai banyak domain dan ingin membuat pengaturan sendiri untuk setiap domain, silahkan melihat panduan kami tentang cara membuat server block di Nginx.
Simpan dan tutup file setelah Anda selesai. Kemudian, periksa Nginx untuk setiap kesalahan sintaks dengan perintah berikut:
nginx -t
Anda akan melihat output berikut:
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
Pada titik ini, Nginx telah dikonfigurasi. Anda dapat melanjutkan untuk membuat unit file systemd untuk Nginx.
Buat file Layanan Systemd untuk Nginx
Selanjutnya, Anda perlu membuat file systemd untuk mengelola layanan Nginx. Anda dapat membuatnya dengan perintah berikut:
nano /etc/systemd/system/nginx.service
Tambahkan baris berikut:
[Unit] Description=The nginx server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=mixed PrivateTmp=true [Install] WantedBy=multi-user.target
Simpan dan tutup file setelah Anda selesai. Kemudian, restart daemon systemd dengan perintah berikut:
systemctl daemon-reload
Selanjutnya, mulai Nginx service dan aktifkan untuk memulai setelah sistem reboot dengan perintah berikut:
systemctl start nginx systemctl enable --now nginx
Anda akan melihat output berikut:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
Selanjutnya, verifikasi layanan Nginx dengan perintah berikut:
systemctl status nginx
Anda akan melihat output berikut:
? nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2019-12-30 10:20:01 EST; 41s ago Process: 17730 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 17728 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 17727 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 17732 (nginx) Tasks: 2 (limit: 6102) Memory: 5.0M CGroup: /system.slice/nginx.service ??17732 nginx: master process /usr/sbin/nginx ??17733 nginx: worker process Dec 30 10:20:00 nginx systemd[1]: Starting The nginx HTTP and reverse proxy server... Dec 30 10:20:00 nginx nginx[17728]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok Dec 30 10:20:00 nginx nginx[17728]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Dec 30 10:20:01 nginx systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Dec 30 10:20:01 nginx systemd[1]: Started The nginx HTTP and reverse proxy server.
Pada titik ini, Nginx sudah mulai dan berjalan. Anda sekarang dapat melanjutkan untuk mengkonfigurasi ModSecurity.
Konfigurasikan ModeSecurity
Secara default, ModSecurity diatur pada mode hanya deteksi. Jadi, Anda harus membuat sedikit perubahan pada aturan ModSecurity. Anda dapat melakukannya dengan mengedit file modsecurity.conf
:
nano /usr/local/nginx/conf/modsecurity.conf
Temukan baris berikut:
SecRuleEngine DetectionOnly
Dan, ganti dengan baris berikut:
SecRuleEngine On
Dan, ganti dengan baris berikut:
/var/log/modsec_audit.log
Dan, ganti dengan baris berikut:
/var/log/nginx/modsec_audit.log
Simpan dan tutup file setelah Anda selesai.
Selanjutnya, download versi terbaru dari ModSecurity Core Rule Set dari repositori Git menggunakan perintah berikut:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Setelah file di download, ganti nama file konfigurasi crs-setup.conf.example
menjadi crs-setup.conf
dengan perintah berikut:
mv /usr/local/nginx/conf/owasp-crs/crs-setup.conf.example /usr/local/nginx/conf/owasp-crs/crs-setup.conf
Selanjutnya, konfigurasikan ModeSecurity untuk menggunakan aturan ini dengan mengedit file /usr/local/nginx/conf/modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Tambahkan baris berikut di akhir file:
Include owasp-crs/crs-setup.conf Include owasp-crs/rules/*.conf
Simpan dan tutup file setelah Anda selesai. Kemudian, restart layanan Nginx untuk mengimplementasikan perubahan:
systemctl restart nginx
Test Pengaturan dan Performa ModSecurity
ModSecurity telah diinstal dan dikonfigurasi. Sudah waktunya untuk menguji apakah pengaturan kita berfungsi atau tidak.
Untuk menguji ModSecurity terhadap command injection, buka browser web Anda dan ketik URL http://localhost/index.html?exec=/bin/bash
. Anda akan melihat error 403 Forbidden seperti berikut:
Untuk menguji respon ModSecurity terhadap serangan XSS (Cross site scripting), buka terminal dan jalankan perintah curl
di barengi dengan payload XSS.
curl http://localhost/?q="><script>alert(1)</script>"
Jika anda mendapatkan output berikut, berarti ModSecurity berhasil mendeteksi serangan dan memblokirnya.
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.6</center> </body> </html>
Kesimpulan
Selamat! Anda telah berhasil download dan compiled LibModSecurity dengan Nginx. Server Anda sekarang diamankan dari berbagai serangan. Untuk informasi lebih lanjut, Anda dapat mengunjungi dokumentasi ModSecurity di ModSecurity Doc.