為 Nginx 配置 ModSecurity 網路應用防火牆
網路應用防火牆(WAF)是一種在應用層監控網路流量的應用程序。
OSI(開放系統互聯) 是最常被網路相關討論引用的網路流量框架之一。當數據包通過第 6 層(表示層)移動到第 7 層(應用層)時,它會進行解密或解碼操作。這些操作可能會因異常解碼和解釋而產生漏洞,而這些漏洞可能被利用來打破標準應用上下文。注入就是這種漏洞的一種類型,而且因為傳統的 IDS/IPS 設備無法應對這些威脅,所以其長時間以來一直是人們特別關注的問題。
ModSecurity 簡介
ModSecurity 本質上就是 網路應用防火牆 (WAF)引擎。它與 Apache、IIS 和 Nginx 兼容,並由第三方公司維護。該防火牆會將一份規則列表與由 Web 伺服器/代理提供的 HTTP 頭流進行交叉引用。目前這個倉庫已經被簡化,只包含主要的 LibModSecurity 庫。你可以直接在自己的伺服器實現中調用這個庫,或通過特定編程語言的封裝進行調用。
其母公司的支持計劃於 2024 年 7 月 1 日結束,之後這個項目將由開源社區維護。
安裝 Nginx 連接器
Nginx 連接器 是一個 Nginx 動態模塊,可以通過 Fedora 包 nginx-mod-modsecurity
進行安裝。它依賴於 libmodsecurity.so
,所以在這個使用場景中,這個包本身就是防火牆。
[user@fedora ~]$ sudo dnf install -y nginx nginx-mod-modsecurity
[user@fedora ~]$ rpm -qR nginx-mod-modsecurity
config(nginx-mod-modsecurity) = 1.0.3-3.fc38
libc.so.6(GLIBC_2.4)(64bit)
libmodsecurity.so.3()(64bit)
nginx(abi) = 1.24.0
nginx-filesystem
...
安裝完成後,你會見到連接器在 /etc/nginx
中添加了一些重要的文件。
[user@fedora ~]$ rpm -ql nginx-mod-modsecurity
/etc/nginx/modsecurity.conf # waf 配置
/etc/nginx/nginx.conf.modsecurity # nginx 示例配置
/usr/lib64/nginx/modules/ngx_http_modsecurity_module.so
/usr/share/nginx/modules/mod-modsecurity.conf
/usr/share/doc/nginx-mod-modsecurity/README.md
...
通過提供一些額外的配置指令,連接器對 Nginx 進行了擴展。下面的部分將演示 nginx.conf.modsecurity
文件中一些示例指令。指令的完整列表可以在 README.md
文件或項目的 GitHub 頁面找到。
啟動網路應用防火牆
nginx.conf.modsecurity
是我們將要運行的 Nginx 配置。解開如下所示的 modsecurity 行注釋:
[user@fedora ~]$ sudo sed -i 's/#modsec/modsec/g' /etc/nginx/nginx.conf.modsecurity
[user@fedora ~]$ grep -C2 modsecurity /etc/nginx/nginx.conf.modsecurity
# 如有需要,啟用 ModSecurity WAF
modsecurity on;
# 如有需要,載入 ModSecurity CRS
modsecurity_rules_file /etc/nginx/modsecurity.conf;
在 shell 中啟動伺服器並查看日誌,確保在 modsecurity.conf
載入了七個默認規則。
[user@fedora ~]$ sudo nginx -c /etc/nginx/nginx.conf.modsecurity
[user@fedora ~]$ head /var/log/nginx/error.log
2023/10/21 23:55:09 [notice] 46218#46218: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/7/0)
2023/10/21 23:55:09 [notice] 46218#46218: using the "epoll" event method
2023/10/21 23:55:09 [notice] 46218#46218: nginx/1.24.0
2023/10/21 23:55:09 [notice] 46218#46218: OS: Linux 6.5.7-200.fc38.x86_64
通過發送一些不符合 Content-Type
頭格式的數據來測試默認規則。
[user@fedora ~]$ curl -X POST http://localhost -H "Content-Type: application/json" --data "<xml></xml>"
[user@fedora ~]$ tail /var/log/modsec_audit.log
...
---rH5bFain---H--
ModSecurity: Warning. Matched "Operator `Eq' with parameter `0' against variable `REQBODY_ERROR' (Value: `1' ) [file "/etc/nginx/modsecurity.conf"] [line "75"] [id "200002"] [rev ""] [msg "Failed to parse request body."] [data "JSON parsing error: lexical error: invalid char in json text.n"] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "10.0.2.100"] [uri "/"] [unique_id "169795900388.487044"] [ref "v121,1"]
用 OWASP 核心規則集擴展你的網路應用防火牆
默認的 Nginx 連接器帶有七條規則。OWASP Core Rule Set v3.3.5 則更為詳盡,涵蓋了許多場景。
複製並提取規則的存檔。
[user@fedora ~]$ curl -fSL https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.5.tar.gz --output /tmp/v3.3.5.tar.gz
[user@fedora ~]$ sudo tar -C /etc/nginx -xvf /tmp/v3.3.5.tar.gz
[user@fedora ~]$ tree -L 1 /etc/nginx/
/etc/nginx/
├── conf.d
├── default.d
├── modsecurity.conf # waf 配置
├── nginx.conf
├── nginx.conf.modsecurity # nginx 啟用 waf
├── coreruleset-3.3.5
├ ├── rules # 規則目錄
├ ...
├ ...
現在,你在 Nginx 配置文件夾中有了一個包含所有當前 OWASP 規則的 rules
目錄。接下來,讓 Nginx 知道這些規則。以下操作指南來源於 OWASP INSTALL 文件。
創建一個 crs.conf
文件,並在全局網路應用防火牆配置文件( modsecurity.conf
)中包含所有相關的配置文件。
[user@fedora ~]$ sudo cp /etc/nginx/coreruleset-3.3.5/crs-setup.conf.example /etc/nginx/coreruleset-3.3.5/crs.conf
[user@fedora ~]$ echo -e "nInclude /etc/nginx/coreruleset-3.3.5/crs.conf" | sudo tee -a /etc/nginx/modsecurity.conf
[user@fedora ~]$ echo -e "nInclude /etc/nginx/coreruleset-3.3.5/rules/*.conf" | sudo tee -a /etc/nginx/modsecurity.conf
[user@fedora ~]$ tail /etc/nginx/modsecurity.conf
Include /etc/nginx/coreruleset-3.3.5/crs.conf
Include /etc/nginx/coreruleset-3.3.5/rules/*.conf
根據文檔,包含這些文件的順序很重要。上面的 tee
的命令將新的 Include
行放在了 modsecurity.conf
文件的末尾。現在,用這個新配置重啟 Nginx。
[user@fedora ~]$ sudo nginx -s stop && sudo nginx -c /etc/nginx/nginx.conf.modsecurity
[user@fedora ~]$ tail /var/log/nginx/error.log
2023/10/22 10:53:23 [notice] 202#202: exit
2023/10/22 10:53:50 [notice] 230#230: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/921/0)
2023/10/22 10:53:50 [notice] 230#230: using the "epoll" event method
2023/10/22 10:53:50 [notice] 230#230: nginx/1.24.0
2023/10/22 10:53:50 [notice] 230#230: OS: Linux 6.5.7-200.fc38.x86_64
2023/10/22 10:53:50 [notice] 230#230: getrlimit(RLIMIT_NOFILE): 524288:524288
2023/10/22 10:53:50 [notice] 231#231: start worker processes
注意,Nginx 成功載入了 921 條規則。還需要做一些測試來確保規則實際上是被網路應用防火牆檢查過的。這裡再次引用 INSTALL
文件中的 「Testing the Installation」 片段。
[user@fedora ~]$ curl 'http://localhost/?param=''><script>alert(1);</script>'
[user@fedora ~]$ tail /var/log/modsec_audit.log
...
---8NSpdnLe---H--
ModSecurity: Warning. detected XSS using libinjection. [file "/etc/nginx/coreruleset-3.3.5/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "38"] [id "941100"] [rev ""] [msg "XSS Attack Detected via libinjection"] [data "Matched Data: XSS data found within ARGS:param: ><script>alert(1);</script>"] [severity "2"] [ver "OWASP_CRS/3.3.5"]
...
結論
本文演示了如何為 Nginx 伺服器配置網路應用防火牆。這個部署使用了標準規則和 OWASP Core Rule Set v3.3.5。演示的防火牆在檢測模式中運行並記錄不尋常的行為。將防火牆運行在防禦模式要對 modsecurity.conf
進行更多改動。請參考 ModSecurity Reference Manual v3.x 獲取如何啟用防禦模式和更多信息。
祝你好運。
(題圖:DA/7ec85bc4-b209-4fc6-9275-8f7d1430f6ca)
via: https://fedoramagazine.org/a-web-application-firewall-for-nginx/
作者:Roman Gherta 選題:lujun9972 譯者:ChatGPT 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive