Rabbit Slide Show

Tokyo Debian ModSecurity 2021

2021-02-20

Description

Text

Page: 1

DebianでWAF
ModSecurity-nginx 1.0.1による
Web Application Firewall
Kentaro Hayashi
ClearCode Inc.
2021年2月 東京エリア・関西合同Debian勉強会

Page: 2

スライドは公開済みです
この資料はRabbit Slide Showで公開済み
DebianでWAF - ModSecurity-nginx 1.0.1による
Web Application Firewall
https://slide.rabbit-shocker.org/authors/kenhys/
tokyodebian-modsecurity-20210220/

Page: 3

プロフィール
ひよこDebian Developer
2020/09になったばかり
twitter: @kenhys
トラックポイント(ソフトドーム派)
わさビーフ(わさっち派)

Page: 4

本日の内容
WAFとは
自由なWAF
ModSecurityを試すには
注:誤りについては指摘してもらえると助かります

Page: 5

WAFとは
Web Application Firewall
Webサイトへの攻撃の影響を低減するためのもの
攻撃と判断した通信を遮断する

Page: 6

WAFの提供形態
アプライアンス型(専用機器設置)
サービス型(外部提供のWAFサービスを利用)
ソフトウェア型 (今回はコレ!)

Page: 7

WAFへの理解を深めるには
「Web Application Firewallの導入に向けた検討項目」
https://www.ipa.go.jp/files/000072484.pdf
「Web Application Firewall 読本」
https://www.ipa.go.jp/files/000017312.pdf

Page: 8

自由なWAF
Shadow Daemon - GPL-2.0 or later
https://shadowd.zecure.org/
言語ごとのconnectorをインストールする
NAXSI(Nginx) - GPL-3.0
https://github.com/nbs-system/naxsi
ModSecurity(Apache/Nginx) Apache-2.0
https://modsecurity.org/

Page: 9

ModSecurity in Debian
For Apache
libapache2-mod-security2
ModSecurity 2.x
For Nginx
パッケージはない
https://github.com/SpiderLabs/ModSecurity-nginx
最新版は1.0.1 (ModSecurity 3.0.3以降)

Page: 10

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
DetectionOnlyで有効になる
/var/log/apache2/modsec_audit.log にログ

Page: 11

ModSecurity For Nginx
モジュールをビルドする
ビルドしたモジュールを配置する
Nginxの設定ファイルを書く

Page: 12

モジュールをビルドする準
備(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
xxx_configure_flagsにオプション追加する
--add-dynamic-module=$(CURDIR)/../ModSecurity-nginx

Page: 13

モジュールをビルド
$ 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
xxxはcoreやlight、extrasのパッケージに対応
nginx-core
nginx-light
nginx-extras

Page: 14

モジュールをコピー
ngx_http_modsecurity_module.so
コピー先は/usr/lib/nginx/modules

Page: 15

Nginxで有効にするには
(nginx.conf)
load_module "modules/ngx_http_modsecurity_module.so";
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;
モジュールを読み込む
ModSecurityを有効にする
3.x向けの記述方法
ModSecurityEnabled onは2.x向けの記述

Page: 16

Firewallのルールを指定す
る
ModSecurityはFirewallの枠組み
ルールは追加で指定する必要がある
ModSecurity Core Rule Set

Page: 17

modsecurity-crs
OWASP ModSecurity Core Rule Set
https://github.com/coreruleset/coreruleset
コミュニティベースでメンテナンス(になった)
ApacheとNginxとで共通で使えることになっている
/usr/share/modsecurity-crs/rules/*.conf

Page: 18

設定の注意 for Nginx
/etc/modsecurity/modsecurity.conf-recommended
libapache2-mod-security2向け
SecRequestBodyInMemoryLimit は3.xでは使えないやつ
ログを別に出力する設定をおすすめ
SecAuditLog /var/log/nginx/modsec_audit.log

Page: 19

ブロックさせるサンプル
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
/etc/nginx/modsecurity.conf(パスは任意)に記述する
curl http://localhost/?union+select が403になる

Page: 20

まるっと適用するなら
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
/etc/nginx/modsecurity.conf(パスは任意)に記述する

Page: 21

有効・無効の切り替え
SecRuleEngine
On: ModSecurityを有効にする
Off: ModSecurityを無効にする
DetectionOnly: 検知のみ行う

Page: 22

既定の挙動を設定
#SecAction \
# "id:900000,\
# phase:1,\
# nolog,\
# pass,\
# t:none,\
# setvar:tx.paranoia_level=1"
crs-setup.conf
SecActionで挙動に影響する変数を設定

Page: 23

リクエストに関する設定
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
既定では全部コメントアウト
preフィルタ的感じでつかう
ctl:ruleEngine
ctl:ruleRemoveByXXX
ctl:ruleRemoveTargetByXXX

Page: 24

レスポンスに関する設定
RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
既定では全部コメントアウト
postフィルタ的感じでつかう
SecRuleRemoveByXXX
SecRuleUpdateActionByXXX
SecRuleUpdateTargetByXXX

Page: 25

どんなルールセットがある
か?
REQUEST-903.*
Drupal
Wordpress
NextCloud
DokuWiki
CPanel
Xenford

Page: 26

ルールが読み込めている
か?
/var/log/nginx/error.log参照
ルールをリモートから取得もできる
[notice] 16026#16026: ModSecurity-nginx v1.0.1 \
(rules loaded inline/local/remote: 0/911/0)

Page: 27

ルールがどのように適用さ
れたか?
/var/log/nginx/modsec_audit.log を参照
Hセクションをみるべし
--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"]

Page: 28

ひっかかったのを検出する
には
https://github.com/molu8bits/modsecurity-parser
ModSecurity 2.xと3.xのログに対応している
png,json,xlsxでレポートを生成
$ python modsecurity-parser.py --version3 \
-f modsec_audit.log

Page: 29

ここまで話をしたけれど
本物のウェブアクセスログを使用した、機械学習によ
る異常検知(全データ/ソースコード公開)
https://www.scutum.jp/information/waf_tech_blog/
2021/01/waf-blog-077.html
Javaのサンプルあり(バッチ処理)

Page: 30

ざっくりいうと
アクセスログを1行ごとに特徴ベクトルにする
クエリーの特定の記号の出現回数とか
Isolation Forestでモデルを構築する
モデルを使って評価したスコアの外れ値をはじく

Page: 31

ModSecurity + Isolation
Forestで遊ぶには(Ruby編)
https://github.com/david-cortes/isotree
Isolation Forestを実装したライブラリー
https://github.com/ankane/isotree (Ruby)
最近リクエストしてモデルのエクスポートに対応しても
らった

Page: 32

ModSecurity + Isolation
Forestで遊ぶには
https://github.com/matsumotory/ngx_mruby
ngx_mrubyからリクエストを渡して評価
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;
}

Page: 33

まとめ
自由なWAFはいくつかある
DebianでModSecurity-nginxを使うには自分でビルド
する必要がある
とっかかりにはmodsecurity-crsのルールセットを使う
とよい
まずは検知モードで動かしてみるのがおすすめ
さらなる強化は別の手法の併用を考えるとよいかも

Other slides

DebConf20 DebConf20
2020-08-25