2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ModSecurity NGINX Quick Start Guide メモ

Last updated at Posted at 2023-01-20

はじめに

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 は libmodsecurityNGINX 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 で偽陽性をチューニングする流れですね。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?