Jetty Handler として Java モジュールをインストールする

要件

Jetty 9.2.x, 9.4.x, 10.0.x, 11.0.x, 12.0.x

サポートされているアプリケーションタイプ

Jetty 固有の実装では、Jetty 9.2.x, 9.4.x, 10.0.x, 11.0.x, または 12.0.x での HandlerWrapper ベースのインストールをサポートしています。

他の Java プラットフォーム向けの実装を作成したい場合、低レベルのエージェント RPC 通信 API も提供しています。他の Java プラットフォーム向けの実装に興味がある場合は、サポートチームまでお問い合わせください

エージェント設定

他の Next-Gen WAF モジュールと同様に、Jetty ハンドラーは、Next-Gen WAF エージェントとの通信用に、 Unix ドメインソケットと TCP ソケットの両方をサポートしています。デフォルトでは、エージェントはアドレスを unix:/var/run/sigsci.sock に設定した Unix ドメインソケットを使用します。これをオーバーライドするか、またはエージェントで rpc-address パラメータを設定することにより、代わりに TCP ソケットを指定することができます。

さらに、エージェントがデフォルトの RPC バージョン rpc-version=0 を使用するように設定されていることを確認してください。方法としては、エージェント設定でパラメータ rpc-version が指定されていないことを確認するか、指定されている場合は、0 の値で指定されていることを確認します。以下は、デフォルトの Unix ドメインソケット値をオーバーライドするエージェント設定の例です。

accesskeyid = "YOUR AGENT ACCESSKEYID"
secretaccesskey = "YOUR AGENT SECRETACCESSKEY"
rpc-address = "127.0.0.1:9999"

ダウンロード

Next-Gen WAF Java モジュールを手動でダウンロードするか、Maven でアクセスします。

手動によるダウンロード

  1. 次のいずれかのリンクをクリックして、最新の Java モジュールをダウンロードします。

  2. sigsci-module-java_latest.tar.gzを抽出します。

  3. 次のいずれかのオプションを使用して JAR ファイルをデプロイします。

    • sigsci-module-java-{version}-shaded.jar (すべての依存関係がバンドルされたuber jar) をアプリケーションのクラスパスにコピーします (例: %CATALINA_HOME%\webbapps\<APP_FOLDER>\WEB-INF\lib)。

    • sigsci-module-java-{version}.jar とその依存関係を lib フォルダからアプリケーションのクラスパス (例: %CATALINA_HOME%\webbapps\<APP_FOLDER>\WEB-INF\lib) にコピーします。アプリケーションのクラスパスフォルダー (WEB-INF\lib内の Tomcat) にすでに依存関係の jar ファイルがある場合は、バージョン番号が異なっていてもそれらをコピーする必要はありません。ログ記録の jar はオプションで、slf4j の設定に基づいて決定します。

Maven を使用したアクセス

ビルドまたはデプロイメントに Maven を使用するプロジェクトの場合、プロジェクト pom.xml のファイルに XML を追加することで、最新バージョンの Next-Gen WAF Java モジュールをインストールできます。例:

<repositories>
<repository>
<id>sigsci-stable</id>
<url>https://mvn.security.fastly.com/release/maven2</url>
</repository>
</repositories>
<dependency>
<groupId>com.signalsciences</groupId>
<artifactId>sigsci-module-java</artifactId>
<version>LATEST_MODULE_VERSION</version>
</dependency>

必ず LATEST_MODULE_VERSION を Java モジュールの最新リリースに置き換えてください。最新バージョンは、https://dl.security.fastly.com/sigsci-module-java/VERSION または https://dl.signalsciences.net/sigsci-module-java/VERSION のバージョンファイルで確認できます。

インストール

Jetty モジュールのインストールは、Jetty を組み込みアプリケーションとしてデプロイしたか、スタンドアロンアプリケーションとしてデプロイしたかによって若干異なります。

Web アプリケーション内に Jetty を組み込む場合は、組み込み Jetty の手順に従ってください。

あるいは、Web アプリケーションを Jetty インスタンスにデプロイする場合は、スタンドアロン Jetty の手順に従ってください。

組み込み Jetty

Next-Gen WAF Jetty モジュールは現在、ハンドラーとして実装されています。アプリケーションを編集して、既存のハンドラーを Next-Gen WAF ハンドラーでラップしてください。

典型的な Jetty ベースのアプリケーションは次のように、すべてのハンドラーを HandlerList に追加します。

Server server = new Server(InetSocketAddress.createUnresolved("0.0.0.0", 8800));
ServletContextHandler context = new ServletContextHandler();
ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class);
HandlerList handlers = new HandlerList();
// Servlet: /
defHolder.setInitParameter("pathInfoOnly", "true");
defHolder.setInitParameter("dirAllowed", "true");
defHolder.setInitParameter("acceptRanges", "true");
context.addServlet(defHolder, "/*");
context.addServlet(defHolder, "/");
// Existing App Handlers
handlers.addHandler(context);
handlers.addHandler(new DefaultHandler());
// Add the existing handlers as the server handler
server.setHandler(handlers);
try {
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.stop();
}

プライマリーハンドラーの周囲に Next-Gen WAF ハンドラーを追加します。例:

