1. Tổng quan
WAF là viết tắt của “Web Application Firewall”. Đây là một loại tường lửa (firewall) được sử dụng để bảo vệ các ứng dụng web khỏi các cuộc tấn công bằng cách giám sát, chặn và phát hiện các hoạt động bất thường. WAF có thể giúp ngăn chặn các cuộc tấn công như SQL injection, cross-site scripting, và các cuộc tấn công khác nhằm vào các lỗ hổng bảo mật của ứng dụng web. Nó hoạt động bằng cách phân tích các request HTTP và sử dụng các quy tắc (rule) để xác định các hành vi độc hại.
WAF là một phần quan trọng trong việc bảo vệ ứng dụng web và đảm bảo an toàn cho dữ liệu của người dùng.
2. Yêu cầu
| Application | Version | |
|---|---|---|
| OS | Ubuntu 20.04 | |
| HAProxy | v2.7.0 | |
| ModSecurity | v3.0.9 | |
| OWASP ModSecurity CRS | v3.3.4 |
Cài đặt package dependencies
Cài đặt một số dependencies phục vụ cho quá trình build các packages:
$ sudo apt install build-essential doxygen valgrind libyajl-dev libgeoip-dev liblmdb-dev \ liblua5.3-dev libpcre2-dev libxml2-dev libcurl4-openssl-dev \ libfuzzy-dev libevent-dev libpcre3-dev libssl-dev libsystemd-dev jq3. Cài đặt
Cài đặt ModSecurity
$ sudo mkdir /etc/modsecurity$ wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.9/modsecurity-v3.0.9.tar.gz$ tar xzvf modsecurity-v3.0.9.tar.gz$ cd modsecurity-v3.0.9$ ./configure --prefix=/usr/local/modsecurity-3.0.9 --with-lua --with-pcre2 --with-lmdb$ make -j $(nproc)$ sudo make install$ sudo ln -s /usr/local/modsecurity-3.0.9 /usr/local/modsecurity$ sudo cp modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf$ sudo cp unicode.mapping /etc/modsecurityCài đặt spoa-modsecurity
$ git clone https://github.com/FireBurn/spoa-modsecurity.git$ cp -r /usr/local/modsecurity/include/modsecurity spoa-modsecurity/include$ cd spoa-modsecurity$ sed -i 's/ModSecurity-v3.0.5\/INSTALL\/usr\/local\/modsecurity\/include/\/usr\/local\/modsecurity\/include\/modsecurity/g' Makefile$ sed -i 's/ModSecurity-v3.0.5\/INSTALL\/usr\/local\/modsecurity\/lib/\/usr\/local\/modsecurity\/lib/g' Makefile$ make$ sudo make installTạo file modsec systemd
$ sudo vim /usr/lib/systemd/system/modsecurity.service[Unit]Description=Modsecurity StandaloneAfter=network.target[Service]Environment=LD_LIBRARY_PATH=/usr/local/modsecurity/lib/Environment="CONFIG=/etc/modsecurity/modsecurity.conf" "EXTRAOPTS=-d -n 1"ExecStart=/usr/local/bin/modsecurity $EXTRAOPTS -f $CONFIGExecReload=/usr/local/bin/modsecurity $EXTRAOPTS -f $CONFIGExecReload=/bin/kill -USR2 $MAINPIDRestart=alwaysType=simple[Install]WantedBy=multi-user.targetCài đặt OWASP ModSecurity CRS
$ wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.4.tar.gz -O coreruleset-v3.3.4.tar.gz$ tar xzvf coreruleset-v3.3.4.tar.gz$ sudo mv coreruleset-3.3.4 /usr/local/coreruleset-3.3.4$ sudo ln -sf /usr/local/coreruleset-3.3.4 /usr/local/coreruleset$ cd /usr/local/coreruleset$ sudo mv crs-setup.conf.example crs-setup.conf$ sudo mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf$ sudo mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confThêm các dòng sau vào file /etc/modsecurity/modsecurity.conf
$ sudo vim /etc/modsecurity/modsecurity.confinclude /usr/local/coreruleset/crs-setup.confinclude /usr/local/coreruleset/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.confinclude /usr/local/coreruleset/rules/REQUEST-901-INITIALIZATION.confinclude /usr/local/coreruleset/rules/REQUEST-905-COMMON-EXCEPTIONS.confinclude /usr/local/coreruleset/rules/REQUEST-910-IP-REPUTATION.confinclude /usr/local/coreruleset/rules/REQUEST-911-METHOD-ENFORCEMENT.confinclude /usr/local/coreruleset/rules/REQUEST-912-DOS-PROTECTION.confinclude /usr/local/coreruleset/rules/REQUEST-913-SCANNER-DETECTION.confinclude /usr/local/coreruleset/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.confinclude /usr/local/coreruleset/rules/REQUEST-921-PROTOCOL-ATTACK.confinclude /usr/local/coreruleset/rules/REQUEST-930-APPLICATION-ATTACK-LFI.confinclude /usr/local/coreruleset/rules/REQUEST-931-APPLICATION-ATTACK-RFI.confinclude /usr/local/coreruleset/rules/REQUEST-932-APPLICATION-ATTACK-RCE.confinclude /usr/local/coreruleset/rules/REQUEST-933-APPLICATION-ATTACK-PHP.confinclude /usr/local/coreruleset/rules/REQUEST-941-APPLICATION-ATTACK-XSS.confinclude /usr/local/coreruleset/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.confinclude /usr/local/coreruleset/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.confinclude /usr/local/coreruleset/rules/REQUEST-949-BLOCKING-EVALUATION.confinclude /usr/local/coreruleset/rules/RESPONSE-950-DATA-LEAKAGES.confinclude /usr/local/coreruleset/rules/RESPONSE-951-DATA-LEAKAGES-SQL.confinclude /usr/local/coreruleset/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.confinclude /usr/local/coreruleset/rules/RESPONSE-953-DATA-LEAKAGES-PHP.confinclude /usr/local/coreruleset/rules/RESPONSE-954-DATA-LEAKAGES-IIS.confinclude /usr/local/coreruleset/rules/RESPONSE-959-BLOCKING-EVALUATION.confinclude /usr/local/coreruleset/rules/RESPONSE-980-CORRELATION.confinclude /usr/local/coreruleset/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confCài đặt HAProxy
$ wget https://github.com/haproxy/haproxy/archive/refs/tags/v2.7.0.tar.gz -O haproxy-v2.7.0.tar.gz$ tar xzvf haproxy-v2.7.0.tar.gz$ cd haproxy-2.7.0$ make -j $(nproc) TARGET=linux-glibc \USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1$ sudo make install$ sudo vim /etc/haproxy/spoe-modsecurity.conf[modsecurity] spoe-agent modsecurity-agent messages check-request option var-prefix modsec timeout hello 100ms timeout idle 30s timeout processing 15ms use-backend spoe-modsecurity spoe-message check-request args unique-id src src_port dst dst_port method path query req.ver req.hdrs_bin req.body_size req.body event on-frontend-http-requestCập nhật file /etc/haproxy/haproxy.cfg
$ vim /etc/haproxy/haproxy.cfgfrontend https-inunique-id-format % { +X } o\ %ci:%cp_%fi:%fp_%Ts_%rt:%pidunique-id-header X-Unique-IDlog-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/ %bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %[unique-id]"filter spoe engine modsecurity config /etc/haproxy/spoe-modsecurity.confhttp-request deny if { var(txn.modsec.code) -m int gt 0 }backend spoe-modsecuritymode tcpbalance roundrobintimeout connect 5stimeout server 3mserver modsec1 127.0 . 0.1 :12345$ haproxy -c -f haproxy.cfgConfiguration file is valid$ sudo systemctl enable --now modsecurityCheck WAF Operation
Log ModSec sẽ được lưu trong file audit log. Bạn có thể đọc file audit log để kiểm tra xem CRS đã hoạt động chính xác chưa. Đường dẫn audit log có thể được thay đổi trong file modsecurity.conf
Sau khi chỉnh sửa file configuration, luôn phải restart ModSec service
$ sudo vim /etc/modsecurity/modsecurity.confSecAuditLogType SerialSecAuditLog /var/log/modsecurity/modsec_audit.logSecAuditLogFormat JSON$ sudo mkdir -p /var/log/modsecurity/$ sudo systemctl restart modsecurityThử gọi một bad request và check audit log
$ curl -I https://example.com/?../etc/passwd$ cat /var/log/modsecurity/modsec_audit.log
Có thể dùng jq để xem log dưới dạng json
$ cat /var/log/modsecurity/modsec_audit.log | jq |

Ở cấu hình mặc định, ModSec chỉ chạy với mode DetectionOnly, là phát hiện các truy cập bất thường và log lại chứ không xử lý.
Giờ ta sẽ enable Rule để block mọi truy cập bất thường:
$ sudo vim /etc/modsecurity/modsecurity.confSecRuleEngine On
Truy cập vào web bằng một URL đáng ngờ và ta sẽ bị chặn lại:

>> Đọc thêm các bài viết công nghệ hữu ích khác tại Tin tức
>> Trải nghiệm ngay hệ sinh thái Sunteco Cloud






