ModSecurity adalah firewall aplikasi web sumber terbuka yang populer, gratis, yang digunakan untuk melindungi aplikasi web dari beberapa jenis serangan termasuk injeksi SQL, skrip lintas situs, dan penyertaan file lokal. Ini sering digunakan untuk melindungi situs web, cPanel, dan panel kontrol hosting lainnya. Meskipun ModSecurity terutama dirancang untuk server web Apache, ModSecurity juga dapat bekerja dengan server web Nginx.
Dalam posting ini, kami akan menunjukkan cara menginstal ModSecurity dengan Nginx di Rocky Linux 8.
Prasyarat
- Server yang menjalankan Rocky Linux 8 di Atlantic.Net Cloud Platform
- Kata sandi root yang dikonfigurasi di server Anda
Langkah 1 – Buat Server Cloud Atlantic.Net
Pertama, masuk ke Server Cloud Atlantic.Net Anda. Buat server baru, pilih Rocky Linux 8 sebagai sistem operasi dengan RAM minimal 2GB. Hubungkan ke Server Cloud Anda melalui SSH dan masuk menggunakan kredensial yang disorot di bagian atas halaman.
Setelah Anda masuk ke server Anda, jalankan perintah berikut untuk memperbarui sistem dasar Anda dengan paket terbaru yang tersedia.
dnf update -y
Langkah 2 – Instal Dependensi yang Diperlukan
Pertama, Anda perlu menginstal semua dependensi yang diperlukan di server Anda. Anda dapat menginstal semuanya dengan perintah berikut:
dnf install gcc-c++ flex bison yajl curl-devel curl zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config git wget openssl openssl-devel vim
dnf --enablerepo=powertools install doxygen yajl-devel -y
Selanjutnya, instal repositori EPEL dan Remi menggunakan perintah berikut:
dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
Selanjutnya, instal GeoIP menggunakan perintah berikut:
dnf --enablerepo=remi install GeoIP-devel -y
Langkah 3 – Instal ModSecurity
Pertama, unduh ModSecurity versi terbaru menggunakan perintah berikut:
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
Selanjutnya, ubah direktori ke ModSecurity dan instal modul lainnya dengan perintah berikut:
cd ModSecurity git submodule init git submodule update
Selanjutnya, kompilasi dan instal ModSecurity dengan perintah berikut:
./build.sh ./configure make make install
Langkah 4 – Instal Nginx dengan Dukungan LibModsecurity
Untuk mengaktifkan dukungan LibModsecurity di Nginx, Anda perlu mengompilasi Nginx dengan dukungan untuk LibModsecurity.
Pertama, unduh konektor ModSecurity-nginx menggunakan perintah berikut:
cd ../ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Selanjutnya, unduh Nginx versi stabil terbaru dengan perintah berikut:
wget http://nginx.org/download/nginx-1.19.10.tar.gz
Selanjutnya, ekstrak file yang diunduh menggunakan perintah berikut:
tar xzf nginx-1.19.10.tar.gz
Selanjutnya, buat pengguna untuk Nginx dengan perintah berikut:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
Selanjutnya, ubah direktori ke sumber Nginx dan kompilasi menggunakan perintah berikut:
cd nginx-1.19.10 ./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/root/ModSecurity-nginx
Selanjutnya, instal menggunakan perintah berikut:
make make install
Selanjutnya, salin contoh file konfigurasi ModSecurity dan file pemetaan Unicode dengan perintah berikut:
cp /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf cp /root/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Selanjutnya, buat cadangan file konfigurasi Nginx:
cp /usr/local/nginx/conf/nginx.conf{,.bak}
Selanjutnya, edit file konfigurasi Nginx dengan perintah berikut:
nano /usr/local/nginx/conf/nginx.conf
Hapus semua baris dan tambahkan baris 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 nginx.example.com; modsecurity on; modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf; access_log /var/log/nginx/access_kifarunix-demo.log; error_log /var/log/nginx/error_kifarunix-demo.log; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Simpan dan tutup file, lalu buat direktori log Nginx:
mkdir /var/log/nginx
Langkah 5 – Buat File Layanan Systemd untuk Nginx
Selanjutnya, Anda perlu membuat file layanan systemd untuk mengelola layanan Nginx. Anda dapat membuatnya menggunakan perintah berikut:
nano /etc/systemd/system/nginx.service
Tambahkan baris berikut:
[Unit] Description=The nginx HTTP and reverse proxy 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, lalu buat symlink biner Nginx menggunakan perintah berikut:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
Selanjutnya, muat ulang daemon systemd untuk menerapkan perubahan:
systemctl daemon-reload
Selanjutnya, mulai layanan Nginx dan aktifkan untuk memulai saat reboot sistem:
systemctl enable --now nginx
Anda dapat memeriksa status Nginx dengan perintah berikut:
systemctl status nginx
Anda akan mendapatkan 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 2021-11-08 09:59:48 UTC; 5s ago Process: 73046 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 73044 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 73043 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 73048 (nginx) Tasks: 2 (limit: 11411) Memory: 3.2M CGroup: /system.slice/nginx.service ├─73048 nginx: master process /usr/sbin/nginx └─73049 nginx: worker process Nov 08 09:59:48 rockylinux systemd[1]: Starting The nginx HTTP and reverse proxy server... Nov 08 09:59:48 rockylinux nginx[73044]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok Nov 08 09:59:48 rockylinux nginx[73044]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Nov 08 09:59:48 rockylinux systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Nov 08 09:59:48 rockylinux systemd[1]: Started The nginx HTTP and reverse proxy server.
Langkah 6 – Aktifkan Aturan ModSecurity
Anda dapat mengaktifkannya dengan perintah berikut:
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf
Juga, aktifkan log audit dengan perintah berikut:
sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf
Langkah 7 – Instal Set Aturan Inti ModSecurity OWASP
OWASP menyediakan aturan deteksi serangan umum untuk ModSecurity. Anda dapat mengunduhnya dengan perintah berikut:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Selanjutnya, ganti nama file konfigurasi aturan OWASP menggunakan perintah berikut:
cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}
Selanjutnya, tentukan aturan OWASP di file konfigurasi ModSecurity:
echo -e "Include owasp-crs/crs-setup.conf\nInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf
Selanjutnya, restart layanan Nginx untuk menerapkan perubahan:
systemctl restart nginx
Langkah 8 – Verifikasi ModSecurity
Pada titik ini, Nginx diinstal dan dikonfigurasi dengan dukungan ModSecurity. Sekarang saatnya untuk mengujinya.
Jalankan injeksi perintah berikut menggunakan perintah curl:
curl localhost/index.html?exec=/bin/bash
Jika semuanya baik-baik saja, Anda akan mendapatkan kesalahan “403 Forbidden” seperti yang ditunjukkan di bawah ini:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.19.10</center> </body> </html>
Anda juga dapat memverifikasi log ModSecurity untuk informasi lebih lanjut:
tail -100 /var/log/nginx/modsec_audit.log
Anda akan melihat output berikut:
---imefFQJy---D-- ---imefFQJy---E-- <html>\x0d\x0a<head><title>403 Forbidden</title></head>\x0d\x0a<body>\x0d\x0a<center><h1>403 Forbidden</h1></center>\x0d\x0a<hr><center>nginx/1.19.10</center>\x0d\x0a</body>\x0d\x0a</html>\x0d\x0a ---imefFQJy---F-- HTTP/1.1 403 Server: nginx/1.19.10 Date: Mon, 08 Nov 2021 10:00:55 GMT Content-Length: 154 Content-Type: text/html Connection: keep-alive ---imefFQJy---H-- ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:exec' (Value: `/bin/bash' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/bash found within ARGS:exec: /bin/bash"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "1636365655"] [ref "o1,8v21,9t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "1636365655"] [ref ""]
Kesimpulan
Dalam panduan di atas, kami menjelaskan cara menginstal ModSecurity dengan Nginx di Rocky Linux 8. Server web Nginx Anda sekarang diamankan dengan ModSecurity WAF. ModSecurity dapat melindungi server Anda dari berbagai serangan. Mulai hosting VPS dari Atlantic.Net hari ini!