如何在 Ubuntu 22.04 安裝 NGINX 與 ModSecurity

Ivan Cheng
14 min readAug 28, 2024

ModSecurity 是一個開源的 Web 應用防火牆 (WAF) 模組,旨在保護 Web 應用免受各種安全威脅。能夠實時監控和過濾 HTTP 流量,以阻止惡意攻擊。

主要功能如下

  • 入侵防護:可以識別並阻止多種類型的 Web 攻擊,如 SQL 注入 (SQL Injection)、跨站腳本攻擊 (XSS)、跨站點請求偽造 (CSRF) 等。
  • 監控記錄:提供 HTTP 請求和回應的詳細日誌,可以幫助分析攻擊的特徵和來源。
  • 靈活的規則引擎:可以根據需要自訂規則,針對特定的應用環境和威脅情境進行調整。
  • 與 OWASP CRS 整合:OWASP Core Rule Set (CRS) 與 ModSecurity 的結合,能夠顯著增強 Web 應用的安全性。

首先,安裝 Ubuntu 22.04 並更新更新軟體套件。

sudo apt update
sudo apt upgrade

安裝 ModSecurity

安裝編譯 ModSecurity 所需的函式庫

sudo apt install gcc make build-essential autoconf automake libtool \
libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config \
libgeoip-dev libyajl-dev doxygen libpcre++-dev libpcre2-16-0 libpcre2-dev \
libpcre2-posix3 zlib1g zlib1g-dev -y

下載、編譯與安裝 ModSecurity

cd /opt
sudo git clone https://github.com/owasp-modsecurity/ModSecurity.git

cd ModSecurity
sudo git submodule init
sudo git submodule update

sudo ./build.sh
sudo ./configure

sudo make
sudo make install

下載 Modsecurity NGINX 連接器

ModSecurity NGINX 連接器做為 NGINX 和 ModSecurity 之間的通訊通道,需要它才能將 ModSecurity 與 NGINX 結合使用。

下載 Modsecurity Nginx 連接器,我們稍後將使用它。

cd /opt
sudo git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git

安裝 NGINX

接著從 ondrej PPA 安裝最新版本的 NGINX。

sudo add-apt-repository ppa:ondrej/nginx -y
sudo apt update
sudo apt install nginx -y

設定開機時啟動 NGINX

sudo systemctl enable nginx
sudo systemctl status nginx

檢查我們的 NGINX 版本

sudo nginx -v
nginx version: nginx/1.26.2

下載相同版本的 NGINX 原始碼,解壓縮並將目錄變更為 NGINX 來源。

cd /opt
sudo wget https://nginx.org/download/nginx-1.26.2.tar.gz
sudo tar -xzvf nginx-1.26.2.tar.gz
cd nginx-1.26.2

配置 NGINX 原始碼,加入 ModSecurity NGINX 連接器,並重新編譯模組。

sudo ./configure --with-compat --add-dynamic-module=/opt/ModSecurity-nginx

sudo make
sudo make modules

將編譯好的模組複製到 NGINX 的啟用模組目錄底下,同時複製 ModSecurity 和 Unicode 的配置。

sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules-enabled/
sudo cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsecurity.conf
sudo cp /opt/ModSecurity/unicode.mapping /etc/nginx/unicode.mapping

啟用 ModSecurity

編輯 NGINX 的設定來載入 ModSecurity 模組

sudo nano /etc/nginx/nginx.conf

將此行新增至配置中

load_module /etc/nginx/modules-enabled/ngx_http_modsecurity_module.so;

還需要修改伺服器區塊來啟動 ModSecurity

sudo nano /etc/nginx/sites-enabled/default
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;

編輯 /etc/nginx/modsecurity.conf,將 SecRuleEngine 改為 On。

sudo nano /etc/nginx/modsecurity.conf
SecRuleEngine On

檢查設定檔是否正確並重新啟動 NGINX 伺服器

sudo nginx -t
sudo systemctl restart nginx

使用 OWASP CRS 核心規則集

