Konfigurasikan LibModsecurity dengan Nginx di CentOS 8

Dalam panduan ini, kita akan mempelajari cara mengkonfigurasi LibModsecurity dengan Nginx di CentOS 8. LibMosecurity adalah versi terbaru dari ModSecurity versi 2.9 ke bawah. Oleh karena itu dikenal sebagai ModSecurity versi 3.

Konfigurasikan LibModsecurity dengan Nginx di CentOS 8

Jalankan Pembaruan Sistem

Mulailah dengan memperbarui paket sistem Anda.

dnf update

Instal Alat dan Ketergantungan Bangun yang Diperlukan

Baik Nginx dan LibModsecurity akan dikompilasi dari sumbernya dan oleh karena itu diperlukan sejumlah alat bantu dan dependensi. Jalankan perintah di bawah ini untuk menginstalnya.

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

Instal Perpustakaan GeoIP

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
dnf --enablerepo=remi install GeoIP-devel

Download Kode Sumber LibModsecurity

Buat direktori sementara untuk menyimpan tarball sumber.

mkdir /tmp/modsec

Anda dapat memilih untuk menggunakan /optsebagai gantinya.

Jalankan perintah di bawah ini untuk mengkloning repositori GitHub LibModsecurity terbaru.

cd /tmp/modsec
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity

Kompilasi dan Instal LibModsecurity

Arahkan ke direktori sumber LibModsecurity, konfigurasikan, kompilasi, dan instal

cd ModSecurity

Download kode libInjection yang tersedia sebagai bagian dari kode sumber ModSecurity dalam format git-submodule

git submodule init git submodule update

Konfigurasikan LibModsecurity untuk menyesuaikannya dengan sistem Anda dan periksa apakah ada ketergantungan yang diperlukan yang hilang.

./build.sh./configure

Itu fatal: No names found, cannot describe anythingdapat diabaikan dengan aman. Perbaiki masalah ketergantungan jika ada.

Kompilasi dan instal LibModSecurity.

make
make install

Instal Nginx dengan Dukungan LibModsecurity

Untuk mengatur Nginx dengan LibModsecurity, Anda perlu mengkompilasi Nginx dengan dukungan untuk LibModsecurity.

Oleh karena itu, download konektor ModSecurity-nginx yang menyediakan saluran komunikasi antara Nginx dan LibModsecurity dengan mengkloning repositori git-nya.

cd /tmp/modsec git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Selanjutnya, download Nginx versi pokok terbaru dari downloadan Nginx. Versi terbaru pada tulisan ini adalah versi nginx-1.17.6.tar.gz.

wget http://nginx.org/download/nginx-1.17.6.tar.gz

Ekstrak arsip.

tar xzf nginx-1.17.6.tar.gz

Buat user dan grup sistem Nginx yang tidak memiliki hak istimewa.

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

Arahkan ke direktori sumber Nginx dan konfigurasikan.

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=/tmp/modsec/ModSecurity-nginx

Kompilasi dan instal Nginx.

make make install

Konfigurasi Nginx dengan ModSecurity

Untuk memulainya, copy contoh file konfigurasi ModSecurity pada direktori sumber ke direktori konfigurasi Nginx.

cp /tmp/modsec/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf

Copy  unicode.mapping file dari direktori sumber ModSecurity ke direktori konfigurasi Nginx.

cp /tmp/modsec/ModSecurity/unicode.mapping /usr/local/nginx/conf/

Selanjutnya, edit file konfigurasi Nginx dan buat perubahan seperti yang ditunjukkan di bawah ini.

Buat cadangan file konfigurasi Nginx.

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

Buka file konfigurasi untuk diedit.

vim /usr/local/nginx/conf/nginx.conf

Konfigurasikan Nginx sehingga konfigurasi Anda mungkin terlihat seperti;

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.kifarunix-demo.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; } } }

Perhatikan bahwa garis;

modsecurity on; modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf;

Mengaktifkan Modsecurity dan menentukan lokasi aturan Modsecurity.

Perhatikan bahwa ModSecurity 3 dapat diaktifkan per basis direktori.

Buat direktori log Nginx.

mkdir /var/log/nginx

Buat Layanan Sistem Nginx

Untuk dapat menjalankan Nginx sebagai service, buat service systemd seperti gambar di bawah ini;

vim /etc/systemd/system/nginx.service
[Unit] Description=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

Buat tautan simbolis biner Nginx ke /usr/sbin/jalur.

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

Reload konfigurasi systemd.

systemctl daemon-reload

Jalankan verifikasi error sintaks konfigurasi Nginx.

nginx -t
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

Jika semuanya baik-baik saja, mulai dan aktifkan Nginx untuk berjalan pada boot sistem.

systemctl enable --now nginx

