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

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:

install ModSecurity 403 Forbidden di CentOS 8

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.