Server server = new Server(InetSocketAddress.createUnresolved("0.0.0.0", 8800));
ServletContextHandler context = new ServletContextHandler();
ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class);
HandlerList handlers = new HandlerList();
// Servlet: /
defHolder.setInitParameter("pathInfoOnly", "true");
defHolder.setInitParameter("dirAllowed", "true");
defHolder.setInitParameter("acceptRanges", "true");
context.addServlet(defHolder, "/*");
context.addServlet(defHolder, "/");
// Existing App Handlers
handlers.addHandler(context);
handlers.addHandler(new DefaultHandler());
// REMOVED: This is replaced by wrapping with the sigsci handler below
//server.setHandler(handlers);
//////////////////////////////////////////////////////////////////////////
// BEGIN ADDITION: Next-Gen WAF Handler
// Need to also add these imports for SignalSciencesHandler and Timeout:
// import com.signalsciences.jetty.SignalSciencesHandler;
// import com.signalsciences.rpc.util.Timeout;
//////////////////////////////////////////////////////////////////////////
// 1. Create a new SignalSciencesHandler
SignalSciencesHandler sigsciHandler = new SignalSciencesHandler();
// 2. Specify the URI of the sigsci-agent rpc-address (Unix)
sigsciHandler.getSigSciConfig().setRpcServerURI(URI.create("unix:/var/run/sigsci.sock"));
// 3. Specify a timeout
sigsciHandler.getSigSciConfig().setRpcTimeout(new Timeout(300, TimeUnit.MILLISECONDS));
// 4. Set rpcVersion to 0
sigsciHandler.getSigSciConfig().setRpcVersion(0);
// 5. Wrap the other handlers
sigsciHandler.setHandler(handlers);
// 6. Set the SignalSciencesHandler (wrapper) as the server handler
server.setHandler(sigsciHandler);
//////////////////////////////////////////////////////////////////////////
// END ADDITION
//////////////////////////////////////////////////////////////////////////
try {
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.stop();
}

スタンドアロン Jetty

Next-Gen WAF Jettyモジュールは現在、ハンドラーとして実装されています。これを使用するには、以下の手順に従ってサーバーの設定を更新する必要があります。

Jetty サーバー設定ファイルを更新する

デフォルトのJettyインストールでは、サーバー設定ファイルは {jetty.base}/etc/jetty.xmlの下にあります。設定ファイルを更新して、既存のハンドラーを Next-Gen WAF ハンドラーでラップする必要があります。ファイル内のハンドラーコレクションを指定するスタンザを修正し、 Next-Gen WAF ハンドラーを含めるようにします。以下は、標準搭載の jetty.xml ファイルを使用した例です。

<Set name="handler">
<New id="Wrapper" class="com.signalsciences.jetty.SignalSciencesHandler">
<Call name="setRpcServerURI">
<Arg>
<New class="java.net.URI">
<Arg>unix:/var/run/sigsci.sock</Arg>
</New>
</Arg>
</Call>
<Call name="setRpcTimeout">
<Arg>
<New class="com.signalsciences.rpc.util.Timeout">
<Arg type="long">300</Arg>
<Arg>
<Get class="java.util.concurrent.TimeUnit" name="MILLISECONDS"/>
</Arg>
</New>
</Arg>
</Call>
<Set name="handler">
<New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
</Item>
<Item>
<New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
</Item>
</Array>
</Set>
</New>
</Set>
</New>
</Set>

Signal Sciences ライブラリをサーバーの ClassPath にデプロイする

JAR ファイルをデプロイする方法は2つあります。

  • sigsci-module-java-{version}-shaded.jar (すべての依存関係がバンドルされた uber JAR) をサーバーのクラスパスにコピーします。

  • sigsci-module-java-{version}.jar とその依存関係を lib フォルダからサーバーのクラスパスにコピーします。

オプションですが、このライブラリを{jetty.base}/lib/extに追加することをお勧めします。Jettyはこのパスにあるライブラリを自動的にサーバーのクラスパスにロードします。

シンプルなサーバーの例

より完全な例については、ディストリビューションに含まれる sigsci-jetty-simple-example JAR ファイルを参照してください。これは、単純な動作例のバイナリ、ソース、および javadoc で構成されています。バイナリ JAR ファイルは実行可能であり、次のようなコマンドで実行できます。これらのコマンドは、シンプルなサーバーを起動し、ローカルホストの TCP ポート 5000 で実行されているエージェントを指定します。これには、rpc-address = "127.0.0.1:5000" で起動されたエージェントが必要です。

$ java -jar examples/sigsci-jetty-simple-example-{version}.jar

このコマンドは次のような出力を生成します。

tcp://127.0.0.1:5000
00:00:00.384 [main] INFO c.s.example.SimpleExampleServer - WebRoot is jar:file:/x/sigsci-jetty-simple-example-0.1.3.jar!/webroot/
00:00:00.403 [main] INFO c.s.example.SimpleExampleServer - Signal Sciences WAF: enabled
00:00:00.501 [main] INFO c.s.example.SimpleExampleServer - Signal Sciences Simple Example Server started (http://0.0.0.0:8800/)
00:00:00.986 [qtp123456789-12] INFO c.s.example.RequestLogger - "GET /test/ HTTP/1.1" 302

この例のテストサーバーは、ルートディレクトリでシンプルな HTML ページを表示して応答します。また、/test/ コンテキストを用いた基本的なテストにも利用できます。このテストのコンテキストでは、以下のパラメータが解釈されます。

  • response_time: レスポンスを遅らせるミリ秒単位の時間 (タイムアウトをテストするため)。

  • response_code: レスポンスで返される HTTP レスポンスコード。

  • size: レスポンスボディのサイズ (単位: バイト)。

例:

$ curl -D- "http://127.0.0.1:8800/test/?response_code=302&response_time=10&size=86"

このコマンドは次のような出力を生成します。

HTTP/1.1 302 Found
Date: Sat, 01 Sep 2016 00:00:00 GMT
Location: /
Content-Length: 86
Server: Jetty(9.2.z-SNAPSHOT)