ブログ | NGINX

NGINX および NGINX Plus 用のサードパーティ動的モジュールのコンパイル

NGINX-F5 水平黒タイプ RGB の一部
オーウェン・ギャレット サムネイル
オーウェン・ギャレット
2016 年 10 月 25 日公開

編集者– 動的モジュール サポートの最初のリリース (NGINX Open Source 1.9.11、2016 年 2 月) を発表したブログ投稿は、ここにリダイレクトされます。 その投稿で説明されているビルド プロセスは非推奨です。

この投稿は、NGINX Open Source および NGINX Plus でサードパーティの動的モジュールを使用する方法に関する 2 部構成のシリーズの一部です。

  • この投稿では、実行時に NGINX Open Source または NGINX Plus によってロードできるサードパーティの動的モジュールをコンパイルするための手順を段階的に説明します。
  • 2 番目の投稿では、運用環境向けのサードパーティの動的モジュール ビルドを自動化するためのガイダンスとツールを提供します。 バージョン依存関係チェックを含むサードパーティの動的モジュール用のインストール可能なパッケージを作成する方法について説明します。

 

NGINX Open Source 1.11.5 およびNGINX Plus Release R11では、動的モジュールのバイナリ互換性が導入されました。 この記事では、開発環境で NGINX Open Source および NGINX Plus で使用するためにサードパーティ モジュールをコンパイルする方法について説明します。 運用環境でサードパーティの動的モジュールを構築、デプロイ、およびアップグレードする手順については、 「動的モジュールのインストール可能なパッケージの作成」を参照してください。

簡潔にするために、この投稿の残りの部分では、NGINX Plus と NGINX Open Source の違いが関係する場合を除き、NGINX Plus のみについて説明します。 特に記載のない限り、NGINX Plus に関するすべての記述は NGINX Open Source にも適用されます。

動的モジュールの概要

NGINX Plus にロードできるモジュールは C で記述されており、NGINX Wiki の「NGINX の拡張」で説明されている API に準拠しています。 言語インタープリターからセキュリティ ソリューションに至るまで、サードパーティ モジュールの大規模なエコシステムがあり、その一部は NGINX Plus に含まれ、サポートされています

その他のサードパーティ モジュールや独自に作成したモジュールは、個別にコンパイルし、実行時に NGINX Plus に動的にロードする必要があります。 以下の 2 つの例に示すように、これらのモジュールを NGINX Open Source に対してビルドすることで、NGINX Plus で使用するためにコンパイルできます。

  1. 対応するNGINXオープンソースリリースを入手する
  2. モジュールソースを取得し、必要に応じてモジュールの設定ファイルを変更します。
  3. configureコマンドに--with-compat引数を指定して、NGINXオープンソースリリースに対して動的モジュールをビルドします
  4. 結果として得られた動的モジュール.soファイル)をNGINX Plusにロードし、組み込みモジュールのように使用します。

例: シンプルな「Hello World」モジュール

この例では、単純なHello World モジュールを使用して、モジュールのソースを更新し、NGINX Plus にロードする方法を示します。 「Hello World」モジュールは、単純なメッセージでリクエストに応答する単純なディレクティブ ( hello_world ) を実装します。

ステップ1: NGINXオープンソースリリースを入手する

  1. NGINX Plus インストールに対応する NGINX オープンソース バージョンを確認します。 この例では、NGINX 1.11.5 です。

    $ nginx -v nginx バージョン: nginx/1.11.5 (nginx-plus-r11)
    
  2. nginx.org/downloadから対応する NGINX オープンソース パッケージをダウンロードします。

    $ wget https://nginx.org/download/nginx-1.11.5.tar.gz $ tar -xzvf nginx-1.11.5.tar.gz
    

