Giới thiệu

ModSecurity là một công cụ có thể tích hợp với các web server như Apache, IIS, Nginx cho phép phân tích và ghi nhật ký các luồng dữ liệu HTTP/S. Đến thời điểm khi bài viết này được thực hiện, ModSecurity là mã nguồn Web Application FirewallWAF được sử dụng rộng rãi nhất. Phiên bản ModSecurity 2.8.0 là phiên bản ổn định được công bố đến thời điểm hiện tại. Hơn nữa, với sự đóng góp từ dự án ModSecurity Core Rule Set của tổ chức OWASP đã giúp ModSecurity trở nên mạnh mẽ và linh động hơn trong việc phân tích các hành vi có nguy cơ xâm hại an ninh ứng dụng web.

Một số tính năng mà ModSecurity kết hợp với CRSModSecurity Core Rule Set có thể thực hiện:

  • Theo dõi, phân tích luồng dữ liệu web theo thời gian thực
  • Virtual patching
  • Ghi nhận nhật ký luồng dữ liệu
  • Kiện toàn giao thức HTTP tại web server, bao gồm bộ lọc các lỗ hổng bảo mật web
  • Giảm thiểu tấn công từ chối dịch vụ (HTTP Flooding và Slow HTTP)
  • Ngăn chặn các công cụ quét tự động
  • Tích hợp công cụ quét virus, mã độc
  • Phát hiện lộ thông tin nhạy cảm (thẻ tín dụng)
  • Giảm thiểu lộ các thông tin lỗi trong ứng dụng web (Stacktrace, Error…)

Ngoài ra, bằng việc kết hợp nhuần nhuyễn các kỹ năng viết rule ModSecurity, bạn có thể tùy biến và tạo ra các tính năng mới cho ModSecurity mà không cần phải đầu tư các thiết bị phần cứng khác với giá thành cao.

Mô hình triển khai

ModSecurity hỗ trợ hai chế độ triển khai, bao gồm:

  • Phương pháp tích hợp vào web server
  • Phương pháp proxy

Không có phương pháp chính xác nào mà tôi có thể đề xuất cho bạn trong việc triển khai ModSecurity, bạn có thể chọn một trong những phương pháp mà tôi đề cập trên và đưa ra phương án tốt nhất cho hạ tầng mà bạn muốn bảo vệ. Tuy nhiên, tôi sẽ đề cập ngắn gọn một số tính chất trong mỗi phương án triển khai:

Tích hợp (embedded): ModSecurity là một module mở rộng cho web server Apache, do vậy nó hoàn toàn tương thích với hầu hết phiên bản Apache 2.0.x. Mô hình này được sử dụng trong trường hợp ứng dụng của bạn có tính mở rộng thấp, ít thay đổi kiến trúc ban đầu. Vấn đề mà bạn có thể gặp phải trong mô hình này là tài nguyên vật lý có thể bị hao tốn do chia sẻ tài nguyên giữ web server (Apache, PHP) và ModSecurity.

Mô hình tích hợp Apache và ModSecurity

Mô hình tích hợp Apache và ModSecurity

Proxy: trong mô hình triển khai ModSecurity như một proxy thì các vấn đề về tài nguyên sẽ được giảm thiểu, tăng khả năng mở rộng bên trong hạ tầng nội bộ (backend). Chức năng WAF được phân tách độc lập với máy chủ web, làm tăng khả năng tiếp nhận yêu cầu tại ModSecurity. Tuy nhiên, cần có những kế hoạch dự phòng trong việc xây dựng mô hình HA cho máy chủ proxy để tránh trình trạng quá tại tại một thời điểm hoặc các sự cố do hư hỏng vật lý.
Mô hình Proxy sử dụng Nginx và ModSecurity

Mô hình Proxy sử dụng Nginx và ModSecurity

Cài đặt Nginx tích hợp ModSecurity

modsecurity_nginx_reverse_proxy_model

Mô hình ModSecurity + Nginx

Cài đặt Nginx và ModSecurity

# curl -O https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
# curl -O http://nginx.org/download/nginx-1.7.9.tar.gz
# tar xvf nginx-1.7.9.tar.gz
# tar xvf modsecurity-2.8.0.tar.gz
# yum install httpd-devel
# cd modsecurity-2.8.0
# ./configure –enable-standalone-module –enable-pcre-jit –enable-lua-cache –disable-mlogc
# make -j4
# cd ../nginx-1.7.9/
# ./configure –with-pcre-jit –with-http_ssl_module –add-module=../modsecurity-2.8.0/nginx/modsecurity/ –your_options
# make -j4
# make install
# mkdir -p /usr/local/nginx/conf/waf/activated_rules
# cp ../modsecurity-2.8.0/modsecurity.conf-recommended /webserver/nginx/conf/waf/modsecurity.conf
Cần chắc chắn chỉ thị SecRuleEngine được cấu hình thành SecRuleEngine On thay tham số mặc định là DetectionOnly

