著者は、 Write for DOnations プログラムの一環として、 OWASPFoundationを選択して寄付を受け取りました。

序章

Nginxは、安定性、シンプルな構成、質素なリソース要件で知られる、人気のあるオープンソースのHTTPサーバーおよびリバースプロキシです。 NAXSIなどのモジュールを使用すると、Nginxサーバーのセキュリティを大幅に向上させることができます。 NAXSI( Nginx Anti XSS&SQLインジェクション )は、Webアプリケーションファイアウォール機能を提供する無料のサードパーティNginxモジュールです。 NAXSIは、Webアプリケーションに到達するトラフィックを分析、フィルタリング、および保護し、デフォルトでDROPファイアウォールのように機能します。つまり、特にアクセスを許可するように指示されない限り、通過するすべてのトラフィックをブロックします。

ユーザーがアクセスを操作できるシンプルさは、NAXSIを ModSecurity などの同様の機能を備えた他のWebアプリケーションファイアウォール(WAF)と区別する重要な機能です。 ModSecurityには豊富な機能セットが付属していますが、NAXSIよりも保守が困難です。 これにより、NAXSIは、WordPressなどの一般的なWebアプリケーションでうまく機能する、すぐに利用できるルールを提供する、シンプルで適応性のある選択肢になります。

このチュートリアルでは、NAXSIを使用してUbuntu16.04サーバーでNginxを保護します。 NAXSIモジュールにはデフォルトでNginxパッケージが付属していないため、NAXSIを使用してソースからNginxをコンパイルする必要があります。 このチュートリアルを終了すると、NAXSIがブロックできる攻撃の種類と、NAXSIルールを構成する方法がわかります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1—NginxとNAXSIをインストールする

ほとんどのNginxモジュールはリポジトリからは利用できず、NAXSIも例外ではありません。 このため、NAXSIを使用してソースからNginxを手動でダウンロードしてコンパイルする必要があります。

まず、次のコマンドを使用してNginxをダウンロードします。

注:このチュートリアルでは、バージョン1.14のNginxを使用しています。 より新しいバージョンを使用するには、ダウンロードページにアクセスし、前のコマンドで強調表示されたテキストを更新されたバージョン番号に置き換えます。 最新の安定バージョンを使用することをお勧めします。

  1. wget http://nginx.org/download/nginx-1.14.0.tar.gz

次に、Githubの安定した0.56リリースからNAXSIをダウンロードします。

注:このチュートリアルでは、NAXSIのバージョン0.56を使用します。 最新のリリースは、NAXSIGithubページで見つけることができます。 最新の安定バージョンを使用することをお勧めします。

  1. wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi

お気づきかもしれませんが、Nginxリポジトリは tar 記録。 コンパイルしてインストールできるようにするには、最初にそれを抽出する必要があります。これは、 tar 指図。

  1. tar -xvf nginx-1.14.0.tar.gz

上記のコマンドでは、 -x 抽出ユーティリティを指定します。 -v ユーティリティを冗長モードで実行し、 -f 抽出するアーカイブファイルの名前を示します。

Nginxファイルを抽出したので、次のコマンドを使用してNAXSIファイルの抽出に進むことができます。

  1. tar -xvf naxsi

これでフォルダができました naxsi-0.56nginx-1.14.0 ホームディレクトリにあります。 ダウンロードして抽出したファイルを使用して、NAXSIを使用してNginxサーバーをコンパイルできます。 あなたの中に移動します nginx-1.14.0 ディレクトリ

  1. cd nginx-1.14.0

ソースからNginxをコンパイルするには、Cコンパイラが必要です gcc、Perl互換正規表現ライブラリ libpcre3-dev、 と libssl-dev、SSLおよびTLD暗号化プロトコルを実装します。 これらの依存関係は、 apt-get 指図。

まず、次のコマンドを実行して、パッケージの更新されたリストがあることを確認します。

  1. sudo apt-get update

次に、依存関係をインストールします。

  1. sudo apt-get install build-essential libpcre3-dev libssl-dev

すべての依存関係ができたので、ソースからNginxをコンパイルできます。 システム上のソースからコンパイルされるNginxを準備するには、次のスクリプトを実行します。これにより、 Makefile これは、必要なすべての依存関係を見つける場所を示しています。

  1. ./configure \
  2. --conf-path=/etc/nginx/nginx.conf \
  3. --add-module=../naxsi-0.56/naxsi_src/ \
  4. --error-log-path=/var/log/nginx/error.log \
  5. --http-client-body-temp-path=/var/lib/nginx/body \
  6. --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
  7. --http-log-path=/var/log/nginx/access.log \
  8. --http-proxy-temp-path=/var/lib/nginx/proxy \
  9. --lock-path=/var/lock/nginx.lock \
  10. --pid-path=/var/run/nginx.pid \
  11. --user=www-data \
  12. --group=www-data \
  13. --with-http_ssl_module \
  14. --without-mail_pop3_module \
  15. --without-mail_smtp_module \
  16. --without-mail_imap_module \
  17. --without-http_uwsgi_module \
  18. --without-http_scgi_module \
  19. --prefix=/usr

