Kita semua ingin membuat aplikasi aman agar data kita tidak bocor. Tetapi kita sering mendengar perusahaan dengan high‑profile terkena kasus kebocoran data hal ini mengingatkan kita bahwa keamanan sangatlah penting dan menantang. Dan dengan maraknya tools scanners, rootkit, dan alat berbahaya lainnya, semakin mudah bagi siapa pun yang memiliki sedikit pengetahuan teknis bisa meretas website.
Meskipun kebocoran data terasa seperti hal yang biasa, kita tetap harus mengambil semua tindakan pencegahan untuk melindungi aplikasi dan data kita. ModSecurity adalah open source tools yang digunakan oleh lebih dari satu juta website di seluruh dunia. ModSecurity melindungi terhadap berbagai serangan Layer 7, seperti SQL injection (SQLi), local file inclusion (LFI), and cross‑site scripting (XSS), yang menjadikan mayoritas 95% dari serangan Layer 7 yang diketahui pada Q1 2017, menurut Akamai https://content.akamai.com/am-en-pg8854-q1-17-soti-security.html.
Versi terbaru, ModSecurity 3.0, membuat terobosan baru dengan arsitektur modular yang berjalan secara native di NGINX. Versi sebelumnya hanya bekerja dengan Apache HTTP Server. Di blog ini kami menunjukkan cara membuat modul dinamis ModSecurity 3.0 untuk digunakan dengan NGINX Open Source.
1. Install Nginx dari Official Repository.
Install prerequisites packet untuk nginx:
$sudo apt install curl gnupg2 ca-certificates lsb-release
Mengatur repositori apt untuk paket nginx versi yang stabil.
$echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Selanjutnya, impor official nginx signing key sehingga apt dapat memverifikasi keaslian paket:
$curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
Verifikasi bahwa anda mendapatkan key yang tepat:
$
sudo apt-key fingerprint ABF5BD827BD9BF62
Output harus berisi full fingerprint 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 as follows:
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
uid [ unknown] nginx signing key <[email protected]>
Terakhirnya, pindahkan kunci ke penyimpanan kunci tepercaya (perhatikan perubahan ekstensi file “asc”):
$sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc
Untuk menginstal nginx, jalankan perintah berikut:
$sudo apt update
$sudo apt install nginx
2. Install Paket Prasyarat
Langkah selanjutnya adalah menginstal paket-paket yang diperlukan untuk Modsecurity. Perintah berikut, sesuai untuk sistem Ubuntu / Debian yang baru diinstal. Paket yang diperlukan berbeda untuk RHEL / CentOS / Oracle Linux.
$sudo apt-get install -y apt-utils autoconf automake build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
3. Download dan Compile ModSecurity 3.0 dari Source Code
Dengan menginstal paket prasyarat yang diperlukan, langkah selanjutnya adalah mengCompile ModSecurity sebagai modul dinamis NGINX. Dalam arsitektur modular baru ModSecurity 3.0, libmodsecurity ini adalah komponen inti yang mencakup semua aturan dan fungsionalitas. Komponen utama kedua dalam arsitektur adalah konektor yang menghubungkan libmodsecurity ke server web yang dijalankannya. Ada konektor terpisah untuk NGINX, Apache HTTP Server, dan IIS. Kami membahas konektor NGINX di bagian selanjutnya.
Untuk mengkompilasi libmodsecurity:
1. Clone GitHub repository:
$ git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
2.Pindah ke direktori ModSecurity dan Compile source code :
$ git submodule init$ git submodule update$ ./build.sh$ ./configure$ make$ make install$ cd ..
Kompilasi memakan waktu sekitar 15 menit, tergantung pada kekuatan pemrosesan sistem Anda.
Catatan: Aman untuk mengabaikan pesan seperti berikut ini selama proses Compile. Bahkan ketika error tersebut muncul, kompilasi selesai dan membuat objek kerja.
fatal: No names found, cannot describe anything.
4. Unduh Konektor NGINX untuk ModSecurity dan Compile sebagai Modul Dinamis
Compile konektor ModSecurity untuk NGINX sebagai modul dinamis untuk NGINX.
1. Clone GitHub repository:
$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
2. Tentukan versi NGINX mana yang berjalan di host tempat modul ModSecurity akan dimuat:
$ nginx -v
nginx version: nginx/1.22.1
3. Download source code yang sesuai dengan versi NGINX yang diinstal (Source code lengkap diperlukan meskipun hanya modul dinamis yang akan di compile ):
$ wget http://nginx.org/download/nginx-1.22.1.tar.gz
$ tar zxvf nginx-1.22.1.tar.gz
4. Compile modul dinamis dan copy ke standar direktori untuk modul:
$ cd nginx-1.21.0
$ ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
$ make modules
$ cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
$ cd ..
5. Load Modul Dinamis Konektor ModSecurity NGINX
Tambahkan config load_module berikut pada konfigurasi nginx pada baris yang paling atas di /etc/nginx/nginx.conf. Ini menginstruksikan NGINX untuk memuat modul dinamis ModSecurity saat memproses konfigurasi:
load_module modules/ngx_http_modsecurity_module.so;
6. Konfigurasi,enable dan test ModSecurity
Langkah terakhir adalah mengaktifkan dan menguji ModSecurity.
1. Siapkan file konfigurasi ModSecurity yang sesuai. Di sini kami menggunakan konfigurasi ModSecurity yang direkomendasikan yang disediakan oleh TrustWave Spiderlabs, sebagai sponsor perusahaan ModSecurity.
$ mkdir /etc/nginx/modsec
$ wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
$ mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
2. Untuk menjamin bahwa ModSecurity dapat menemukan file unicode.mapping (didistribusikan di direktori ModSecurity tingkat teratas dari repo GitHub), salin ke /etc/nginx/modsec.
$ cp ModSecurity/unicode.mapping /etc/nginx/modsec
3. Ubah nilai SecRuleEngine dalam konfigurasi untuk mengubah dari mode default “detection only”” menjadi aktif untuk melakukan blocking terhadap lalu lintas yang berbahaya.
$ sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
4. Untuk keperluan blog ini, kami membuat satu rules sederhana yang akan melakukan blocking permintaan di mana argumen URL yang disebut testparam menyertakan tes string dalam nilainya. Letakkan teks berikut di /etc/nginx/modsec/main.conf:
# From https://github.com/SpiderLabs/ModSecurity/blob/master/
# modsecurity.conf-recommended
# Edit to set SecRuleEngine On
Include "/etc/nginx/modsec/modsecurity.conf"
# Basic test rule
SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
Di Production Environment Anda harus menggunakan rules yang benar-benar melindungi dari lalu lintas berbahaya, seperti kumpulan rules inti OWASP core rule set. yang didaptkan dengan gratis.
5. Tambahkan modsecurity dan modsecurity_rules_file ke konfigurasi NGINX untuk mengaktifkan ModSecurity:
server {
# ...
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
}
6.Keluarkan perintah curl berikut. Kode status 403 mengonfirmasi bahwa rules berfungsi dengan baik.
$ curl localhost?testparam=test
<html> <head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.13.1</center> </body> </html>
7. Menambahkan rules OWASP Core Rule Set (CRS)
Untuk membuat ModSecurity melindungi aplikasi dan web Anda, Anda perlu menentukan rules untuk mendeteksi malicious actors dan mengeblock nya. Untuk pemula, adalah ide yang baik untuk menginstal set rules yang ada, sehingga Anda dapat memulai dengan cepat dan kemudian mempelajari seluk beluknya. Ada beberapa set rules gratis untuk ModSecurity. OWASP Core Rule Set (CRS) adalah set rules standar yang digunakan dengan ModSecurity dengan beberapa kelebihan sebagai berikut.
- OWASP CRS gratis, dikelola komunitas, dan kumpulan rules yang paling banyak digunakan yang menyediakan konfigurasi default yang dijual untuk ModSecurity.
- Ini berisi rules untuk membantu menghentikan vektor serangan umum, termasuk injeksi SQL (SQLi), skrip lintas situs (XSS), dan banyak lainnya.
- dapat berintegrasi dengan Proyek Honeypot.
- berisi aturan untuk mendeteksi bot dan pemindai.
- telah di tuning melalui paparan yang luas untuk meminimalisir false positive.
1. Clone latest OWASP CRS from GitHub dan extract.
$git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git$wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz$tar xvf v3.3.0.tar.gz
2. pindahkan ke directory /etc/nginx/modsec/. dan juga rename file crs-setup.conf.example.
$sudo mv owasp-modsecurity-crs/ /etc/nginx/modsec/
$sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/
$sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
3. Edit the main file konfigurasi. Tambahkan tiga baris berikut, yang akan membuat Nginx menyertakan file konfigurasi CRS dan rules individual.
$sudo nano /etc/nginx/modsec/main.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
Include /etc/nginx/modsec/owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
Simpan dan close file kemudian tes konfigurasi nginx. Jika tidak ada error dilanjutkan dengan restart nginx.
$sudo nginx -t
$sudo systemctl restart nginx
8. Testing
Untuk memeriksa apakah ModSecurity dengan OWASP Core Rule Set (CRS) berfungsi, Anda dapat meluncurkan serangan injeksi SQL sederhana di situs web Anda sendiri. (Harap dicatat bahwa melakukan pengujian keamanan di situs web orang lain tanpa izin adalah ilegal.) Masukkan URL berikut di browser web Anda.
https://domainmu.com/?id=3 or ‘a’=’a’
Jika ModSecurity berfungsi dengan baik, server web Nginx Anda akan menampilkan pesan kesalahan 403 Forbidden.

