ModSecurity 是普遍應用之 公開網頁程式防火牆 ( 可 搭配 OWASP (Open Web Application Security Project) 維護的免費核心規則集 Core Rule Set CRS 初始設計 為 Apache HTTP Server 之模組 後續發展成 http 封包過濾軟體 亦支援 Microsoft IIS 、NGINX 等伺服器平台 。
- 安裝相依套件
$ sudo yum install -y gcc-c++ pcre-devel zlib-devel make unzip git
2. 使用 yum 安裝必要工具
$ sudo yum install -y autoconf automake libtool
3. 安裝 ModSecurity
$ git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /tmp/ModSecurity
$ cd /tmp/ModSecurity
$ git submodule init
$ git submodule update
$ ./build.sh
$ ./configure
$ make #這裡會等好幾分鐘
$ sudo make install
4. 安裝 Nginx 開發套件
$ yum install -y nginx-devel
5. 下載 ngx_http_modsecurity_module
$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /tmp/ModSecurity-nginx
6. 下載 Nginx來重新編譯,但實際是用原本的nginx
# 先檢查版本
$ nginx -v
# 根據版本下載相對應的nginx版本,否則最後重啟nginx時會報錯
$ wget https://nginx.org/download/nginx-1.20.1.tar.gz
$ tar -xzvf nginx-1.20.1.tar.gz
$ cd nginx-1.20.1
7. 編譯 Nginx,加入 ModSecurity 模組
$ ./configure --with-compat --add-dynamic-module=/tmp/ModSecurity-nginx
$ make modules
8. 複製 ModSecurity 模組到 Nginx 的 modules 目錄下
# 需要先建立/etc/nginx/modules目錄
$ mkdir /etc/nginx/modules
$ sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
9. 設定 Nginx 設定檔,加入 ModSecurity 的設定
# in /etc/nginx/nginx.conf
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;
http {
# …
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
# …
}
10. 設定 ModSecurity 的規則檔案,要注意路徑
# 新增目錄及檔案
$ mkdir /etc/nginx/modsec
$ vim /etc/nginx/modsec/main.conf
# 在 /etc/nginx/modsec/main.conf 裡加入
# /etc/nginx/modsec/main.conf
SecRuleEngine On
# log位置
SecAuditLog /var/log/nginx/modsec_audit.log
SecAuditLogParts ABIJDEFHZ
# 輸出為JSON以便 解析
SecAuditLogFormat JSON
# 對於與規則匹配的任何請求, 將默認操作配置為”阻止”。
SecDefaultAction "phase:1, deny, log"
11. 完成後重新啟動 Nginx,要用restart 不能用reload
$ sudo systemctl restart nginx
備註:當遇到重啟nginx失敗時,可以先去看nginx error.log,如果是出現下面的錯誤訊息,應該就是selinux擋住了
dlopen() "/etc/nginx/modules/ngx_http_modsecurity_module.so" failed (/etc/nginx/modules/ngx_http_modsecurity_module.so: failed to map segment from shared object) in /etc/nginx/nginx.conf:13
解決方案可以是先寬鬆selinux(下面指令),之後再重啟一次就可以
$ setenforce 0
目前還沒加上rule,可以先測試是否能夠使用,會另外再開篇章說明