上記のコマンドの各行は、NginxWebサーバーのパラメーターを定義します。 これらの中で最も重要なのは --add-module=../naxsi-0.56/naxsi_src/ NAXSIモジュールをNginxに接続するパラメータ、および --user=www-data--group=www-data Nginxを、呼び出された専用ユーザー/グループのユーザーおよびグループ特権で実行するパラメーター。 www-data これはUbuntu16.04サーバーに付属しています。 The --with-http_ssl_module パラメータを使用すると、NginxサーバーでSSL暗号化を使用できます。 --without-mail_pop3_module, --without-mail_smtp_module、 と --without-mail_imap_module パラメータは、そうでなければ自動的に含まれる不要なメールプロトコルをオフにします。 これらのパラメーターの詳細については、公式のNginxドキュメントを参照してください。

使用後 ./configure コマンドを実行し、 make で定義された一連のタスクを実行するコマンド Makefile ソースコードからプログラムをビルドするために作成したばかりです。

  1. make

Nginxがビルドされて実行できるようになったら、 make install スーパーユーザーとしてコマンドを実行して、ビルドされたプログラムとそのライブラリをサーバー上の正しい場所にコピーします。

  1. sudo make install

これが成功すると、NAXSIモジュールを備えたNginxのコンパイル済みバージョンが作成されます。 NAXSIに不要なトラフィックのブロックを開始させるには、一連の構成ファイルを作成することによってNAXSIが動作する一連のルールを確立する必要があります。

ステップ2—NAXSIの構成

ファイアウォールの機能の最も重要な部分は、サーバーからの要求をどのようにブロックするかを決定するルールです。 NAXSIにデフォルトで付属している基本的なルールのセットは、コアルールと呼ばれます。 これらのルールは、リクエストの一部でパターンを検索し、攻撃の可能性があるパターンを除外することを目的としています。 NAXSIコアルールは、署名の照合のためにサーバーにグローバルに適用されます。

これらのコアルールを使用するようにNginxを構成するには、 naxsi_core.rules Nginx構成ディレクトリにファイルします。

  1. sudo cp ~/naxsi-0.56/naxsi_config/naxsi_core.rules /etc/nginx/

コアルールが確立されたので、基本的なNaxsiルールを追加します。これにより、場所ごとにコアルールが有効化および実装され、URLリクエストがコアルールを満たさない場合にサーバーが実行するアクションが割り当てられます。 というファイルを作成します naxsi.rules/etc/nginx/ ディレクトリ。 これを行うには、次のコマンドを使用してnanoというテキストエディタでファイルを開くか、選択したテキストエディタを使用します。

  1. sudo nano /etc/nginx/naxsi.rules

いくつかの基本的なファイアウォールルールを定義する次のコードブロックを追加します。

/etc/nginx/naxsi.rules
 SecRulesEnabled;
 DeniedUrl "/error.html";

 ## Check for all the rules
 CheckRule "$SQL >= 8" BLOCK;
 CheckRule "$RFI >= 8" BLOCK;
 CheckRule "$TRAVERSAL >= 4" BLOCK;
 CheckRule "$EVADE >= 4" BLOCK;
 CheckRule "$XSS >= 8" BLOCK;

上記のコードは、 DeniedUrl、これは URL NAXSIは、リクエストがブロックされたときにリダイレクトします。 このファイルは、SQLインジェクション、クロスサイトスクリプティング(XSS)、リモートファイルインクルード(RFI)など、NAXSIがブロックする必要のあるさまざまな種類の攻撃のチェックリストも有効にします。 上記のコードをファイルに追加したら、テキストエディタを保存して終了します。

ブロックされたリクエストをにリダイレクトしたので /error.html、これで作成できます error.html 内部のファイル /usr/html この宛先にランディングページを提供するディレクトリ。 テキストエディタでファイルを開きます。

  1. sudo nano /usr/html/error.html

次に、次のHTMLコードをファイルに追加して、リクエストがブロックされたことをユーザーに通知するWebページを作成します。

/usr/html/error.html
<html>
  <head>
    <title>Blocked By NAXSI</title>
  </head>
  <body>
    <div style="text-align: center">
      <h1>Malicious Request</h1>
      <hr>
      <p>This Request Has Been Blocked By NAXSI.</p>
    </div>
  </body>
</html>

ファイルを保存して、エディターを終了します。

次に、Nginx構成ファイルを開きます /etc/nginx/nginx.conf テキストエディタで。

  1. sudo nano /etc/nginx/nginx.conf

NAXSI構成ファイルをNginxの構成に追加して、WebサーバーがNAXSIの使用方法を認識できるようにするには、強調表示されたコード行を http のセクション nginx.conf ファイル:

/etc/nginx/nginx.conf
. . .
http {
    include       mime.types;
    include /etc/nginx/naxsi_core.rules;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


    default_type  application/octet-stream;
. . .

その後、 server 同じファイルのセクションに、次の強調表示された行を追加します。

/etc/nginx/nginx.conf
. . .
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        include /etc/nginx/naxsi.rules;
            root   html;
            index  index.html index.htm;
        }
. . .

