在 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相比,儀錶板簡化了組態過程,主要體現在兩個方面:
- 無需手動下載規則到個別的NGINX執行個體,因為當
SecRemoteRules指令包含在ModSecurity組態中時,ModSecurity 3.0動態模組會自動下載它們。 - 啟用和停用規則(組態過程的重要部分)可透過儀錶板的GUI完成,而非直接在ModSecurity組態檔案中進行。
使用組態精靈
要為示範應用程式組態Trustwave SpiderLabs規則集,請執行以下步驟:
- 登入ModSecurity儀錶板並啟動組態精靈。
- 建立一個組態檔(或使用預設的),選擇保護應用程式所需的規則。由於現有的規則不適用於我們的示範應用程式,因此選擇與WordPress相關的規則。同時,您也可以啟用其他選項,如IP評價檢查。
- 在「組態您的伺服器」步驟中,精靈會提供需要在ModSecurity組態中新增的
SecRemoteRules指令。手動編輯/etc/nginx/modsec/main.conf並新增該指令,同時註解掉其他現有的規則。 - 為了讓ModSecurity能夠阻擋惡意請求,需要在
/etc/nginx/modsec/main.conf中新增以下行:
這些指令定義了規則的預設動作,包括阻擋惡意請求並傳回403狀態碼。SecDefaultAction "phase:2,log,auditlog,deny,status:403" SecDefaultAction "phase:1,log,auditlog,deny,status:403" - 重新載入NGINX組態:
$ sudo nginx -s reload。由於需要從遠端伺服器下載規則,這個過程可能需要一些時間。 - 一旦精靈報告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
- 取得Project Honeypot的API金鑰。
- 在ModSecurity組態中啟用Project Honeypot模組。
- 組態相關引數,如API金鑰和威脅評分閾值。
實作範例
# 在 ModSecurity 組態檔案中新增以下內容
SecHttpBlKey your_api_key
SecHttpBlLevel 3
# 重新載入NGINX組態
$ sudo nginx -s reload
注意事項
- 確保您的ModSecurity版本支援Project Honeypot整合。
- 正確組態API金鑰和威脅評分閾值,以避免誤判。
詳細解說:
SecHttpBlKey your_api_key:將your_api_key替換為您的Project Honeypot API金鑰,用於驗證您的請求。SecHttpBlLevel 3:設定威脅評分的閾值,數值範圍通常是0到255。數值越高,表示只對威脅評分越高的IP地址進行處理。
ModSecurity 3.0 與 NGINX:快速啟用 Project Honeypot
設定您的 Honeypot
要開始使用 Project Honeypot,首先需要在您的網站上使用 Project Honeypot 提供的指令碼設定 honeypot:
- 註冊 Project Honeypot 帳戶:存取 Project Honeypot 官網 註冊一個免費帳戶。
- 設定 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 評價查詢功能
- 取得 Project Honeypot http:BL 存取金鑰:存取 Project Honeypot 組態頁面 取得您的 http:BL 存取金鑰。
- 組態 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。