DebianでWAF

subtitle

ModSecurity-nginx 1.0.1によるnWeb Application Firewall

author

Kentaro Hayashi

institution

ClearCode Inc.

content-source

2021年2月 東京エリア・関西合同Debian勉強会

allotted-time

20m

theme

.

スライドは公開済みです

プロフィール

align=“right”}

本日の内容

WAFとは

WAFの提供形態

WAFへの理解を深めるには

自由なWAF

ModSecurity in Debian

ModSecurity For Apache

$ sudo apt install apache2 modsecurity-crs \
                 libapache2-mod-security2
$ sudo a2enmod security2
$ sudo cp /etc/modsecurity/modsecurity.conf-recommended \
        /etc/modsecurity/modsecurity.conf
$ sudo systemctl restart apache2

ModSecurity For Nginx

モジュールをビルドする準備(unstable)

$ sudo apt build-dep nginx
$ apt source nginx
$ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
$ vi nginx-1.18.0/debian/rules

モジュールをビルド

$ cd nginx-1.18.0
$ debuild -us -uc
$ find nginx-1.18.0 -name '*security*.so'
nginx-1.18.0/debian/build-xxx/objs/ngx_http_modsecurity_module.so

モジュールをコピー

Nginxで有効にするには(nginx.conf)

load_module "modules/ngx_http_modsecurity_module.so";

modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;

Firewallのルールを指定する

modsecurity-crs

設定の注意 for Nginx

ブロックさせるサンプル

SecRuleEngine On
Include owasp-modsecurity-crs/crs-setup.conf
Include owasp-modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf
Include owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
Include owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf

まるっと適用するなら

SecRuleEngine On
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
Include /usr/share/modsecurity-crs/rules/*.conf
Include /etc/modsecurity/crs/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

有効・無効の切り替え

既定の挙動を設定

#SecAction \
#  "id:900000,\
#   phase:1,\
#   nolog,\
#   pass,\
#   t:none,\
#   setvar:tx.paranoia_level=1"

リクエストに関する設定

レスポンスに関する設定

どんなルールセットがあるか?

ルールが読み込めているか?

[notice] 16026#16026: ModSecurity-nginx v1.0.1 \
(rules loaded inline/local/remote: 0/911/0)

ルールがどのように適用されたか?

--622ca252-H--
Message: Access denied with code 403 (phase 1). \
Pattern match "/phpmyadmin" at REQUEST_FILENAME. \
[file "/etc/httpd/conf.d/mod_security.conf"] \
[line "94"] \
[id "10000"] \
[msg "Blocking access to /phpmyadmin/index.php."] \
[tag "Blacklist Rules"]

ひっかかったのを検出するには

github.com/molu8bits/modsecurity-parser

$ python modsecurity-parser.py --version3 \
  -f modsec_audit.log

ここまで話をしたけれど

ざっくりいうと

ModSecurity + Isolation Forestで遊ぶには(Ruby編)

ModSecurity + Isolation Forestで遊ぶには

location / {
  mruby_set_code $backend '
    r = Nginx::Request.new
    ...ここでIsolationForestのモデルでr.uriのスコアを評価
    return score > 0.9 ? "" : "http://127.0.0.1:3000/"
  ';
  if ($backend = "") {
    return 403;
  }
  proxy_pass $backend;
}

まとめ