ModSecurity NGINX Quick Start Guide メモ


# はじめに
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 インストール
事前準備

```shell
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 コンパイル
```shell
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 にコンパイル
```shell
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 に追記

```shell
# 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 設定
```shell
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 インスト前に脆弱性スキャンツール準備
```shell
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 で偽陽性をチューニングする流れですね。