Nginx 版の ModSecurity を Ubuntu にインストールし,OWASP Core Rule Set を使って WAF ( Web Application Firewall )を構築し,ルールを追加する訓練をした。
書いてある通りにやって動くサイトを発見するまで本当に苦労したので,記録に残しておく。
ModSecurity に独自の ルール を 追加 する方法。
How to add your own rules to ModSecurity.
ModSecurityのインストール
Nginx版のModSecurityをUbuntuにインストールする場合,以下のサイトに記載されているとおりに実施するだけ。
素晴らしい。
このサイトに出会うまで,10回くらい動かないサイトに悩まされた。
手順通り進めると,
Step 6 で,OWASP Core Rule Set の導入
Step 10 で,False Positives 対策を学習できる。
独自ルールの追加
ゼロデイが発見された場合など,迅速にルールを追加する必要がある。
OWASPに頼らず,自分でルールの追加ができないとModSecurityの使い手とは言えない。
ところが,ルールの追加についても,なかなか有益なサイトを発見できず苦労した。
結論から言うと,Google等の検索サイトで「ModSecurity ルール 追加」とか「ModSecurity rule add」とか検索しても動くもの
は1サイトも発見できなかった。
最後の手段で公式のマニュアルを見たが,やはり,マニュアル。
読めば,動くルールを作れた。
急がば回れ。ですね。
ルールを書く場所
/etc/nginx/modsec/main.confを確認すると次のような記載がある。
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
ルールは,ディレクトリ/etc/nginx/modsec/coreruleset-3.3.0/rules/
に置く必要があり,ファイル名は何でもよいが,拡張子は.conf
とする必要がある。
私の場合,test.conf とした。
ルールの書き方
例えば,
http://10.0.2.7:8888/info.php?a=whoami
のようなwhoamiを含むリクエストを防ぐことを考える。
この場合,test.confには次のように記載する
SecRule ARGS whoami "phase:1,id:12345,t:lowercase,log,pass,msg:'Message text'"
SecRuleUpdateActionById 12345 "t:none,t:compressWhitespace,deny,status:403,msg:'New message text'"
そしてルールの点検とnginxの再起動を行う
sudo nginx -t
sudo systemctl restart nginx
動くものがあると,あとのカスタマイズは簡単。
動くものがあると,あとのカスタマイズは簡単。
ルールの書式
Syntax: SecRule VARIABLES OPERATOR [ACTIONS]
VARIABLES
100種類以上ある。公式ページを見るしかない。
が,XSSのルールだとこんな感じなので,ベースにはなると思う。
REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/*
phases
どのデータを検閲するか?
phase:1 Request headers
phase:2 Request body
phase:3 Response headers
phase:4 Response body
rule id
1–99,999がローカル用にアサインされているので,勝手に使ってよい。
WAFをReverse Proxyにする
まずは,includeの確認
sudo cat /etc/nginx/nginx.conf
で
include /etc/nginx/conf.d/*.conf
を確認する。
Reverse Proxyの設定
sudo vi /etc/nginx/conf.d/backend.conf
upstream backend {
server 10.0.2.5:80; <-- Webサーバ
}
server {
listen 8888; <-- WAF
server_name 10.0.2.7; <-- WAF
location / {
proxy_pass http://backend;
}
}
接続元IPアドレスを伝える
WAFの設定変更
sudo vi /etc/nginx/conf.d/backend.conf
upstream backend {
server 10.0.2.5:80;
}
server {
listen 8888;
server_name 10.0.2.7;
location / {
proxy_set_header X-Forwarded-For $remote_addr; <-- 追加
proxy_pass http://backend;
}
}
Webサーバの設定変更
sudo vi /etc/nginx/nginx.conf
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# ip
set_real_ip_from 10.0.2.7; <-- 追加
real_ip_header X-Forwarded-For; <-- 追加
real_ip_recursive on; <-- 追加
参考サイト
How to Set Up ModSecurity with Nginx on Debian/Ubuntu
公式マニュアル
ブルート・フォース攻撃対策
「ログイン試行が失敗するたびIP:FAILED_LOGINSフィールドをインクリメントします。ログイン試行の失敗数が3回を超えると、それ以降の試行はブロック」等の有益な情報アリ
Oracle Cloud カスタム保護ルール
古いけど,日本語
NginxをProxyサーバとして動かす方法
NGINXで接続元IPアドレス(X-Forwarded-For)を設定する
nginxで複数のproxyを経由する場合でもアクセス元IPアドレスを取得する
多段nginxでもX-Forwarded-ForできちんとバックエンドにクライアントIPアドレスを伝える