はじめに
ModScurity を make して CRS のアップデート方法を理解する。
基本的には ModSecurity NGINX Quick Start Guide のメモです。。。
ポイント
- ModSecurity はルールのDBを使用する
- 無料:OWASP ModSecurity Core Rule Set
- 有料:Trustwave 有償ルールセット
- ModSecurity 2.9 までは NGINX 環境でパフォーマンスの問題が存在した
- ModSecurity 2.9 までは Apache に強く紐づいていたが、3.0 以降はコードを書き換え、Apache 無しで Nginx とネイティブに連携できるようになる
- ModSecurity 3.0 のコア機能は
libmodsecurity
と呼ばれるスタンドアロンエンジンに移動した - ModSecurity dynamic module は
libmodsecurity
とNGINX connector
をシングルパッケージ化している - NGINX Plus distribution はコンパイルされた dynamic module を含む
- NGINX OSS ユーザは NGINX version 変更時に毎回コンパイル要
NGINX の ModSecurity インストール方法
- NGINX(OSS) : コンパイル要
- NGINX Plus : NGINXから提供されているコンパイル済み ModSecurity 3.0 dynamic module を利用可能
NGINX インストール
事前準備
apt-get install -y apt-utils autoconf automake build-essential \
git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev \
libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
-
libmodsecurity
は全ての rule と機能を含むコアコンポーネント - 2番目のコアコンポーネントは web server に
libmodsecurity
をリンク(紐づける)コネクタ - コネクタは NGINX 用と Apceh 用で別々に用意している
libmodsecurity コンパイル
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./Configure
make
make install
NGINX コネクタダウンロード & Dynamic Module にコンパイル
wget https://nginx.org/download/nginx-1.23.3.tar.gz
tar zxvf nginx-1.23.3.tar.gz
cd nginx-1.23.3
./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
make modules
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
nginx.conf 修正
- コンパイルした
ngx_http_modsecurity_module.so
を nginx.conf に追記
# cat /etc/nginx/nginx.conf |grep mod
load_module modules/ngx_http_modsecurity_module.so;
# nginx -t
2023/01/20 03:31:35 [notice] 17570#17570: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/0/0)
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
// 設定ファイル確認
# nginx -s reload
2023/01/20 03:32:43 [notice] 17571#17571: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/0/0)
2023/01/20 03:32:43 [notice] 17571#17571: signal process started
// 設定ファイルロード
設定後の動作確認
cat <<EOF > /etc/nginx/conf.d/echo.conf
server {
location / {
default_type text/plain;
return 200 "Thank you for requesting ${request_uri}\n";
}
}
EOF
# curl -D - http://localhost:80 HTTP/1.1 200 OK
mkdir /etc/nginx/modsec
cd /etc/nginx/modsec
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
mv modsecurity.conf-recommended modsecurity.conf
ModSecurity 設定
mkdir /etc/nginx/modsec
cd /etc/nginx/modsec
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
mv modsecurity.conf-recommended modsecurity.conf
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
cat <<EOF > /etc/nginx/modsec/main.conf
# Include the recommended configuration
Include /etc/nginx/modsec/modsecurity.conf
# A test rule
SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403"
EOF
cat <<EOF >/etc/nginx/conf.d/proxy.conf
server {
listen 80;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass http://localhost:8085;
proxy_set_header Host $host;
}
}
EOF
cp /ModSecurity/unicode.mapping /etc/nginx/modsec/
nginx -t
nginx -s reload
OWASP Core Rule Set インストール
- CRS3 は2016年11月にリリース
- crs-setup.conf.example
は CRS のメイン設定ファイル。動作モードなど設定可能
- rules/*
はルール用ファイル格納ディレクトリ
- 90x files は偽陽性を改善するために除外
- 91x files は悪意あるクライアントの検出ルール
- 92x files はプロトコル違反を検出するためのルール
- 93x and 94x files はアプリケーション攻撃検出用ルール
- 95x files はアウトバウンドデータ漏えい検出用ルール
- .data files は各種ルールに使用されるデータ
- CRS はデフォルトで anomaly score 5以上はブロックする
CRS インスト前に脆弱性スキャンツール準備
git clone https://github.com/sullo/nikto
cd nikto
perl program/nikto.pl -h localhost
git clone https://github.com/coreruleset/coreruleset
cp crs-setup.conf.example crs-setup.conf
echo "Include /etc/nginx/coreruleset/crs-setup.conf" >> /etc/nginx/modsec/main.conf
echo "Include /etc/nginx/coreruleset/rules/*.conf" >> /etc/nginx/modsec/main.conf
// CRS を配置してから再度 nikto を実行して report 数の減少を確認する
Project Honeypotとは
いわゆる IP reputation database のこと。コミュニティドリブンで管理され、疑わしい spammers , bots などがリスト化されている。
Logging について
- ModSecurity はデフォルトで warning 及び error をロギングする
Section | Description |
---|---|
A | Audit log header(mandatory) |
B | Request Headers |
C | Request body |
D | Reserved |
E | Response body |
F | Response headers |
G | Reserved |
H | Audit log trailer, which contains additional data |
I | Compact request body alternative (to part C), which excludes files |
J | Information on uploaded files |
K | Contains a list of all rules that mathched for the transaction |
Z | Final boundary (mandatory) |
本番環境移行前について
- Audit ログの無効化(nginx 側のログで十分だから)
- 静的コンテンツ(.gif|jpg等)は WAF 検査対象から除外する
さいごに
ModSecurity の CRS は git から落としてきて、crs-setup.conf.example を crs-setup.conf に名前変更する。
nginx -t & nginx -s reload で CRS 読み込ませればよいと思われる。
ModSecurity 本番環境でのチューニングポイントは、ログ無効化、Nginx 前にキャッシュの仕組み導入、静的コンテンツをスキャン除外、DDOS 機能有効化である程度OK。
いずれにしても DetectionOnly でログ確認後、On で偽陽性をチューニングする流れですね。