ステップ2: モジュールソースを取得する

  1. GitHubから「Hello World」NGINX モジュールのソースを取得します。

    $ git clone https://github.com/perusio/nginx-hello-world-module.git
    
  2. モジュールの設定シェル ファイルはモジュールの構築方法を定義します。その形式は、動的モジュールの場合と、NGINX オープンソース バイナリに静的に構築されるモジュールの場合とで異なります

    nginx-hello-world-module/configファイルを変更して、次の内容を含めます。

    ngx_addon_name=ngx_http_hello_world_module
    
    if test -n "$ngx_module_link"; then
    ngx_module_type=HTTP
    ngx_module_name=ngx_http_hello_world_module
    ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"
    
    . auto/module
    else
    HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
    fi
    

動的モジュールのコンパイルに関する詳細情報(モジュールの設定ファイルを古い形式から更新する手順を含む)については、 NGINX Wiki を参照してください。

ステップ3: 動的モジュールをコンパイルする

  1. まず--with-compat引数を指定してconfigureスクリプトを実行し、モジュールをコンパイルします。これにより、NGINX Open Source と NGINX Plus の両方でサポートされる標準ビルド環境が作成されます。 次に、 make modulesを実行してモジュールをビルドします。

    $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module $モジュールを作成する
    
  2. モジュール ライブラリ ( .soファイル) を/etc/nginx/modulesにコピーします。

    $ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
    

ステップ4: モジュールをロードして使用する

  1. モジュールを NGINX Plus にロードするには、 nginx.conf設定ファイルの最上位 (メイン) コンテキスト ( httpまたはstreamコンテキスト内ではない) にload_moduleディレクティブを追加します。

    モジュールモジュール/ngx_http_hello_world_module.so をロードします。
    
  2. httpコンテキストで、Hello World モジュールによって提供されるhello_worldディレクティブを使用してlocationブロックを追加します。 場所へのリクエストは、 hello world という応答を返します。

    サーバー {
    listen 80;
    
    location / {
    hello_world;
    }
    }
    
  3. NGINX Plus の設定をリロードし、簡単なリクエストでテストします。

    $ nginx -s リロード$ curl http://localhost/ hello world
    

例: NAXSI Web アプリケーション ファイアウォール

NAXSI は、ヒューリスティックとスコアリング システムを使用して XSS や SQL インジェクション攻撃などの疑わしいリクエストを識別する、使いやすく高性能な Web アプリケーション ファイアウォール (WAF) です。

NAXSI ソースは、 configシェル ファイルの新しい形式に準拠するように更新されているため、NGINX Plus の動的モジュールの構築は簡単です。 このプロセスは、NAXSI インストール手順に基づいています。

$ git clone https://github.com/nbs-system/naxsi.git $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src $モジュールを作成$ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

nginx.confファイルのメイン コンテキストにload_moduleディレクティブを追加して、モジュールを NGINX Plus コアにロードします。

モジュールモジュール/ngx_http_naxsi_module.so をロードします。

NAXSI 構成については、プロジェクト ドキュメントで詳しく説明されています。 次の NGINX 構成は、モジュールの動作を示しています。

# この 'include' ディレクティブを編集して、naxsi_core.rules ファイルを指すようにします
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

server {
listen 80;

location / {
root /usr/share/nginx/html;

# NAXSI を有効にします
SecRulesEnabled;

# ブロックされたリクエストの送信先を定義します
DeniedUrl "/50x.html";

# CheckRules、NAXSI がいつアクションを実行する必要があるかを決定します
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

# ブロックされたリクエストが記録される error_log を忘れないでください
error_log /tmp/naxsi.log;
}

error_page 500 502 503 504 /50x.html;
}

次のような簡単な HTTP リクエストのペアを使用して、NAXSI の正しい動作を確認できます。

  • curl http://localhost/ は、 /usr/share/nginx/htmlに保存されている標準の NGINX Plus インデックス ページを返します。
  • curl "http://localhost/?a=<>" はNAXSI の XSS 検出をトリガーし、リクエストをブロックして、 /usr/share/nginx/htmlから標準の50x.htmlエラー ページを返します。 また、 error_logにメッセージを記録します。