Tham khảo: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#SecRuleEngine

Tại  tập tin cấu hình chính Nginx, tôi thực hiện chỉnh sửa nội dung chỉ thị access_log và error_log cho phép Nginx chuyển tiếp toàn bộ nội dung acces log và error log đến máy chủ log từ xa (rsyslog). Từ phiên bản >=1.7.1, Nginx cho phép ghi nhận log trực tiếp đến dịch vụ syslog, tham khảo thêm tại Logging to syslog

Chỉnh sửa nội dung tập tin /usr/local/nginx/conf/nginx.conf

nginx.conf

http {
……..

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$host”‘;

error_log syslog:server=10.0.8.14:5000,facility=local7,tag=nginx,severity=error;
access_log syslog:server=10.0.8.14:5000,facility=local7,tag=nginx,severity=info main;

……..

# vhost Settings
include vhost/*.conf;

}

Tạo tập tin vhost cho phép máy chủ Proxy chuyển tiếp các yêu cầu đến máy chủ ứng dụng bên trong mạng nội bộ. Đồng thời, tôi thực hiện bật tính năng tường lửa ứng dụng bằng chỉ thị ModSecurityEnable và ModSecurityConfig. Tạo tập tin /usr/local/nginx/conf/vhost/backend.conf

backend.conf

server {

server_name domain.com www.domain.com;

upstream backends {
server 10.0.8.4;
server 10.0.8.5;
server 10.0.8.6;
}

location / {

ModSecurityEnable on;

ModSecurityConfig waf/modsecurity.conf;

proxy_pass $scheme://$backends;
}

# browser cache
location ~* ^.+\.(ico|asf|asx|atom|avi|bmp|bz2|class|css|divx|doc|docx|eot|exe|gif|gz|gzip|htc|ico|jpe|jpeg|jpg|js|js2|js3|js4|json|m4a|m4|mdb|mid|midi|mov|mp3|mp4|mpe|mpeg|mpg|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|qt|ra|ram|rar|rss|rtf|svg|svgz|swf|tar|tgz|tif|tiff|ttc|ttf|wav|wax|wma|wmv|wmx|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {

try_files $uri =404;
add_header Pragma “public”;
add_header Cache-Control “public”;
expires 1w;

proxy_pass $scheme://$backends;

access_log off;
log_not_found off;

}

}

ModSecurity Core Rule Set

owasp_crs

Cấu trúc mã nguồn ModSecurity Core Rule Set

Thực hiện chuyển các thông tin cấu hình trong tập tin modsecurity_crs_10_setup.conf.example vào cấu hình ModSecurity tại đường dẫn /webserver/nginxt/conf/waf/modsecurity.conf

modsecurity.conf

# cat modsecurity_crs_10_setup.conf.example >> /usr/local/nginx/conf/waf/modsecurity.conf
# echo “include /usr/local/nginx/conf/waf/activated_rules/*.conf” >> /usr/local/nginx/conf/waf/modsecurity.conf
Thực hiện kiểm tra hoạt động của ModSecurity và 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
Theo dõi tại tập tin /usr/local/nginx/logs/error.log ta có thể thấy các thông tin do ModSecurity thông báo

error.log

# tailf /usr/local/nginx/logs/error.log
…….
2015/01/16 13:01:59 [notice] 15797#0: ModSecurity for nginx (STABLE)/2.8.0 (http://www.modsecurity.org/) configured.
2015/01/16 13:01:59 [notice] 15797#0: ModSecurity: APR compiled version=”1.4.8″; loaded version=”1.4.8″
2015/01/16 13:01:59 [notice] 15797#0: ModSecurity: PCRE compiled version=”8.32 “; loaded version=”8.32 2012-11-30″
2015/01/16 13:01:59 [notice] 15797#0: ModSecurity: LUA compiled version=”Lua 5.1”
2015/01/16 13:01:59 [notice] 15797#0: ModSecurity: LIBXML compiled version=”2.9.1

Honeypot

Hệ thống honeypot thường được triển khai với mục đích thu thập thông tin liên quan đến tin tặc hoặc các sự kiện gây nguy cơ mất an ninh đến hệ thống của bạn, honeypot đóng vai trò khá quan trọng trong việc giúp cảnh báo sớm các nguy cơ tấn công trước khi có một cuộc tấn công thực sự xảy ra. Trong phần tiếp theo, tôi sẽ trình bày 5 phương pháp sử dụng ModSecuriy như một Honeypot để “bẫy” các hoạt động nguy cơ bảo mật phát sinh từ bên ngoài.

Yêu cầu khởi động lại dịch vụ Nginx sau khi thực hiện cập nhật rule ModSecurity
1. Sử dụng cổng dịch vụ giả

Với ý tưởng này, quản trị viên hệ thống có thể tạo ra một cổng dịch vụ lắng nghe trên máy chủ proxy. Đồng thời, bạn sẽ thực hiện cấu hình rule cảnh báo các kết nối đến cổng dịch vụ giả này nhằm ghi nhận các sự kiện như quét cổng máy chủ web.
Chú ý: bạn cần cấu hình Nginx lắng nghe trên một cổng dịch vụ khác cổng 80 hoặc 443 để tránh trùng lắp cổng dịch vụ ứng dụng.

Tôi thực hiện tạo một vhost tại nginx cho phép lắng nghe tại cổng 80458049bằng cách tạo tập tin /usr/local/nginx/conf/vhost/honeypot_fake_ports.conf

honeypot_fake_ports.conf

server {

listen 8045 default_server;
listen 8049 default_server;
root html;
access_log logs/honeypot_access.log;
error_log logs/honeypot_error.log;
index index.html;

}

Sau khi thực hiện tạo cổng dịch vụ giả tại Nginx, tôi tiếp tục tạo một rule ModSecurity thực hiện ghi nhận các hành vi kết nối đến các cổng này tại tập tin cấu hình /usr/local/nginx/conf/waf/activated_rules/detect_fake_ports.conf  

detect_fake_ports.conf

SecRule SERVER_PORT “^(8045|8049)$” \
“id:’999004′,phase:2,t:none,log,block,msg:’HoneyTrap Alert: Traffic Received on Fake Port.’,setvar:ip.malicious_client=1”
#
# Check IP Collection for the ip.malicious_client variable.
#
SecRule &IP:MALICIOUS_CLIENT “@eq 1” \
“id:’999005′,phase:2,t:none,log,block,msg:’HoneyTrap Alert: Known Malicious Client.'”
2. Sử dụng các trường robots.txt giả

Robots Exclusion Standard là một tiêu chuẩn nhằm hướng dẫn cách thức tạo chỉ mục web  cho các công cụ tìm kiếm ngày nay. Trong phương pháp này, tập tin robots.txt sẽ ngăn cản/cho phép các công cụ tìm kiếm truy cập vào một liên kết mà người quản trị website không muốn hiển thị trong các kết quả tìm kiếm của Google, Bing, Baidu v.v…

robots.txt

User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/themes
Disallow: /wp-content/plugins
Disallow: /search?q=*
Tuy nhiên, nguy cơ tạo ra từ tập tin robots.txt là cho phép tin tặc có thể thu thập các thông tin về đường dẫn, tập tin nhạy cảm để phục vụ cho các bước khai thác tiếp theo vào ứng dụng. Để bảo đảm các đường dẫn này tồn tại và có thể khai thác được, hầu hết các công cụ quét lỗ hổng bảo mật hoặc chính bản thân tin tặc bắt buộc phải thực hiện truy cập vào các đường dẫn này để xác nhận tính hiệu lực của nó. Bằng cách này, tôi thực hiện tạo rule ModSecurity cho phép chèn các dữ liệu giả vào liên kết robots.txt, nhằm đánh lừa các công cụ quét lỗ hổng bảo mật truy cập đến các liên kết giả để thực hiện ghi nhận các hành vi tạo ra nguy cơ mất an ninh trong ứng dụng. Tôi tiến hành tạo tập tin /usr/local/nginx/conf/waf/honeypot_fake_robots.conf

honeypot_fake_robots.conf

SecContentInjection On

SecRule REQUEST_FILENAME “@streq /robots.txt” \
“id:’999005′,phase:4,t:none,nolog,pass,append:’Disallow: /db_backup.%{time_epoch}/ # Old DB crash data'”

Tiếp theo, tôi tiến hành tạo rule ModSecurity ghi nhận các hoạt động truy cập vào các liên kết giả để thực hiện phân tích nguồn IP truy cập.

honeypot_fake_robots.conf

SecRule REQUEST_FILENAME “^/db_backup.\d{10}” “chain,id:’999012′,phase:1,t:none,log,msg:’HoneyTrap Alert: Attempt to Fake Resource.’,logdata:’Credentials used: %{matched_var}'”
3. Sử dụng HTML comment giả

Ngôn ngữ HTML cung cấp các cú pháp cho phép lập trình viên tích hợp các thông tin ghi chú (comment) vào bên trong mã HTML, các thẻ này sẽ không được trình duyệt hiển thị tại giao diện web mà chỉ có thể thấy thông qua phương pháp xem mã nguồn HTML. Bạn có thể tìm thấy nội dung mô tả này tại RFC.

Comments

3.2.5. Comments

To include comments in an HTML document, use a comment declaration. A
comment declaration consists of `<!’ followed by zero or more comments followed by `>’. Each comment starts with `–‘ and includes
all text up to and including the next occurrence of `–‘. In a
comment declaration, white space is allowed after each comment, but
not before the first comment. The entire comment declaration is
ignored.

NOTE – Some historical HTML implementations incorrectly consider
any `>’ character to be the termination of a comment.

Chức năng trong Burpsuite cho phép tìm kiếm các ghi chú trong mã nguồn HTML

Chức năng trong Burpsuite cho phép tìm kiếm các ghi chú trong mã nguồn HTML

Để tiến hành phương pháp bẫy bằng các ghi chú giả trong nội dung trang HTML, tôi thực hiện rule ModSecurity với nội dung tập tin /usr/log/nginx/waf/activated_rules/honeypot_fake_comments.conf

honeypot_fake_comments.conf

SecContentInjection On
SecStreamOutBodyInspection On

SecRule REQUEST_FILENAME “@streq /secrectadmin/login.php” “chain,id:’999007′,phase:4,t:none,nolog,pass,setvar:’tx.form_comment_honeytrap=<form action=\”login.php\” method=\”post\”>'”

SecRule STREAM_OUTPUT_BODY “@rsub s/%{tx.form_comment_honeytrap}/%{tx.form_comment_honeytrap}/d”

SecRule REQUEST_FILENAME “@streq /login.php.bak” “id:’999008′,phase:1,t:none,log,block,msg:’HoneyTrap Alert: Fake HTML Comment Data Used.’,setvar:ip.malicious_client=1”

4. Sử dụng các form ẩn giả
Các form tại Twitter.com
Các form ẩn tại Twitter.com
Để tiến hành phương pháp bẫy bằng các form giả, tôi thực hiện rule ModSecurity với nội dung tập tin /usr/log/nginx/waf/activated_rules/honeypot_fake_hidden_forms.conf

honeypot_fake_hidden_forms.conf

SecContentInjection On
SecStreamOutBodyInspection On

# Thêm một form ẩn với tên biến là “debug”
#
#Dưới đây là danh sách một số tên biến/giá trị có thể sử dụng
#
# – debug=false
# – debug=0
# – role=user
# – role=1
# – admin=false
# – admin=0
#
#  Cần chắc chắn rằng các thông tin về tên biến/giá trị trong phần rule bên dưới trùng khớp với giá trị mà bạn sử dụng
#

SecRule STREAM_OUTPUT_BODY “@rsub s/<\/form>/<input type=\”hidden\” name=\”debug\” value=\”false\”><\/form>/” “id:’999009′,phase:4,t:none,nolog,pass”

SecRule ARGS:debug “!@streq false” “id:’999010′,phase:2,t:none,log,block,msg:’HoneyTrap Alert: Fake HIDDEN Form Data Manipulated.’,setvar:ip.malicious_client=1”

5. Sử dụng cookie giả

Để tiến hành phương pháp bẫy bằng các cookie giả, tôi thực hiện rule ModSecurity với nội dung tập tin /usr/log/nginx/waf/activated_rules/honeypot_fake_cookies.conf

honeypot_fake_cookies.conf

SecRule RESPONSE_HEADERS:Set-Cookie “^(.*?)=” “id:’999013′,phase:3,t:none,nolog,pass,capture,setenv:honeytrap_cookie_name=%{tx.1}-user_role”

Header always set Set-Cookie “%{HONEYTRAP_COOKIE_NAME}e=Admin:0” SecRule REQUEST_HEADERS:Cookie “@contains %{global.honeytrap_cookie_name}” “chain,id:’999014′,phase:1,t:none,log,block,msg:’HoneyTrap Alert: Fake Cookie Data Manipulation'”
SecRule REQUEST_HEADERS:Cookie “!@contains =Admin:0” “setvar:ip.malicious_client=1”

Kết luận

Bằng việc kết hợp sử dụng Nginx và các rule ModSecurity, người dùng có thể tự xây dựng một máy chủ honeypot để phát hiện sớm các hành vi của botnet hoặc người dùng có ý định xâm nhập vào ứng dụng web. Chi phí đầu tư thấp, được cộng đồng nguồn mở hỗ trợ liên tục, Modsecurity xứng đáng là mã nguồn WAF đứng đầu danh sách các dự án bảo vệ ứng dụng Web.

Các bài viết liên quan đến ModSecurity bạn có thể tìm thấy tại http://btis.vn/tag/modsecurity