以下整理 ModSecurity 和 Nginx 搭配的實作方式,給你架構說明與常見部署步驟,也會提醒你重點和踩雷點。
一、ModSecurity 跟 Nginx 的搭配原理
- ModSecurity 是一套開源 Web 應用防火牆(WAF),可以攔截、過濾各種惡意 HTTP 請求。
- 跟 Nginx 搭配時,是以「動態模組」的形式整合,讓 Nginx 針對所有進來的流量,根據 ModSecurity 的規則來做檢查與阻擋。
- 最常用的規則集是 OWASP CRS(防護 SQL 注入、XSS、各種 Web 攻擊等)。
二、安裝與整合步驟(以 Ubuntu 為例)
1. 安裝依賴
sudo apt update
sudo apt install libnginx-mod-security libmodsecurity3
新版 Ubuntu 已有官方套件,會直接安裝 Nginx 用的 ModSecurity 模組及依賴。
2. 啟用 ModSecurity 模組
編輯 Nginx 主設定檔 /etc/nginx/nginx.conf
,在 http
區塊內加入(若沒載入自動模組):
load_module modules/ngx_http_modsecurity_module.so;
3. 下載預設規則集(OWASP CRS)
sudo apt install modsecurity-crs
# 或手動下載最新版
cd /etc/modsecurity/
sudo git clone https://github.com/coreruleset/coreruleset.git
然後連結(或複製)規則主設定到正確位置:
sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /etc/modsecurity/crs-setup.conf
sudo cp /usr/share/modsecurity-crs/rules/* /etc/modsecurity/rules/
4. 建立/編輯 ModSecurity 設定檔
複製一份預設設定檔:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
然後打開 /etc/modsecurity/modsecurity.conf
,將:
SecRuleEngine DetectionOnly
改成
SecRuleEngine On
DetectionOnly 只記錄不攔截,On 才會真正阻擋攻擊!
5. 編輯 Nginx 設定啟用 ModSecurity
例如你有個網站 server block,要加這一段:
server {
listen 443 ssl;
server_name example.com;
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 其他 location、proxy_pass、root 設定
}
modsecurity on;
表示這個 server block 啟用 ModSecurity。
modsecurity_rules_file
指定規則檔路徑(通常要在主設定檔和 server block 都要加)。
6. 重新啟動 Nginx
sudo systemctl reload nginx
三、確認是否生效
- 看 Nginx error log 是否有 ModSecurity 訊息。
- 測試存取常見攻擊網址(如加參數
?id='or'1'='1
),應會收到 403 被擋。
四、補充
- 效能考量:啟用 ModSecurity 會讓 Nginx 壓力變大(尤其規則多時),建議先從小量開啟測試,並觀察伺服器資源。
- 自訂規則:你可以額外寫自己的規則,或者只開啟特定模組。
- 多站點支援:每個 server block 都能獨立啟用/關閉。
五、官方與社群資源
小結
Nginx + ModSecurity 是業界常見的 Web 防火牆組合,適合想加強 HTTP 應用層安全、攔截常見攻擊的站長。安裝跟維護都不難,唯一重點就是「不要只用 DetectionOnly!」,否則只記錄不攔截~