在 NGINX 上使用 ModSecurity 時,Trustwave SpiderLabs 商業規則集提供更精細的 Web 應用程式防護。透過 ModSecurity 儀錶板,設定規則變得更加簡便,無需手動下載和管理規則檔案。整合 Project Honeypot 可以進一步強化防禦能力,識別並阻擋惡意 IP。理解 ModSecurity 的日誌記錄機制,包含稽核日誌和除錯日誌,對於分析攻擊行為和排除設定問題至關重要。善用這些工具和技術,可以有效提升 Web 應用程式的安全性。

設定Trustwave SpiderLabs商業規則集

前提條件

  • 必須直接從Trustwave購買Trustwave SpiderLabs規則集
  • 本章建立在已安裝ModSecurity的基礎上,並假設您已按照之前的指示組態了示範應用程式和NGINX作為反向代理

組態Trustwave SpiderLabs規則集

購買Trustwave SpiderLabs規則集後,您將獲得存取ModSecurity儀錶板的許可權。該儀錶板是一個網頁入口,允許您為個別的NGINX執行個體(以及其他ModSecurity安裝)自訂Trustwave SpiderLabs規則。與OWASP CRS相比,儀錶板簡化了組態過程,主要體現在兩個方面:

  1. 無需手動下載規則到個別的NGINX執行個體,因為當SecRemoteRules指令包含在ModSecurity組態中時,ModSecurity 3.0動態模組會自動下載它們。
  2. 啟用和停用規則(組態過程的重要部分)可透過儀錶板的GUI完成,而非直接在ModSecurity組態檔案中進行。

使用組態精靈

要為示範應用程式組態Trustwave SpiderLabs規則集,請執行以下步驟:

  1. 登入ModSecurity儀錶板並啟動組態精靈。
  2. 建立一個組態檔(或使用預設的),選擇保護應用程式所需的規則。由於現有的規則不適用於我們的示範應用程式,因此選擇與WordPress相關的規則。同時,您也可以啟用其他選項,如IP評價檢查。
  3. 在「組態您的伺服器」步驟中,精靈會提供需要在ModSecurity組態中新增的SecRemoteRules指令。手動編輯/etc/nginx/modsec/main.conf並新增該指令,同時註解掉其他現有的規則。
  4. 為了讓ModSecurity能夠阻擋惡意請求,需要在/etc/nginx/modsec/main.conf中新增以下行:
    SecDefaultAction "phase:2,log,auditlog,deny,status:403"
    SecDefaultAction "phase:1,log,auditlog,deny,status:403"
    
    這些指令定義了規則的預設動作,包括阻擋惡意請求並傳回403狀態碼。
  5. 重新載入NGINX組態:$ sudo nginx -s reload。由於需要從遠端伺服器下載規則,這個過程可能需要一些時間。
  6. 一旦精靈報告NGINX成功下載規則,您就可以關閉精靈並開始測試規則。

測試規則

與使用Nikto掃描工具測試OWASP CRS不同,Trustwave SpiderLabs規則是特定的,無法檢測到Nikto傳送的一般性攻擊。您可以利用ModSecurity儀錶板提供的規則描述,自行構建並傳送惡意請求到NGINX,以測試規則的行為。

使用SecRemoteRules指令的注意事項

  • 每次重新載入NGINX組態或重啟NGINX時,都會從遠端伺服器重新下載規則。SecRemoteRulesFailAction指令控制下載失敗時的行為。
  • 下載規則需要時間,會延遲重新載入或重啟操作。
  • 每個SecRemoteRules定義都會導致單獨的下載,增加重新載入/重啟時間。應盡量減少定義數量。
  • 從不同上下文(http、server、location)合併規則也會增加重新載入/重啟時間,並消耗大量CPU資源。

啟用Project Honeypot

Project Honeypot簡介

Project Honeypot是一個由社群驅動的線上資料函式庫,收集了疑似垃圾郵件傳送者或機器人的IP地址。每個IP地址都被分配了一個威脅評分,範圍從0到255,數值越高,表示該IP地址越可能是惡意的。

如何啟用Project Honeypot

  1. 取得Project Honeypot的API金鑰。
  2. 在ModSecurity組態中啟用Project Honeypot模組。
  3. 組態相關引數,如API金鑰和威脅評分閾值。

實作範例

# 在 ModSecurity 組態檔案中新增以下內容
SecHttpBlKey your_api_key
SecHttpBlLevel 3
# 重新載入NGINX組態
$ sudo nginx -s reload

注意事項

  • 確保您的ModSecurity版本支援Project Honeypot整合。
  • 正確組態API金鑰和威脅評分閾值,以避免誤判。