Periksa statusnya;

systemctl status nginx
● nginx.service - nginx HTTP and reverse proxy server Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2019-11-30 09:52:05 EAT; 9s ago Process: 2679 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 2678 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 2676 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 2681 (nginx) Tasks: 2 (limit: 11524) Memory: 3.5M CGroup: /system.slice/nginx.service ├─2681 nginx: master process /usr/sbin/nginx └─2682 nginx: worker process...

Nyalakan Mesin Aturan ModSecurity

Secara default, ModSecurity diatur pada mode hanya deteksi di mana ia hanya mencatat permintaan berdasarkan aturan yang dipicu tanpa memblokir apa pun. Ini dapat diubah dengan mengatur nilai  SecRuleEngine ke  On.

sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine
 On/' /usr/local/nginx/conf/modsecurity.conf

Anda juga dapat mengubah direktori log default untuk Modsecurity

sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf

Instal OWASP ModSecurity Core Rule Set (CRS)

Itu OWASP ModSecurity Core Rule Set (CRS) adalah seperangkat aturan deteksi serangan umum untuk digunakan dengan ModSecurity. Ini bertujuan untuk melindungi aplikasi web dari berbagai serangan, termasuk Sepuluh Teratas OWASP, minimum peringatan palsu.

Kloning CRS dari  repositori GitHub  ke  /usr/local/nginx/conf/ seperti yang ditunjukkan di bawah ini;

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

Selanjutnya ganti nama  crs-setup.conf.example menjadi  crs-setup.conf.

sudo cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}

Setelah aturan OWASP diterapkan, konfigurasikan ModSecurity untuk menggunakan aturan ini. Oleh karena itu, Anda perlu memasukkan baris berikut pada file konfigurasi ModSecurity untuk memberi tahu di mana menemukan aturannya.

echo -e "Include owasp-crs/crs-setup.confnInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf

Perintah ini akan menambahkan baris di bawah ini pada /usr/local/nginx/conf/modsecurity.conf.

Include owasp-crs/crs-setup.conf Include owasp-crs/rules/*.conf

Verifikasi file konfigurasi Nginx lagi.

nginx -t

Selanjutnya, restart Nginx jika semuanya Oke.

systemctl restart nginx

Menguji ModSecurity di Nginx

Selanjutnya, Anda dapat menguji efektivitas Modsecurity dengan aturan OWASP, misalnya menggunakan injeksi perintah. Jalankan perintah di bawah ini;

curl localhost/index.html?exec=/bin/bash

Anda harus mendapatkan 403 Forbidden jika aturan adalah file.

<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.6</center> </body> </html>

Periksa file log.

tail /var/log/nginx/mod
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 "157509875732.654695"] [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 "79"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver ""] [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 "157509875732.654695"] [ref ""] ModSecurity: Warning. Matched "Operator `Ge' with parameter `5' against variable `TX:INBOUND_ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "76"] [id "980130"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [tag "event-correlation"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509875732.654695"] [ref ""]

Anda juga dapat membuat aturan pengujian sendiri. Misalnya, tambahkan baris di bawah ini pada file /usr/local/nginx/conf/modsecurity.conf.

SecRule ARGS "@streq test" "id:1,phase:1,deny,msg:'Mytest Rule'"

Simpan file konfigurasi. Anda juga dapat membuat file aturan khusus dan memastikannya disertakan pada file konfigurasi ModSecurity utama.

Mulai ulang Nginx.

systemctl restart nginx

Uji aturannya.

curl localhost/index.html?a=test
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.6</center> </body> </html>

Periksa file log.

ModSecurity: Access denied with code 403 (phase 1). Matched "Operator `StrEq' with parameter `test' against variable `ARGS:a' (Value: `test' ) [file "/usr/local/nginx/conf/modsecurity.conf"] [line "254"] [id "1"] [rev ""] [msg "'Mytest Rule'"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509886780.823503"] [ref "v18,4"]

ModSecurity sekarang menjalankan dan melindungi server web Anda. Itu menandai akhir dari tutorial kami tentang cara mengkonfigurasi LibModsecurity dengan Nginx di CentOS 8.

Jika Anda ingin menjalankan aplikasi web tertentu yang memerlukan LAMP stack/LEMP stack, Anda dapat mengikuti tautan di bawah ini untuk menyiapkan LEMP/LAMP stack di CentOS 8.

Instal LEMP Stack di CentOS 8

Instal LAMP Stack di CentOS 8

Anda dapat memeriksa panduan kami yang lain tentang ModSecurity dengan mengikuti tautan di bawah ini;

Instal LibModsecurity dengan Apache di Ubuntu 18.04

Instal LibModsecurity dengan Apache di Fedora 30/29/CentOS 7