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 จะแสดงอยู่ที่
ทดสอบ 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;
...
}