跳到主內容

NGINX 搭配 ModSecurity - Debian

  BUBU 因公司新站台是使用 Nginx 服務那需要搭配 ModSecurity 資安套件來阻擋惡意的攻擊

運行環境


  環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式

  • 系統環境: Debian 11
  • Web 服務: Nginx 1.25.2

安裝過程


  • 安裝必要套件
apt-get install -y apt-utils autoconf automake build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
  • 下載最新版的 ModSecurity 套件
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
  • 下載進入該目錄
cd ModSecurity
  • 初始化該套件
git submodule init
  • 更新套件
git submodule update
  • 建講套件
./build.sh && ./configure
  • 編譯套件(這編譯會需要一段時間)
make && make install
  • 回到上層
cd ..
  • 如果在建置過程中出現此訊息直接略過即可,根據官方說明是不會影響到後面服務

fatal: No names found, cannot describe anything.

  • 下載 For Nginx 使用套件
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
  • 下載與您對應版本 Nginx 套件,如您是參考本篇安裝可以跳過
git clone https://github.com/nginx/nginx.git
  • 開始建構與 Nginx 連動元件
cd nginx
auto/configure --with-compat --add-dynamic-module=../ModSecurity-nginx
  • 執行編譯模組
make modules
  • 將編譯好的模組複製到 Nginx 模組目錄下
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
  • 編輯 Nginx 全域設定檔載入該模組 vim /etc/nginx/nginx.conf
load_module modules/ngx_http_modsecurity_module.so;
  • 建立 ModSecurity 專用目錄
mkdir /etc/nginx/modsec
  • 下載官方建議參數做使用
wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
  • 重新修改設定檔名稱
 mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
  • 回到您剛剛下載好的 ModSecurity 那層複製該檔到 unicode.mapping modsec 目錄下
 cp ModSecurity/unicode.mapping /etc/nginx/modsec
  • 修改參數 SecRuleEngine 原只有監控模組改為阻檔模組
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
  • 建立 modsecurity 設定檔 vim /etc/nginx/modsec/main.conf
# From https://github.com/SpiderLabs/ModSecurity/blob/master/
# modsecurity.conf-recommended
#
# Edit to set SecRuleEngine On
Include "/etc/nginx/modsec/modsecurity.conf"

# Basic test rule
SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
  • 在您的服務設定檔裡面新增加這兩行參數
server {
    # ...
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
}
  • 測試剛剛所寫的測試規則是否有生效
curl localhost?testparam=test
  • 結果如下

規則設定


  • 進到 modsec 目錄
cd /etc/nginx/modsec
  • 下載新版的規則
git clone --depth 1 https://github.com/coreruleset/coreruleset.git
  • 載入您想要使用規則 vim /etc/nginx/modsec/modsecurity.conf 在最後面新增
Include "/etc/nginx/modsec/coreruleset/rules/*.conf"

補充說明


備註





參考相關網頁