Nginx ModSecurity

ตัวอย่างการสร้าง Web Application Firewall ด้วยการติดตั้งและใช้งาน nginx with ModSecurity บน Ubuntu22.4 

Install nginx และ library ที่เกี่ยวข้อง

หากใช้งานผ่าน Proxy ด้วย Username Password ให้เข้าไป Set up ที่ APT ก่อน

# vim /etc/apt/apt.conf

เพิ่ม

Acquire::http::proxy "http://username:password@proxyURL:port/";

Update ระบบ เพื่อเตรียมทำการติดตั้ง

#apt update $$ apt upgrade

ตั้งค่า firewall สำหรับ Web

#ufw allow http

ติดตั้ง nginx

#apt install nginx


ติดตั้ง lib ที่เกี่ยวข้องกับการใช้งาน

#apt-get install bison build-essential ca-certificates curl dh-autoreconf doxygen flex gawk git iputils-ping libcurl4-gnutls-dev libexpat1-dev libgeoip-dev liblmdb-dev libpcre3-dev libpcre++-dev libssl-dev libtool libxml2 libxml2-dev locales libyajl-dev liblua5.3-dev pkg-config wget libxslt1-dev libgd-dev

configure nginx with ModSecurity

Copy ModSecurity เพื่อมาติดตั้งใช้งาน ที่path /opt

#git  clone https://github.com/Spiderlabs/ModSecurity

เข้าไปใน Folder ModSecurity ที่ clone มา และทำการติดตั้ง

#git submodule init

#git submodule update

#./build.sh

#./configure

#make

#make install

กลับมาที่path /opt เพื่อนำ ModSecurity  ของ nginx Copy มาใช้งาน

#git clone --depth 1 https://github.com/Spiderlabs/ModSecurity-nginx.git

เข้าไปใน Folder ModSecurity-nginx ที่ Clone มา

สามารถดู version ของ nginx ที่ติดตั้งไว้ด้วยคำสั่ง

$nginx -V

Download file nginx version ที่ติดตั้งมาใช้งาน

#wget https://nginx.org/download/nginx-1.8.0.tar.gz

unzip และเข้าไปใน folder nginx-1.18.0 ที่ unzipมา เพื่อทำการตั้งค่า configure และติดตั้ง module

#./configure --add-dynamic-module=../ModSecurity-nginx --with-cc-opt='-g -02 -ffile-prefix-map=/build/nginx-zctdR4/nginx-1.18.0=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-storang -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-nx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_V2_module --with-http_dev_module --with-http_slice_module --withthreads --with-http_addition_module --with-http_gzip_static_module --with-http_sub_midule

(ดู configuration argument  ของ nginx เพิ่มได้จาก #nginx -V เพื่อนำมาใช้งาน)

จากนั้นทำการ make modules

#make modules

สร้าง folder สำหรับ module nginx .o /etc/enginx/

#mkdir modules

copy ข้อมูล module ที่ download มาใช้

#cp /opt/nginx-1.18.0/objs/ngx_http_module.so /etc/nginx/modules


ตอนนี้ สามารถใช้งาน nginx modsecurity ได้แล้วโดย Default ของ modsecurity จะอยู่ใน mode detection ซึ่งสามารถดู log ได้ที่ 

#tail -f /var/log/modsec_audit.log

กลับไปที่ folder ที่เก็บ file /opt เพื่อ Download signature rule การโจมตีที่จะใช้งาน

#git clone https://github.com/coreruleset/coreruleset modsecurity-crs 

ทำการ copy rule set ไปใช้งาน

#cp /opt/modsecurity-crs/crs-setup.conf.example .opt/modsecurity-crs/crs-setup.conf

#cp /opt/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /opt/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

จากนั้นย้าย modsecurity-crs ไปไว้ที่ /usr/local

#mv modsecurity-crs /usr/local

สร้าง folder modsec เพื่อเก็บการตั้งค่า mapping nginxและmodsecurity และ copy unicode mapping ไปใช้งาน

#mkdir -p /etc/nginx/modsec 

#cp /opt/ModSecurity/unicode.mapping /etc/nginx/modsec

นำการตั้งค่าของ modsecurity ไปใช้งาน

#cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf 

จากนั้นแก้ไข file การตั้งค่า

ทำการแก้ไข  nginx modsecurity จาก DetectionOnly ให้อยู่ใน Mode on (เพื่อ ทำการ blockking ได้)

#vim /etc/nginx/modsec/modsecurity.conf

--------------------------------------------------

SecRuleEngine on

--------------------------------------------------

#vim /etc/nginx/modsec/main.conf

โดยเพิ่มข้อมูล การโหลด configuration ไปใช้งาน

---------------------------------------------------

include /etc/nginx/modsec/modsecurity.conf

include /usr/local/modsecurity-crs/crs-setup.conf

include /usr/local/modsecurity-crs/rules/*.conf

----------------------------------------------------

เพิ่ม modSecurity c]t rule เข้าไปใน site available ของ nginx ในที่นี้สามารถปรับเปลี่ยน service port ของ nginx ได้ (Default 80)

#vim /etc/nginx/sites-available/default 

ทำการ restart service nginx เพื่อ load การตั้งค่าใหม่ไปใช้งาน 

#/etcinit.d/nginx restart

ดูสถานะของ Service nginx ได้โดย

#/etcinit.d/nginx status

WAF Test

หน้า Web Default nginx แสดงโดยเปิด web browser จะแสดงอยู่ที่

http://localhost

ทดสอบ vulnerability จาก Web ได้โดยใช้ Address นี้

localhost/?input=../../../../../../etc/passwd

ซึ่ง modesecurity จะทำการ Block  โดยแสดง 

รายละเอียดแสดงใน Log 

#tail -f /var/log/modsec_audit.log

ตั้งค่า ใน file /etc/nginx/sites-available/default 

ให้ nginx Reverse Proxy ของ Site ที่กำหนด เมื่อมีการโจมตี โดยเพิ่ม

location site ใหม่ 

-----------------------------------------------

location /siteใหม่

------------------------------------------------

เพิ่มไว้ด้านใน {} ใน location 

------------------------------------------------

proxy_pass http://www.url.com 

------------------------------------------------

เพิ่ม app อื่น (Apache2) ใน Server เดียวกัน และทำการDetect จาก ModSecurity ก่อน redirect ไป Apache

ทำการติดตั้ง Apache2

#apt install apache2

ทำการแก้ไขการตั้งค่า Apache ให้ใช้ port ที่ไม่ซ้ำกับ nginx ในที่นี้ใช้ 8080

#vim /etc/apache2/ports.conf

และเพิ่มการตั้งค่าใน file /etc/nginx/sites-available/default 

โดยเพิ่ม locationใหม่

location /A1 {

...

proxy_pass http://localhost:8080;

proxy_set_header Host $host;

proxy_setheader X-Real-IP $remote_addr;

proxy_set_header XForward-For $proxy_add_x_forwarded_for;

...

}