詳細解說:

  1. SecHttpBlKey your_api_key:將your_api_key替換為您的Project Honeypot API金鑰,用於驗證您的請求。
  2. SecHttpBlLevel 3:設定威脅評分的閾值,數值範圍通常是0到255。數值越高,表示只對威脅評分越高的IP地址進行處理。

ModSecurity 3.0 與 NGINX:快速啟用 Project Honeypot

設定您的 Honeypot

要開始使用 Project Honeypot,首先需要在您的網站上使用 Project Honeypot 提供的指令碼設定 honeypot:

  1. 註冊 Project Honeypot 帳戶:存取 Project Honeypot 官網 註冊一個免費帳戶。
  2. 設定 honeypot:Project Honeypot 提供多種語言的 honeypot 指令碼,包括 PHP、Python、ASP 等。請根據您的需求選擇合適的指令碼語言,下載並設定 honeypot。詳細步驟請參考 Project Honeypot 官網

以下以 PHP 為例,展示如何在 Ubuntu 16.04 及更高版本上安裝 PHP-FPM:

$ apt-get update
$ apt-get -y install php7.0-fpm

設定 Project Honeypot PHP 指令碼

在 NGINX 設定檔中新增以下 server 區塊:

server {
    server_name www.example.com;
    location ~ \.php$ {
        modsecurity off;
        root /code;
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass localhost:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

內容解密:

  • server_name 指令中的 www.example.com 需要替換為您在 Project Honeypot 註冊的網域名稱。
  • 為了使 honeypot 指令碼正常運作,必須在該指令碼上停用 ModSecurity。
  • root 指令中的 /code 需要替換為您存放 honeypot 指令碼的目錄。

在所有頁面新增 Honeypot 連結

接下來,需要組態 NGINX 或 NGINX Plus 在所有頁面上新增 honeypot 連結。這裡使用 sub_filter 指令在每個頁面的底部插入一個不可見的連結:

location / {
    proxy_set_header Host $host;
    proxy_pass http://my_upstream;
    sub_filter '</html>' '<a href="http://www.example.com/weddingobject.php"><!-- hightest --></a></html>';
}

內容解密:

  • 這裡假設我們的 PHP honeypot 檔案名為 weddingobject.php
  • sub_filter 指令會尋找 HTML 的結束標籤 </html>,並在其位置插入不可見的 honeypot 連結。

啟用 IP 評價查詢功能

  1. 取得 Project Honeypot http:BL 存取金鑰:存取 Project Honeypot 組態頁面 取得您的 http:BL 存取金鑰。
  2. 組態 ModSecurity:編輯檔案 /usr/local/owasp-modsecurity-crs-3.0.0/crs-setup.conf,找到 SecHttpBlKey 區塊,並替換 my_api_key 為您的 http:BL 存取金鑰。
SecHttpBlKey my_api_key
SecAction "id:900500,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.block_search_ip=0,\
setvar:tx.block_suspicious_ip=1,\
setvar:tx.block_harvester_ip=1,\
setvar:tx.block_spammer_ip=1"

內容解密:

  • 上述範例中,block_search_ip 被停用,因為通常不需要封鎖搜尋引擎爬蟲。
  • 組態變更後,需要重新載入 NGINX 組態:$ nginx -t && nginx -s reload

驗證功能是否正常

為了測試 Project Honeypot 是否正常運作,可以在 /etc/nginx/modsec/main.conf 中新增一條自定義規則:

SecRule ARGS:IP "@rbl dnsbl.httpbl.org" "phase:1,id:171,t:none,deny,nolog,auditlog,msg:'RBL Match for SPAM Source'"

內容解密:

  • 這條規則會將請求中的 IP 位址引數傳送給 Project Honeypot 進行檢查。
  • 如果規則生效,請求將被阻止,並傳回 403 狀態碼。

使用以下 curl 命令測試規則:

$ curl -i -s -k -X $'GET' 'http://localhost/?IP=203.0.113.20'

如果規則正確運作,請求將被阻止,並顯示 403 Forbidden 狀態碼。

ModSecurity 3.0 與 NGINX:快速入門 第6章 - 日誌記錄

「ModSecurity 將幫助你睡得更好,因為它解決了可見性問題:它讓你看到你的網路流量。」 - Ivan Ristić,ModSecurity 的建立者

當某些事情沒有按照預期工作時,日誌總是首先要檢視的地方。好的日誌可以提供有價值的洞察力,幫助你排除遇到的問題。Ivan Ristić 最初建立 ModSecurity 的原因之一是他對當時使用的工具缺乏可見性感到沮喪。因此,ModSecurity 具有豐富的日誌記錄和除錯功能。

日誌記錄

ModSecurity 有兩種型別的日誌:

  • 稽核日誌:對於每個被阻止的交易,ModSecurity 提供詳細的日誌記錄關於該交易以及為什麼被阻止。
  • 除錯日誌:當啟用時,該日誌記錄了 ModSecurity 所做的一切的詳細資訊。

稽核日誌

稽核日誌是 ModSecurity 中的主要日誌,它記錄了所有攻擊,包括潛在的攻擊。如果你遵循了我們的安裝說明,那麼預設情況下,ModSecurity 將記錄所有觸發警告或錯誤的交易,以及所有導致 5xx 和 4xx 回應的交易(除了 404)。

稽核日誌分為幾個部分,這使得掃描日誌和查詢所需資訊變得更加容易。下表概述了每個部分包含的內容:

部分描述
A稽核日誌標頭(必備)
B請求標頭
C請求主體
D保留
E回應主體
F回應標頭
G保留
H稽核日誌尾部,包含額外資料
I緊湊請求主體替代(C 部分),排除檔案
J上傳檔案的資訊
K包含與交易比對的所有規則列表
Z最終邊界(必備)

每個觸發稽核日誌條目的交易將具有上述部分中的任意或全部。你可以組態哪些部分被記錄。

稽核日誌範例

一個 ModSecurity 稽核日誌條目可能如下所示:

---
ICmPEb5c
---
A--
[04/Oct/2017:21:45:15 +0000] 150715351558.929952 141.212.122.16 64384
141.212.122.16 80
---
ICmPEb5c
---
B--
GET / HTTP/1.1
Host: 54.183.57.254
User-Agent: Mozilla/5.0 zgrab/0.x
Accept-Encoding: gzip
---
ICmPEb5c
---
D--
---
ICmPEb5c
---
F--
HTTP/1.1 200
Server: nginx/1.13.4
Date: Wed, 04 Oct 2017 21:45:15 GMT
Content-Type: text/html
Connection: keep-alive
---
ICmPEb5c
---
H--
ModSecurity: Warning. Matched "Operator `Rx' with parameter
`^[\d.:]+$' against variable `REQUEST_HEADERS:Host' (Value:
`54.183.57.254' ) [file "/root/owasp-v3/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "733"] [id "920350"] [rev "2"] [msg "Host header is a numeric IP address"] [data "54.183.57.254"] [severity "4"] [ver "OWASP_CRS/3.0.0"] [maturity "9"] [accuracy "9"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [ref "o0,13v21,13"]
---
ICmPEb5c
---
I--
---
ICmPEb5c
---
J--
---
ICmPEb5c
---
Z--

從上面的稽核日誌範例中,如果我們掃描 H 部分,可以看到訊息「Host header is a numeric IP address」,這表明有人嘗試透過 IP 位址而不是主機名存取我們的網站。

稽核日誌組態

如果你遵循了我們的安裝和組態說明,你將在 /etc/nginx/modsec/modsecurity.conf 中找到稽核日誌組態。在該檔案中,你將看到以下三個指令,它們控制著稽核日誌中的內容:

SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABIJDEFHZ

其中:

  • SecAuditEngine:控制應該記錄什麼。選項有:
    • Off:停用稽核日誌。
    • On:記錄所有交易。
    • RelevantOnly:僅記錄觸發警告/錯誤或具有與 SecAuditLogRelevantStatus 指令比對的狀態碼的交易。
  • SecAuditLogRelevantStatus:如果 SecAuditEngine 設定為 RelevantOnly,則此指令控制應該記錄哪些 HTTP 回應狀態碼。它是根據正規表示式的。上述值將記錄所有 5xx 和 4xx 回應,但不包括 404。
  • SecAuditLogParts:控制應該在存取日誌中包含哪些部分。刪除你不感興趣的部分可以減少稽核日誌的大小,並使其更容易掃描。

除錯日誌

當除錯日誌啟用時,它提供了關於 ModSecurity 所做的一切的豐富資訊。對於排查問題非常有幫助。

除錯日誌範例

除錯日誌如下所示。它包含了 ModSecurity 對任何和所有交易採取的動作的詳細資訊:

[4] (Rule: 1234) Executing operator "Contains" with param "test"
against ARGS:testparam.
[9] Target value: "test" (Variable: ARGS:testparam)
[9] Matched vars updated.
[4] Running [independent] (non-disruptive) action: log
[9] Saving transaction to logs
[4] Rule returned 1.
[9] (SecDefaultAction) Running action: log
[9] Saving transaction to logs
[9] (SecDefaultAction) Running action: auditlog
[4] (SecDefaultAction) ignoring action: pass (rule contains a
disruptive action)
[4] Running (non-disruptive) action: auditlog
[4] Running (disruptive) action: deny

除錯日誌列出了規則 ID 號碼,以便於搜尋。在本例中,輸出來自我們的測試規則,ID 號碼為 1234。