実稼働環境での展開では、署名された NAXSI リリースをhttps://github.com/nbs-system/naxsi/tagsからダウンロードし、同様の方法でコンパイルすることもできます。

NGINX Plusで動的モジュールをサポートする方法

注記: このセクションの情報は、NGINX Plus にのみ適用されます。 ビルド済みの NGINX オープンソース パッケージに同梱されている動的モジュールのセットは、NGINX Plus に同梱されているものとは異なる場合があります。 NGINX Open Source で使用される動的モジュールは、NGINX ソース コードやビルド済みバイナリと同じようにサポートされます。

NGINX Plus には多数の動的モジュールが付属しており、モジュール リポジトリから直接ダウンロードすることもできます。 リストについては、動的モジュールのページを参照してください。 これらのモジュールには 2 つのタイプがあります。

  • NGINX Plus モジュールは、NGINX エンジニアリング チームによって作成および/または保守されています。 技術的な理由(追加の依存関係があるなど)またはプレビュー状態であるため、NGINX Plus にはこれらを含めません。 プレビュー モジュールは現在開発中であり、細心の注意を払って導入する必要があります。 それ以外の場合、NGINX Plus モジュールは NGINX によって完全にサポートされます。リストについては、動的モジュールページで作成者NGINXでフィルタリングしてください。
  • NGINX Plus 認定コミュニティ モジュールは、 NGINX がテストして配布する人気のサードパーティ モジュールであり、インストールと基本構成のサポートを提供します。 当社は、これらのモジュールが NGINX Plus の正しい動作を妨げないことを保証し、NGINX Plus のリリースごとに、またはセキュリティ リリースがあるときに必要に応じて更新します。 リストを表示するには、 「動的モジュール」ページで作成者コミュニティ別にフィルタリングします。

さらに、NGINX は、 NGINX Plus 認定モジュールプログラムに参加している商用ベンダーのモジュールを認定します。 これらのモジュールはベンダーによって配布およびサポートされます。 リストを表示するには、動的モジュールページで著者の認定パートナー別にフィルタリングします。

NGINX は、ユーザーが独自にコンパイルしたモジュール (他のコミュニティ モジュール、NGINX Plus 認定モジュール プログラムに含まれないサードパーティ ベンダーが提供するモジュール、カスタム モジュール) をテストまたはサポートしません。 問題についてテクニカル サポートを依頼する場合、NGINX サポート チームは、テクニカル サポート プロセスの一環として、サポートされていないモジュールを削除して障害を再現するよう依頼することがあります。これにより、障害の原因がサポートされていないモジュールであるかどうかを確認できます。

まとめ

NGINX Plus の動的モジュール ビルド プロセスを使用すると、NGINX オープンソース モジュールの広範なエコシステムを活用し、機能豊富で完全にサポートされている NGINX Plus コア上でモジュールを実行できます。

現在、サードパーティの拡張機能を備えた NGINX Open Source を使用している場合、これらの拡張機能はコンパイルされ、NGINX Plus にロードできる可能性が高くなります。

商用モジュールまたはコミュニティ モジュールを開発する場合、新しいビルド プロセスにより、ユーザーは NGINX Plus を使用してモジュールをデプロイできるようになります。 商用モジュールの認定については、 「NGINX Plus 認定モジュール」を参照してください。

モジュールの開発やその構成シェル ファイルの更新に関してサポートが必要な場合は、次のリソースを参照してください。

NGINX 開発者メーリング リストはコミュニティ サポートの頼りになる場所であり、弊社のプロフェッショナル サービス チームも喜んでサポートいたします。

NGINX Plus で動的モジュールを実際に試すには、今すぐ30 日間の無料トライアルを開始するか、弊社にお問い合わせの上、使用事例についてご相談ください


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"