NaxSIのコアルールと基本ルールを使用してNginxを構成したので、Webサーバーを起動すると、ファイアウォールは一致する悪意のある要求をブロックします。 次に、サーバーを再起動したときにNginxが確実に起動するように起動スクリプトを記述できます。

ステップ3—Nginxのスタートアップスクリプトを作成する

Nginxを手動でインストールしたので、次のステップは、システムのリロード時にWebサーバーを自動起動する起動スクリプトを作成することです。

このチュートリアルでは、Systemdソフトウェアスイートを使用してスクリプトを作成します。 これを行うには、Unitファイルを作成して( Systemdユニットとユニットファイルについてを参照)、SystemdがNginxサービスを開始および管理する方法を構成します。

と呼ばれるファイルを作成します nginx.service テキストエディタで開きます。

  1. sudo nano /lib/systemd/system/nginx.service

次の行をファイルに追加します。

/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

The [Unit] セクションは、構成しているプログラムを定義します。 [Service] 起動時にNginxがどのように動作するかを説明します。 [Install] ユニットの取り付けに関する情報を提供します。 これらの行をに追加したら nginx.service ファイル、 systemd Nginxを起動する方法を知っています。

次に、Nginxには、サーバーに十分なメモリがない場合に処理する前に、受信リクエストデータを一時的に保存するフォルダーが必要です。 ソースからNginxをインストールしたので、Nginxがこのデータを保存するために使用できるディレクトリを作成する必要があります。 と呼ばれるディレクトリを作成します body 中身 /var/lib/nginx:

  1. sudo mkdir -p /var/lib/nginx/body

起動スクリプトを設定すると、Nginxサーバーを起動できるようになります。

次のコマンドを使用してサーバーを起動します。

  1. sudo systemctl start nginx

サーバーがアクティブであることを確認するには、次のコマンドを実行します。

  1. sudo systemctl status nginx

サーバーが正常に起動したことを示す次の出力が端末に表示されます。

Output
● nginx.service - The NGINX HTTP and reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-11-05 13:59:40 UTC; 1s ago Process: 16199 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 16194 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Main PID: 16201 (nginx) Tasks: 2 Memory: 1.3M CPU: 17ms CGroup: /system.slice/nginx.service ├─16201 nginx: master process /usr/sbin/ngin └─16202 nginx: worker proces . . .

これで、NAXSIによって保護された実行中のNginxサーバーができました。 次のステップは、シミュレートされたXSSおよびSQLインジェクション攻撃を実行して、NAXSIがサーバーを効果的に保護していることを確認することです。

ステップ4—NAXSIのテスト

NixSIモジュールが有効になっている状態でNginxが稼働していることをテストするには、悪意のあるHTTPリクエストでサーバーを攻撃し、レスポンスを分析してみます。

まず、サーバーのパブリックIPをコピーして、 curl 悪意のあるリクエストをNginxサーバーに送信するコマンド。

  1. curl 'http://your_server_ip/?q="><script>alert(0)</script>'

このURLにはXSSスクリプトが含まれています "><script>alert(0)</script> の中に q パラメータであり、サーバーによって拒否される必要があります。 以前に設定したNAXSIルールに従って、にリダイレクトされます error.html ファイルを作成し、次の応答を受け取ります。

Output
<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>

NAXSIファイアウォールがリクエストをブロックしました。

次に、次のコマンドを使用してNginxサーバーログを調整することにより、Nginxログを使用して同じことを確認します。

  1. tail -f /var/log/nginx/error.log

ログには、リモートIPアドレスからのXSS要求がNAXSIによってブロックされていることがわかります。

Output
2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=1&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=8&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q="><script>alert(0)</script> HTTP/1.1", host: "your_server_ip"

プレス CTRL-C 出る tail エラーログファイルの出力を停止します。

次に、別のURLリクエストを試してください。今回は、悪意のあるSQLインジェクションクエリを使用します。

  1. curl 'http://your_server_ip/?q=1" or "1"="1"'

The or "1"="1" 上記のURLの一部は、データベース内のユーザーのデータを公開する可能性があり、NAXSIによってブロックされます。 ターミナルで同じ応答を生成する必要があります。

Output
<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>

今すぐ使用 tail サーバーログを再度追跡するには:

  1. tail -f /var/log/nginx/error.log

ログファイルには、SQLインジェクションの試行でブロックされたエントリが表示されます。

Output
2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$SQL&score0=40&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: "your_server_ip"

プレス CTRL-C ログを終了します。

NAXSIは、XSSおよびSQLインジェクション攻撃を正常にブロックしました。これは、NAXSIが正しく構成されており、NginxWebサーバーが安全であることを証明しています。

結論

これで、NAXSIを使用してWebサーバーを悪意のある攻撃から保護する方法の基本を理解できました。 Nginxの設定の詳細については、 Ubuntu 16.04 でNginxサーバーブロック(仮想ホスト)を設定する方法を参照してください。 Webサーバーのセキュリティについて引き続き調査する場合は、 Ubuntu16.04でLet’sEncryptを使用してNginxを保護する方法およびUbuntu16.04でNginxの自己署名SSL証明書を作成する方法[ X211X]。