9.Whitelist URL
Pada saat kita menggunakan modsecurity sebagai Web Access firewall kadang Modsecurity melakukan pengeblockan terhadap URL aplikasi atau web kita. Jika hal tersebut false positive kita perlu mengedit rules default untuk menghilangkan hasil false positif. Kita dapat melakukan ini dengan membuat whitelist rules sesuai dengan kebutuhan aplikasi.
Sebagai contoh kita akan whitelist url login berikut ini yang saat ini terblock.
http://nginxmodsec.demos.xxxxxxx.com/login/index.html?exec=/bin/bash

Kita cek di log rules apa yang melakukan blocking pada url tersebut.

ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:exec' (Value: `/bin/bash' ) [file "/etc/nginx/modsec/owasp-modsecurity-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 "192.168.168.158"] [uri "/login/index.html"] [unique_id "1625126860"] [ref "o1,8v27,9t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
Setelah mendapatkan id log tersebut kita bisa whitelist url dari id rules tersebut.
Tambahkan rules berikut untuk whitelist url
http://nginxmodsec.demos.xxxxxxx.com/login/index.html?exec=/bin/bash
nano /etc/nginx/modsec/owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
SecRule REQUEST_URI “@beginsWith /login/” \
“id:1002,\
phase:1,\
pass,\
nolog,\
ctl:ruleRemoveById=932160″
Verifikasi config nginx dan restart nginx jika tidak terdapat error.
nginx -t
systemctl restart nginx
Coba refresh kembali, Maka url login bisa di akses tanpa ter block.

Kesimpulan.
ModSecurity adalah salah satu Web Applicatin Firewall paling tepercaya dan terkenal dalam keamanan aplikasi. Langkah-langkah yang diuraikan dalam blog ini mencakup cara Instalai nginx,mengkompilasi ModSecurity dari source code dan memuatnya ke dalam NGINX,kemudian menambahkan rules OWASP CRS Rules dan cara whitelist url.
Referensi:
https://medium.com/building-goalwise/how-to-implement-modsecurity-waf-with-nginx-15fdd42fa3
https://www.netnea.com/cms/nginx-tutorial-6_embedding-modsecurity/
https://coreruleset.org/20210305/announcing-a-partnership-with-nginx/
https://www.nginx.com/blog/nginx-announces-sponsorship-owasp-modsecurity-crs
https://www.nginx.com/blog/compiling-and-installing-modsecurity-for-open-source-nginx/