OWASP CRS 提供規則來檢查客戶端請求是否包含惡意程式碼,旨在保護 Web 應用程式免受各種攻擊,包括 OWASP 十大攻擊並減少誤報。

  • 預防常見的 Web 攻擊:CRS 能夠偵測並阻擋常見的攻擊手法,如 SQL 注入 (SQL Injection)、跨站腳本攻擊 (Cross-Site Scripting, XSS)、本地檔案包含 (Local File Inclusion, LFI)、遠端檔案包含 (Remote File Inclusion, RFI) 等。
  • 安全性加強:提供了一個強大的預設規則集,幾乎涵蓋了所有 OWASP 前十大安全風險。幫助開發者在不需要深入理解每個攻擊面向的情況下,加強應用的安全性。
  • 靈活性:用戶可以根據應用的特定需求調整或禁用某些規則,可以減少誤報 (False Positives),同時確保對真正威脅的檢測。
  • 跨平台支援:CRS 可以與多種 WAF 引擎搭配使用,如 ModSecurity、NGINX、Apache、IIS 等,並且可以在不同的作業系統上運行。

下載 OWASP CRS 到 NGINX 設定目錄

sudo git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/owasp-crs

原本名為 crs-setup.conf.example 的文件重命名為 crs-setup.conf

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

我們需要更新 ModSecurity 配置以載入 OWASP CRS

sudo nano /etc/nginx/modsecurity.conf
Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf

檢查設定檔是否正確並重新啟動 NGINX 伺服器

sudo nginx -t
sudo systemctl restart nginx

使用瀏覽器測試 Modsecurity NGINX

嘗試存取您的伺服器並在其上添加一些 Shell 程式碼

http://your_ip_address/index.php?s=/bin/bash

如果一切按預期工作,將顯示 403 禁止訪問。

相關的 ModSecurity 稽核訊息,可以查看 modsec_audit 日誌。

sudo tail -f /var/log/modsec_audit.log
ModSecurity: Warning. Matched "Operator `Rx' with parameter `(?:^([\d.]+|\[[\da-f:]+\]|[\da-f:]+)(:[\d]+)?$)' against variable `REQUEST_HEADERS:Host' (Value: `23.97.66.120' ) [file "/etc/nginx/owasp-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "772"] [id "920350"] [rev ""] [msg "Host header is a numeric IP address"] [data "23.97.66.120"] [severity "4"] [ver "OWASP_CRS/4.6.0-dev"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"] [hostname "10.3.0.4"] [uri "/index.php"] [unique_id "172480552773.168968"] [ref "o0,12o0,12v42,12"]
ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:s' (Value: `/bin/bash' ) [file "/etc/nginx/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "596"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/bash found within ARGS:s: /bin/bash"] [severity "2"] [ver "OWASP_CRS/4.6.0-dev"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/88"] [tag "PCI/6.5.2"] [hostname "10.3.0.4"] [uri "/index.php"] [unique_id "172480552773.168968"] [ref "o1,8v17,9t:cmdLine,t:normalizePath"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:BLOCKING_INBOUND_ANOMALY_SCORE' (Value: `8' ) [file "/etc/nginx/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "222"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 8)"] [data ""] [severity "0"] [ver "OWASP_CRS/4.6.0-dev"] [maturity "0"] [accuracy "0"] [tag "anomaly-evaluation"] [tag "OWASP_CRS"] [hostname "10.3.0.4"] [uri "/index.php"] [unique_id "172480552773.168968"] [ref ""]

相關的 NGINX 錯誤訊息,可以查看 error 日誌。

sudo tail -f /var/log/nginx/error.log
2024/08/28 00:38:47 [error] 30724#30724: *12 [client your_client_ip] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:BLOCKING_INBOUND_ANOMALY_SCORE' (Value: `8' ) [file "/etc/nginx/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "222"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 8)"] [data ""] [severity "0"] [ver "OWASP_CRS/4.6.0-dev"] [maturity "0"] [accuracy "0"] [tag "anomaly-evaluation"] [tag "OWASP_CRS"] [hostname "10.3.0.4"] [uri "/index.php"] [unique_id "172480552773.168968"] [ref ""], client: your_client_ip, server: _, request: "GET /index.php?s=/bin/bash HTTP/1.1", host: "23.97.66.120"

NGINX 版本揭露

我們仍然洩漏了 NGINX 的版本資訊,暴露這些資訊可以幫助攻擊者識別漏洞並發動有針對性的攻擊。

編輯 NGINX 的設定

sudo nano /etc/nginx/nginx.conf

將下列行新增至 http、server 或 location 部分。

server_tokens off;

檢查設定檔是否正確並重新啟動 NGINX 伺服器

sudo nginx -t
sudo systemctl restart nginx

重新訪問 NGINX 的版本資訊已經被移除了

今天的分享就到這邊,感謝收看

參考文件

--

--

Ivan Cheng
Ivan Cheng

Written by Ivan Cheng

沒有你的分享,世界感覺毫無生氣。

No responses yet