Ubuntu 16.04でNAXSIを使用してNginxを保護する方法

著者はhttps://www.brightfunds.org/organizations/owasp-foundation-inc[The OWASP Foundation]を選択してhttps://do.co/w4do-cta[Write for DOnations]プログラムの一環として寄付を受け取りました.

前書き

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

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

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

前提条件

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

手順1-NginxとNAXSIのインストール

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

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

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

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

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

お気づきかもしれませんが、Nginxリポジトリは `+ tar `アーカイブです。 コンパイルしてインストールできるようにするには、まずそれを抽出する必要があります。これは、 ` tar +`コマンドを使用して実行できます。

tar -xvf nginx-.tar.gz

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

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

tar -xvf naxsi

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

cd nginx-

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

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

sudo apt-get update

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

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

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

./configure \
--conf-path=/etc/nginx/nginx.conf \
--add-module=../naxsi-/naxsi_src/ \
--error-log-path=/var/log/nginx/error.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-log-path=/var/log/nginx/access.log \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--without-mail_pop3_module \
--without-mail_smtp_module \
--without-mail_imap_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--prefix=/usr

上記のコマンドの各行は、Nginx Webサーバーのパラメーターを定義します。 これらの中で最も重要なのは、NAXSIモジュールをNginxに接続する +-add-module = .. / naxsi- / naxsi_src / +`パラメーターと、 `+-user = www-data +`および `+ --group = www-data + `パラメータ。これにより、Nginxは、Ubuntu 16.04サーバーに付属している + www-data + という専用のユーザー/グループのユーザーおよびグループ特権で実行されます。 `+-with-http_ssl_module +`パラメーターにより、NginxサーバーはSSL暗号化を使用でき、 `+-without-mail_pop3_module ++-without-mail_smtp_module +、および `+-without-mail_imap_module +`パラメーターはそれ以外の場合は自動的に含まれる不要なメールプロトコルをオフにします。 これらのパラメーターの詳細については、http://nginx.org/en/docs/configure.html [official Nginx docs]を参照してください。

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

make

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

sudo make install

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

ステップ2-NAXSIの構成

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

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

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

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

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

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

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 +`を開きます。

sudo nano /etc/nginx/nginx.conf

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

/etc/nginx/nginx.conf

. . .
http {
   include       mime.types;





   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 / {

           root   html;
           index  index.html index.htm;
       }
. . .

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

手順3-Nginxの起動スクリプトの作成

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

このチュートリアルでは、Systemdソフトウェアスイートを使用してスクリプトを作成します。 これを行うには、ユニットファイル(https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files[Understanding Systemd Units and Unit Files]を参照)を作成して、さらに学習します。 SystemdがNginxサービスを開始および管理する方法を設定します。

`+ nginx.service +`というファイルを作成し、テキストエディターで開きます。

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

+ [Unit] +`セクションは設定するプログラムを定義し、 `+ [Service] +`は起動時のNginxの動作を説明し、 `+ [Install] +`はユニットのインストールに関する情報を提供します。 これらの行を `+ nginx.service`ファイルに追加すると、 + systemd`はNginxの起動方法を認識します。

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

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

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

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

sudo systemctl start nginx

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

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:  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のテスト

NAXSIモジュールが有効な状態でNginxが稼働していることをテストするには、悪意のあるHTTP要求でサーバーにアクセスして応答を分析します。

まず、サーバーのパブリックIPをコピーし、 `+ curl +`コマンドを使用して、Nginxサーバーに悪意のある要求を行います。

curl 'http:///?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ログを使用して同じことを確認します。

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

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

Output2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=&server=&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: , server: localhost, request: "GET /?q="><script>alert(0)</script> HTTP/1.1", host: ""

`+ CTRL + C `を押して ` tail +`を終了し、エラーログファイルの出力を停止します。

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

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

上記のURLの「+」または「1」= "1" + `部分は、データベース内のユーザーのデータを公開でき、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 +`を使用します。

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

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

Output2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=&server=&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: , server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: ""

ログを終了するには、 `+ CTRL-C +`を押します。

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

結論

これで、NAXSIを使用してWebサーバーを悪意のある攻撃から保護する方法の基本的な理解ができました。 Nginxのセットアップの詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04 [How Ubuntu 16.04でNginxサーバーブロック(仮想ホスト)をセットアップするには]。 Webサーバーのセキュリティの研究を続けたい場合は、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16をご覧ください。 -04 [Ubuntu 16.04でLet’s Encryptを使用してNginxを保護する方法]およびhttps://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in -ubuntu-16-04 [Ubuntu 16.04でNginxの自己署名SSL証明書を作成する方法]。

Related