コンテナ提供フィルター

目次

はじめに

Tomcatは、$CATALINA_BASE/conf/web.xmlを使用してすべてのWebアプリケーションで使用するために設定できる、またはアプリケーションのWEB-INF/web.xmlで設定することで個々のWebアプリケーションで使用するために設定できる多数のフィルターを提供します。各フィルターについては以下に説明します。

この説明では、変数名$CATALINA_BASEを使用して、ほとんどの相対パスが解決される基準ディレクトリを参照しています。$CATALINA_BASEディレクトリを設定することでTomcatを複数のインスタンス用に設定していない場合は、$CATALINA_BASEはTomcatをインストールしたディレクトリである$CATALINA_HOMEの値に設定されます。

デフォルト文字セットフィルターの追加

はじめに

HTTP仕様では、「text」メディアタイプのメディアサブタイプに文字セットが指定されていない場合は、ISO-8859-1文字セットを使用する必要があると明記されています。ただし、ブラウザは文字セットを自動検出しようとすることがあります。これは、攻撃者がXSS攻撃を実行するために悪用される可能性があります。Internet Explorerなどのブラウザには、この動作を有効にするオプションがあります。

このフィルターは、文字セットを明示的に設定することで攻撃を防ぎます。ユーザーによって提供された文字セットが明示的に上書きされない限り、ブラウザは明示的に設定された文字セットに従うため、XSS攻撃を防ぎます。

フィルタークラス名

デフォルト文字セットフィルターのフィルタークラス名はorg.apache.catalina.filters.AddDefaultCharsetFilterです。

初期化パラメータ

デフォルト文字セットフィルターは、次の初期化パラメータをサポートしています

属性説明
encoding

サーブレットによって他の文字セットが明示的に設定されていない場合に設定する必要がある文字セットの名前。このパラメータには、defaultsystemの2つの特別な値があります。systemの値は、通常はロケールによって設定されるJVM全体のデフォルト文字セットを使用します。defaultの値はISO-8859-1を使用します。

CORSフィルター

はじめに

このフィルターは、クロスオリジンリクエストを有効にするメカニズムであるW3CのCORS(クロスオリジンリソース共有)仕様の実装です。

このフィルターは、必要なAccess-Control-*ヘッダーをHttpServletResponseオブジェクトに追加することで機能します。このフィルターは、HTTPレスポンススプリッティングも防止します。リクエストが無効であるか、許可されていない場合、リクエストはHTTPステータスコード403(禁止)で拒否されます。このフィルターによるリクエスト処理を示すフローチャートを利用できます。

このフィルターを使用するために必要な最小限の設定は次のとおりです。

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

上記の設定によりフィルターは有効になりますが、クロスオリジンポリシーは緩和されません。最低限、クロスオリジンリクエストを有効にするために、以下で説明するcors.allowed.origins初期化パラメータを追加する必要があります。要件に応じて、追加の設定が必要になる場合があります。

このフィルターのインスタンスは、1つのポリシーのみを実装できます。異なるポリシー(例:異なる許可されたオリジン)をWebアプリケーション内の異なるURLまたはURLセットに適用する場合は、設定する各ポリシーに対して、このフィルターの個別のインスタンスを設定する必要があります。

フィルタークラス名

CORSフィルターのフィルタークラス名はorg.apache.catalina.filters.CorsFilterです。

初期化パラメータ

CORSフィルターは、次の初期化パラメータをサポートしています

属性説明
cors.allowed.origins

リソースへのアクセスが許可されるオリジンのリスト。リソースへのアクセスを任意のオリジンから有効にするには*を指定できます。それ以外の場合は、コンマ区切りのオリジンの許可リストを提供できます。例:https://www.w3.org, https://apache.dokyumento.jpデフォルト:空の文字列。(リソースへのアクセスは許可されません)。

cors.allowed.methods

クロスオリジンリクエストを使用してリソースにアクセスするために使用できるHTTPメソッドのコンマ区切りのリスト。これらは、事前飛行レスポンスのAccess-Control-Allow-Methodsヘッダーの一部としても含まれるメソッドです。例:GET, POSTデフォルト:GET, POST, HEAD, OPTIONS

cors.allowed.headers

実際の要求を行う際に使用できる要求ヘッダーのコンマ区切りのリスト。これらのヘッダーは、事前飛行レスポンスのAccess-Control-Allow-Headersヘッダーの一部としても返されます。例:Origin,Acceptデフォルト:Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers

cors.exposed.headers

ブラウザがアクセスできる単純なレスポンスヘッダー以外のヘッダーのコンマ区切りのリスト。これらは、事前飛行レスポンスのAccess-Control-Expose-Headersヘッダーの一部としても含まれるヘッダーです。例:X-CUSTOM-HEADER-PING,X-CUSTOM-HEADER-PONGデフォルト:なし。単純ではないヘッダーはデフォルトでは公開されません。

cors.preflight.maxage

ブラウザが事前飛行リクエストの結果をキャッシュできる秒数。これは、事前飛行レスポンスのAccess-Control-Max-Ageヘッダーの一部として含まれます。負の値は、CORSフィルターがこのレスポンスヘッダーを事前飛行レスポンスに追加しないようにします。デフォルト:1800

cors.support.credentials

リソースがユーザー資格情報をサポートするかどうかを示すフラグ。このフラグは、事前飛行レスポンスのAccess-Control-Allow-Credentialsヘッダーの一部として公開されます。これは、ブラウザが資格情報を使用して実際の要求を行うことができるかどうかを判断するのに役立ちます。デフォルト:false

cors.request.decorate

CORS固有の属性をHttpServletRequestオブジェクトに追加するかどうかを制御するフラグ。デフォルト:true

デフォルトを上書きする、より高度な設定の例を次に示します。

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>https://apache.dokyumento.jp</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

CORSフィルターとHttpServletRequest属性

CORSフィルターは、ダウンストリームで消費するために、HttpServletRequestオブジェクトにリクエストに関する情報を追加します。cors.request.decorate初期化パラメータがtrueの場合、次の属性が設定されます。

  • cors.isCorsRequest:リクエストがCORSリクエストかどうかを判断するためのフラグ。
  • cors.request.origin:オリジンURL、つまりリクエストの発信元のページのURL。
  • cors.request.type:CORSリクエストの種類。可能な値
    • SIMPLE:事前飛行リクエストの前にないリクエスト。
    • ACTUAL:事前飛行リクエストの前にあるリクエスト。
    • PRE_FLIGHT:事前飛行リクエスト。
    • NOT_CORS:通常の同一オリジンリクエスト。
    • INVALID_CORS:無効なクロスオリジンリクエスト。
  • cors.request.headers:事前飛行リクエストのAccess-Control-Request-Headersヘッダーとして送信されたリクエストヘッダー。

CSRF防止フィルター

はじめに

このフィルターは、Webアプリケーションの基本的なCSRF保護を提供します。このフィルターは、/*にマッピングされ、クライアントに返されるすべてのURLがHttpServletResponse#encodeRedirectURL(String)またはHttpServletResponse#encodeURL(String)への呼び出しによってエンコードされていることを前提としています。

このフィルターは、ノンスを生成してセッションに格納することでCSRFを防ぎます。URLも、同じノンスを使用してエンコードされます。次のリクエストを受信すると、リクエスト内のノンスがセッション内のノンスと比較され、両方が同じ場合のみ、リクエストは続行されます。

フィルタークラス名

CSRF防止フィルターのフィルタークラス名はorg.apache.catalina.filters.CsrfPreventionFilterです。

初期化パラメータ

CSRF防止フィルターは、次の初期化パラメータをサポートしています

属性説明
denyStatus

拒否されたリクエストを拒否する際に使用されるHTTPレスポンスステータスコード。デフォルト値は403です。

enforce

強制を有効または無効にするフラグ。強制が無効になっている場合、CsrfPreventionFilterはすべてのリクエストを許可し、CSRFの失敗をDEBUGメッセージとしてログに記録します。デフォルトはtrueで、CSRF保護の強制が有効になります。

entryPoints

有効なノンスの存在がテストされないURLのコンマ区切りのリスト。これらは、離れたアプリケーションからナビゲートした後に保護されたアプリケーションにナビゲートするための方法を提供するために使用されます。エントリポイントはHTTP GETリクエストに限定され、セキュリティに影響を与えるアクションをトリガーするべきではありません。

nonceCacheSize

並列リクエストをサポートするためにLRU方式でキャッシュされる、以前に発行されたノンスの数です。ブラウザの更新や戻るボタンの使用、以前のノンスが現在のノンスではなく送信される可能性のある同様の動作による制限付きの使用が含まれます。設定しない場合、デフォルト値の5が使用されます。

nonceRequestParameterName

ノンスに使用されるリクエストパラメータの名前です。設定しない場合、デフォルト値のorg.apache.catalina.filters.CSRF_NONCEが使用されます。

randomClass

ノンスを生成するために使用するクラスの名前です。このクラスはjava.util.Randomのインスタンスである必要があります。設定しない場合、デフォルト値のjava.security.SecureRandomが使用されます。

noNonceURLPatterns

CSRFノンスが追加されないURLパターンのリストです。リソースキャッシングなどを妨げる可能性のある一意のURLを作成しないように、特定のURLにノンスを追加しない場合があります。

サポートされているパターンにはいくつかの種類があります。

  • *で終わるパターンを使用したプレフィックスマッチ。例:/images/*
  • *で始まるパターンを使用したサフィックスマッチ。例:*.css
  • mime:で始まり、URLファイル名のMIMEタイプに対してチェックされる上記マッチのいずれかを指定するMIMEタイプマッチ。例:mime:image/*。MIMEタイプはServletContext.getMimeTypeを使用して決定されます。
  • /(スラッシュ)記号で始まり終わる単一の完全な正規表現パターン。例://images/.*|/scripts/.*/。先頭と末尾の/文字は、コンパイル前にパターンから削除されます。パターンは1つだけですが、正規表現の|OR)演算子を使用して、そのパターンには必要な数の代替案を含めることができます。正規表現はURL全体にマッチします(つまり、findではなくmatchのセマンティクス)。正規表現のダイアレクトはJava(java.util.regex.Pattern)です。

デフォルトは*.css, *.js, *.gif, *.png, *.jpg, *.svg, *.ico, *.jpeg, *.mjsです。

REST APIのためのCSRF防止フィルター

はじめに

このフィルタは、REST APIに対する基本的なCSRF保護を提供します。CSRF保護は、保護されたリソースに対する変更を行うHTTPリクエスト(GET、HEAD、OPTIONSとは異なる)のみに適用されます。有効なノンスを提供するカスタムヘッダーX-CSRF-Tokenに基づいています。

REST APIのCSRF保護メカニズムは、次の手順で構成されます。

  • クライアントが有効なノンスを要求します。これは、保護されたリソースに対する変更を行わない「Fetch」リクエストを使用して実行されます。
  • サーバーは、現在のユーザーセッションにマップされた有効なノンスで応答します。
  • クライアントは、同じユーザーセッションの範囲内で、後続の変更リクエストでこのノンスを提供します。
  • サーバーは、有効なノンスが含まれていない保護されたリソースに対するすべての変更リクエストを拒否します。

基本的な設定例

サーバー側では

  • すべてのCSRF保護されたREST APIは、認証メカニズムで保護する必要があります。
  • このフィルタで変更を行うREST APIを保護します。
  • 変更を行わない操作を少なくとも1つ提供します。
<filter>
  <filter-name>RestCSRF</filter-name>
  <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>RestCSRF</filter-name>
  <!-- Modifying operations -->
  <url-pattern>/resources/removeResource</url-pattern>
  <url-pattern>/resources/addResource</url-pattern>
  <!-- Non-modifying operations -->
  <url-pattern>/resources/listResources</url-pattern>
</filter-mapping>

クライアント側では

  • 有効なノンスを取得するために、変更を行わない「Fetch」リクエストを行います。追加ヘッダーX-CSRF-Token: Fetchを送信することで実行できます。
  • 返されたセッションIDとノンスをキャッシュして、保護されたリソースに対する後続の変更リクエストで提供します。
  • 無効または不足しているノンス、セッションの期限切れ、またはサーバーによってセッションIDが変更された場合、変更リクエストが拒否され、ヘッダーX-CSRF-Token: Requiredが返されます。
Client Request:
GET /rest/resources/listResources HTTP/1.1
X-CSRF-Token: Fetch
Authorization: Basic ...
Host: localhost:8080
...

Server Response:
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=...; Path=/rest; HttpOnly
X-CSRF-Token: ...
...

Client Request:
POST /rest/resources/addResource HTTP/1.1
Cookie: JSESSIONID=...
X-CSRF-Token: ...
Authorization: Basic ...
Host: localhost:8080
...

Server Response:
HTTP/1.1 200 OK
...

RestCsrfPreventionFilterとHttpServletRequestパラメータ

クライアントがREST APIへの呼び出しでカスタムヘッダーを挿入できない場合、有効なノンスがリクエストパラメータとして受け入れられるように構成できる追加機能があります。

注:X-CSRF-Tokenヘッダーがある場合、リクエスト内の同じ名前のパラメータよりも優先して使用されます。リクエストパラメータは新しいノンスの取得に使用できません。新しいノンスを要求するには、ヘッダーのみを使用できます。

<filter>
  <filter-name>RestCSRF</filter-name>
  <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
  <init-param>
    <param-name>pathsAcceptingParams</param-name>
    <param-value>/resources/removeResource,/resources/addResource</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>RestCSRF</filter-name>
  <url-pattern>/resources/*</url-pattern>
</filter-mapping>

フィルタークラス名

REST APIのCSRF防止フィルタのフィルタクラス名はorg.apache.catalina.filters.RestCsrfPreventionFilterです。

初期化パラメータ

REST APIのCSRF防止フィルタは、次の初期化パラメータをサポートしています。

属性説明
denyStatus

拒否されたリクエストを拒否する際に使用されるHTTPレスポンスステータスコード。デフォルト値は403です。

pathsAcceptingParams

リクエストパラメータX-CSRF-Tokenを介してノンスを受け入れることができるURLのカンマ区切りリストです。ヘッダーを介してノンス情報を提供できないユースケースでは、リクエストパラメータを介して提供できます。X-CSRF-Tokenヘッダーがある場合、リクエスト内の同じ名前のパラメータよりも優先して使用されます。リクエストパラメータは新しいノンスの取得に使用できません。新しいノンスを要求するには、ヘッダーのみを使用できます。

randomClass

ノンスを生成するために使用するクラスの名前です。このクラスはjava.util.Randomのインスタンスである必要があります。設定しない場合、デフォルト値のjava.security.SecureRandomが使用されます。

Expiresフィルター

はじめに

ExpiresFilterは、Apache mod_expiresのJava Servlet APIポートです。このフィルタは、サーバー応答のExpires HTTPヘッダーとCache-Control HTTPヘッダーのmax-ageディレクティブの設定を制御します。有効期限日は、ソースファイルが最後に変更された時刻、またはクライアントアクセス時刻のいずれかに対して相対的に設定できます。

これらのHTTPヘッダーは、ドキュメントの有効性と永続性に関するクライアントへの指示です。キャッシュされている場合、この時間が経過するまで、ドキュメントはソースからではなくキャッシュからフェッチされる可能性があります。その後、キャッシュコピーは「期限切れ」かつ無効と見なされ、ソースから新しいコピーを取得する必要があります。

max-age以外のCache-Controlディレクティブを変更するには(RFC 2616セクション14.9を参照)、他のサーブレットフィルタまたはApache Httpd mod_headersモジュールを使用できます。

基本的な設定例

画像、CSS、JavaScriptに「Expires」と「Cache-Control: max-age=」ヘッダーを追加するための基本的な構成。

<filter>
 <filter-name>ExpiresFilter</filter-name>
 <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
 <init-param>
    <param-name>ExpiresByType image</param-name>
    <param-value>access plus 10 minutes</param-value>
 </init-param>
 <init-param>
    <param-name>ExpiresByType text/css</param-name>
    <param-value>access plus 10 minutes</param-value>
 </init-param>
 <init-param>
    <param-name>ExpiresByType text/javascript</param-name>
    <param-value>access plus 10 minutes</param-value>
 </init-param>
</filter>
...
<filter-mapping>
 <filter-name>ExpiresFilter</filter-name>
 <url-pattern>/*</url-pattern>
 <dispatcher>REQUEST</dispatcher>
</filter-mapping>

代替構文

ExpiresDefaultおよびExpiresByTypeディレクティブは、より読みやすい構文で定義することもできます。

<init-param>
 <param-name>ExpiresDefault</param-name>
 <param-value><base> [plus] {<num> <type>}*</param-value>
</init-param>

<init-param>
 <param-name>ExpiresByType type</param-name>
 <param-value><base> [plus] {<num> <type>}*</param-value>
</init-param>

<init-param>
 <param-name>ExpiresByType type;encoding</param-name>
 <param-value><base> [plus] {<num> <type>}*</param-value>
</init-param>

ここで、<base>は次のいずれかです。

  • access
  • now('access'と同等)
  • modification

plusキーワードは省略可能です。<num>は整数値(Integer.parseInt()で受け入れられる)でなければならず、<type>は次のいずれかです。

  • yearyears
  • monthmonths
  • weekweeks
  • daydays
  • hourhours
  • minuteminutes
  • secondseconds

たとえば、次のディレクティブのいずれかを使用して、デフォルトでドキュメントがアクセス後1か月で期限切れになるようにできます。

<init-param>
 <param-name>ExpiresDefault</param-name>
 <param-value>access plus 1 month</param-value>
</init-param>

<init-param>
 <param-name>ExpiresDefault</param-name>
 <param-value>access plus 4 weeks</param-value>
</init-param>

<init-param>
 <param-name>ExpiresDefault</param-name>
 <param-value>access plus 30 days</param-value>
</init-param>

有効期限は、複数の「<num> <type>」句を追加することで微調整できます。

<init-param>
 <param-name>ExpiresByType text/html</param-name>
 <param-value>access plus 1 month 15 days 2 hours</param-value>
</init-param>

<init-param>
 <param-name>ExpiresByType image/gif</param-name>
 <param-value>modification plus 5 hours 3 minutes</param-value>
</init-param>

変更日ベースの設定を使用する場合、ディスク上のファイルから取得されないコンテンツにはExpiresヘッダーが追加されません。これは、このようなコンテンツには変更時刻がないためです。

有効期限ヘッダー生成の適格性

ExpiresFilterによって強化される応答は、次の場合に適格です。

  1. 有効期限ヘッダーが定義されていない(ExpiresヘッダーまたはCache-Controlヘッダーのmax-ageディレクティブ)、
  2. 応答ステータスコードがディレクティブExpiresExcludedResponseStatusCodesによって除外されていない、
  3. 応答のContent-TypeExpiresByTypeディレクティブで定義されたタイプのいずれかに一致するか、ExpiresDefaultディレクティブが定義されている。

注:Cache-Controlヘッダーにmax-age以外のディレクティブが含まれている場合、ExpiresFilterによって追加されるmax-ageディレクティブと連結されます。

有効期限設定の選択

有効期限の構成は、次のアルゴリズムに従って選択されます。

  1. HttpServletResponse.getContentType()によって返される正確なコンテンツタイプ(文字セットを含む場合もあります(例: 'text/xml;charset=UTF-8'))、
  2. HttpServletResponse.getContentType()に文字セットが含まれている場合の文字セットを含まないコンテンツタイプ(例: 'text/xml;charset=UTF-8' -> 'text/xml')、
  3. HttpServletResponse.getContentType()のメジャータイプ(例:'/'の前にある部分文字列)(例: 'text/xml;charset=UTF-8' -> 'text')、
  4. ExpiresDefault

フィルタークラス名

Expiresフィルタのフィルタクラス名はorg.apache.catalina.filters.ExpiresFilterです。

初期化パラメータ

Expiresフィルタは、次の初期化パラメータをサポートしています。

属性説明
ExpiresExcludedResponseStatusCodes

このディレクティブは、ExpiresFilterが有効期限ヘッダーを生成しないHTTP応答ステータスコードを定義します。デフォルトでは、ステータスコード304(「Not modified」)はスキップされます。値は、HTTPステータスコードのカンマ区切りリストです。

このディレクティブは、ExpiresDefaultディレクティブの使用を容易にするのに役立ちます。実際、ExpiresCache-Control:max-age=ヘッダーと組み合わせた304 Not modifiedContent-Typeヘッダーを指定します)の動作は、理解するのが不必要に難しくなる可能性があります。

表の下のサンプルを参照してください。

ExpiresByType <content-type>

このディレクティブは、指定されたタイプのドキュメント(例:text/html)に対して生成されるExpiresヘッダーとCache-Controlヘッダーのmax-ageディレクティブの値を定義します。第2引数は、有効期限日を構築するために基本時刻に追加される秒数を設定します。Cache-Control: max-ageは、要求時刻から有効期限日を差し引いて、その結果を秒数で表すことで計算されます。

基本時刻は、ファイルの最終変更時刻、またはクライアントによるドキュメントへのアクセス時刻のいずれかです。どちらを使用するかは<code>フィールドで指定されます。Mは、ファイルの最終変更時刻を基本時刻として使用する必要があることを意味し、Aはクライアントのアクセス時刻を使用する必要があることを意味します。期間は秒単位で表されます。A2592000は、代替構文でaccess plus 30 daysを表します。

効果の違いは微妙です。M(代替構文のmodification)を使用する場合、すべてのキャッシュ内のドキュメントの現在のすべてのコピーは同時に期限切れになりますが、同じURLに常に存在する週刊通知などには適しています。A(代替構文のaccessまたはnow)を使用する場合、有効期限日はクライアントごとに異なります。これは、あまり変更されない画像ファイル、特に同じ画像を参照する一連の関連ドキュメント(つまり、画像は比較的短い時間内に繰り返しアクセスされます)に適しています。

注:コンテンツタイプに文字セットが含まれている場合(例:'ExpiresByType text/xml;charset=utf-8')、Tomcatは';'と'charset'キーワードの間の空白文字を削除します。このため、文字セットを含む有効期限の構成には、そのようなスペース文字を含めないでください。

表の下のサンプルを参照してください。

指定されたMIMEタイプに対してのみ、ExpiresDefaultディレクティブによって設定された有効期限を上書きします。

このドキュメントの前半で説明されている代替構文を使用して、有効期限の計算を指定することもできます。

ExpiresDefault

このディレクティブは、影響を受けるレルム内のすべてのドキュメントの有効期限計算のデフォルトアルゴリズムを設定します。ExpiresByTypeディレクティブによって、タイプごとに上書きできます。引数の構文の詳細、および「代替構文」の説明については、そのディレクティブの説明を参照してください。

サンプル:応答ステータスコード302、500、および503を除外します。

<init-param>
 <param-name>ExpiresExcludedResponseStatusCodes</param-name>
 <param-value>302, 500, 503</param-value>
</init-param>

ExpiresByType初期化パラメータのサンプル。

<init-param>
   <param-name>ExpiresByType text/html</param-name>
   <param-value>access plus 1 month 15   days 2 hours</param-value>
</init-param>

<init-param>
   <!-- 2592000 seconds = 30 days -->
   <param-name>ExpiresByType image/gif</param-name>
   <param-value>A2592000</param-value>
</init-param>

トラブルシューティング

トラブルシューティングするには、org.apache.catalina.filters.ExpiresFilterでログを有効にします。

logging.propertiesの抜粋。

org.apache.catalina.filters.ExpiresFilter.level = FINE    

初期化ログメッセージのサンプル。

Mar 26, 2010 2:01:41 PM org.apache.catalina.filters.ExpiresFilter init
FINE: Filter initialized with configuration ExpiresFilter[
 excludedResponseStatusCode=[304],
 default=null,
 byType={
    image=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
    text/css=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
    text/javascript=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]]}]

ExpiresFilterが有効期限を追加する1リクエストあたりのログメッセージのサンプルを以下に示します。メッセージは1行に記述されており、可読性を高めるためにここに折り返されています。

Mar 26, 2010 2:09:47 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
FINE: Request "/tomcat.gif" with response status "200"
 content-type "image/gif", set expiration date 3/26/10 2:19 PM

ExpiresFilterが有効期限を追加しない1リクエストあたりのログメッセージのサンプル。

Mar 26, 2010 2:10:27 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
FINE: Request "/docs/config/manager.html" with response status "200"
 content-type "text/html", no expiration configured

失敗したリクエストフィルター

はじめに

このフィルタは、リクエストにおけるパラメータの解析をトリガーし、解析エラーやリクエストサイズ制限(ConnectorのmaxParameterCount属性など)によってパラメータ解析中にパラメータがスキップされた場合、リクエストを拒否します。このフィルタは、クライアントによって送信されたパラメータ値が失われないようにするために使用できます。

パラメータの解析はHTTPリクエストのボディを消費する場合があるため、このフィルタによって保護されているサーブレットがrequest.getInputStream()またはrequest.getReader()呼び出しを使用する場合は注意が必要です。一般的に、このフィルタを追加することによってWebアプリケーションが壊れるリスクはそれほど高くありません。なぜなら、パラメータの解析はリクエストボディを消費する前にリクエストのコンテンツタイプをチェックするからです。

POSTリクエストが正しく解析されるためには、このフィルタの上にSetCharacterEncodingFilterフィルタを設定する必要があります。詳細はFAQのCharacterEncodingページを参照してください。

リクエストはHTTPステータスコード400(Bad Request)で拒否されます。

フィルタークラス名

Failed Request Filterのフィルタクラス名はorg.apache.catalina.filters.FailedRequestFilterです。

初期化パラメータ

Failed Request Filterは初期化パラメータをサポートしていません。

HTTPヘッダーセキュリティフィルター

はじめに

接続のセキュリティを向上させるために、レスポンスに追加できるHTTPヘッダがいくつかあります。このフィルタは、これらのヘッダを追加するためのメカニズムを提供します。CORSなど、より複雑な要件を持つセキュリティ関連のヘッダは、個別のフィルタとして実装されていることに注意してください。

フィルタークラス名

HTTP Header Security Filterのフィルタクラス名はorg.apache.catalina.filters.HttpHeaderSecurityFilterです。

初期化パラメータ

HTTP Header Security Filterは、次の初期化パラメータをサポートしています。

属性説明
hstsEnabled

セキュアなリクエストに対して、HTTP Strict Transport Security (HSTS)ヘッダ(Strict-Transport-Security)をレスポンスに設定するかどうかを指定します。既に存在するHSTSヘッダは置き換えられます。HSTSの詳細については、RFC 6797を参照してください。指定しない場合、デフォルト値のtrueが使用されます。

hstsMaxAgeSeconds

HSTSヘッダで使用される最大有効期間(秒単位)を指定します。負の値は0として扱われます。指定しない場合、デフォルト値の0が使用されます。

hstsIncludeSubDomains

HSTSヘッダにincludeSubDomainsパラメータを含めるかどうかを指定します。指定しない場合、デフォルト値のfalseが使用されます。

hstsPreload

HSTSヘッダにpreloadパラメータを含めるかどうかを指定します。指定しない場合、デフォルト値のfalseが使用されます。https://hstspreload.orgでこのパラメータに関する重要な情報を確認してください。

antiClickJackingEnabled

クリックジャッキング対策ヘッダ(X-Frame-Options)をレスポンスに設定するかどうかを指定します。既に存在するクリックジャッキング対策ヘッダは置き換えられます。指定しない場合、デフォルト値のtrueが使用されます。

antiClickJackingOption

クリックジャッキング対策ヘッダに使用する値を指定します。DENYSAMEORIGINALLOW-FROMのいずれかである必要があります(大文字小文字は区別されません)。指定しない場合、デフォルト値のDENYが使用されます。

antiClickJackingUri

antiClickJackingOptionALLOW-FROMを使用する場合、許可するURIを指定します。指定しない場合、デフォルト値の空文字列が使用されます。

blockContentTypeSniffingEnabled

コンテンツタイプスニッフィングをブロックするヘッダ(X-Content-Type-Options)をすべてのレスポンスに設定するかどうかを指定します。既に存在する場合は、ヘッダが置き換えられます。指定しない場合、デフォルト値のtrueが使用されます。

xssProtectionEnabled

注:この設定は非推奨です。すべての主要ブラウザでHTTPヘッダのサポートが削除されたためです。Tomcat 11.0.x以降では設定が削除されました。

ブラウザのクロスサイトスクリプティングフィルタ保護を有効にするヘッダ(X-XSS-Protection: 1; mode=block)をすべてのレスポンスに設定するかどうかを指定します。既に存在する場合は、ヘッダが置き換えられます。指定しない場合、デフォルト値のfalseが使用されます。

レート制限フィルター

はじめに

Rate Limit Filterは、時間枠(タイムバケットとも呼ばれます)内、例えば60秒間に300リクエストというように、単一のIPアドレスから許可されるリクエスト数を制限することで、サービス拒否(DoS)攻撃やブルートフォース攻撃を軽減するのに役立ちます。

このフィルタは、各IPアドレスについてタイムバケット内のカウンタを増分することで機能します。カウンタが許容限度を超えた場合、そのIPからのさらなるリクエストは、バケット時間が終了して新しいバケットが開始されるまで、「429 Too many requests」レスポンスでドロップされます。

このフィルタは効率性と低オーバーヘッドのために最適化されているため、いくつかの設定値をより効率的な値に変換します。例えば、60秒のタイムバケットの設定は65.536秒に変換されます。これにより、ビットシフト演算を使用して非常に高速なバケット計算が可能になります。ユーザーの意図を忠実に反映するために、設定されたリクエスト数は同じ比率で乗算されます。そのため、60秒間に100リクエストの設定は、実際には65秒間に109リクエストになります。

異なるURIに対して異なる制限を設定するのが一般的です。例えば、ログインページや認証スクリプトは通常、アプリケーションの残りの部分よりもはるかに少ないリクエスト数しか予想されません。そのため、15秒間に5リクエストのみを許可するフィルタ定義を追加し、それらのURIにマッピングすることができます。

許可された制限を超えるリクエストの終了を無効にするには、enforcefalseに設定できます。その後、アプリケーションコードはリクエスト属性org.apache.catalina.filters.RateLimitFilter.Countを検査し、他の情報に基づいてリクエストの処理方法を決定できます(例えば、ロールに基づいて特定のユーザーへのリクエストをさらに許可するなど)。

警告:Tomcatがリバースプロキシの背後にある場合、Rate Limit FilterがクライアントのIPアドレスを参照していることを確認する必要があります。例えば、Remote IP Filterを使用している場合、Rate Limit FilterのフィルタマッピングはRemote IP Filterのマッピングのにくるようにする必要があります。これにより、各リクエストのIPアドレスが解決された後、Rate Limit Filterが適用されます。そうしないと、異なるIPからのリクエストが同じバケットでカウントされ、自己流のDoS攻撃につながります。

フィルタークラス名

Remote Address Filterのフィルタクラス名はorg.apache.catalina.filters.RateLimitFilterです。

初期化パラメータ

Rate Limit Filterは、次の初期化パラメータをサポートしています。

属性説明
bucketDuration

タイムバケットの時間(秒単位)を指定します。デフォルトは60です。

bucketRequests

タイムバケットで許可されるリクエスト数を指定します。デフォルトは300です。

enforce

時間枠で許可される最大数を超えてもリクエストを許可するにはfalseに設定します。アプリケーションコードは、リクエスト属性org.apache.catalina.filters.RateLimitFilter.Countを検査して、時間枠内でそのIPから行われたリクエストの数を取得できます。デフォルトはtrueです。

statusCode

リクエストがドロップされたときに返すステータスコードを指定します。デフォルトは429です。

statusMessage

リクエストがドロップされたときに返すステータスメッセージを指定します。デフォルトは「Too many requests」です。

サイトのレート制限を1分間に300リクエストに設定します(デフォルト)。

    <filter>
        <filter-name>RateLimitFilter Global</filter-name>
        <filter-class>org.apache.catalina.filters.RateLimitFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>RateLimitFilter Global</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

/auth/*スクリプトのレート制限を1分間に20リクエストに設定します。

    <filter>
        <filter-name>RateLimitFilter Login</filter-name>
        <filter-class>org.apache.catalina.filters.RateLimitFilter</filter-class>
        <init-param>
            <param-name>bucketRequests</param-name>
            <param-value>20</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>RateLimitFilter Login</filter-name>
        <url-pattern>/auth/*</url-pattern>
    </filter-mapping>

リモートアドレスフィルター

はじめに

Remote Address Filterを使用すると、このリクエストを送信したクライアントのIPアドレスを1つ以上の正規表現と比較し、リクエストを継続的に許可するか、このクライアントからのリクエストの処理を拒否するかを選択できます。

正規表現の構文は、「標準」ワイルドカードマッチングとは異なります。Tomcatはjava.util.regexパッケージを使用します。サポートされている式の詳細については、Javaのドキュメントを参照してください。

注:IPv6アドレスでこのフィルタを使用する場合、注意点があります。このバルブが処理するIPアドレスの形式は、取得に使用されたAPIによって異なります。Inet6Addressクラスを使用してJavaソケットからアドレスを取得した場合、その形式はx:x:x:x:x:x:x:xになります。つまり、localhostのIPアドレスは、より広く使用されている::1ではなく0:0:0:0:0:0:0:1になります。実際の値については、アクセスログを参照してください。

こちらも参照してください:Remote Host Filter.

フィルタークラス名

Remote Address Filterのフィルタクラス名はorg.apache.catalina.filters.RemoteAddrFilterです。

初期化パラメータ

Remote Address Filterは、次の初期化パラメータをサポートしています。

属性説明
allow

リモートクライアントのIPアドレスと比較される正規表現(java.util.regexを使用)を指定します。この属性が指定されている場合、このリクエストが受け入れられるためには、リモートアドレスが一致する必要があります。この属性が指定されていない場合、リモートアドレスがdenyパターンと一致しない限り、すべてのリクエストが受け入れられます。

deny

リモートクライアントのIPアドレスと比較される正規表現(java.util.regexを使用)を指定します。この属性が指定されている場合、このリクエストが受け入れられるためには、リモートアドレスが一致してはなりません。この属性が指定されていない場合、リクエストの受け入れはaccept属性によってのみ決定されます。

denyStatus

拒否されたリクエストを拒否するときに使用されるHTTPレスポンスステータスコード。デフォルト値は403です。例えば、404に設定できます。

localhostから接続するクライアントのみアクセスを許可するには

    <filter>
      <filter-name>Remote Address Filter</filter-name>
      <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
      <init-param>
        <param-name>allow</param-name>
        <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>Remote Address Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

リモートホストフィルター

はじめに

Remote Host Filterを使用すると、このリクエストを送信したクライアントのホスト名を1つ以上の正規表現と比較し、リクエストを継続的に許可するか、このクライアントからのリクエストの処理を拒否するかを選択できます。

正規表現の構文は、「標準」ワイルドカードマッチングとは異なります。Tomcatはjava.util.regexパッケージを使用します。サポートされている式の詳細については、Javaのドキュメントを参照してください。

注:このフィルタは、ServletRequest.getRemoteHost()メソッドによって返される値を処理します。このメソッドが適切なホスト名を返すようにするには、Connectorで「DNSルックアップ」機能を有効にする必要があります。

こちらも参照してください:Remote Address FilterHTTP Connectorの設定。

フィルタークラス名

Remote Address Filterのフィルタクラス名はorg.apache.catalina.filters.RemoteHostFilterです。

初期化パラメータ

Remote Host Filterは、次の初期化パラメータをサポートしています。

属性説明
allow

リモートクライアントのホスト名と比較される正規表現(java.util.regexを使用)を指定します。この属性が指定されている場合、このリクエストが受け入れられるためには、リモートホスト名が一致する必要があります。この属性が指定されていない場合、リモートホスト名がdenyパターンと一致しない限り、すべてのリクエストが受け入れられます。

deny

リモートクライアントのホスト名と比較される正規表現(java.util.regexを使用)を指定します。この属性が指定されている場合、このリクエストが受け入れられるためには、リモートホスト名が一致してはなりません。この属性が指定されていない場合、リクエストの受け入れはaccept属性によってのみ決定されます。

denyStatus

拒否されたリクエストを拒否するときに使用されるHTTPレスポンスステータスコード。デフォルト値は403です。例えば、404に設定できます。

リモートCIDRフィルター

はじめに

リモートCIDRフィルタを使用すると、このリクエストを送信したクライアントのIPアドレスをCIDR表記に従う1つ以上のネットマスクと比較し、リクエストの続行を許可するか、このクライアントからのリクエストの処理を拒否することができます。IPv4とIPv6の両方が完全にサポートされています。

このフィルタは、Apache httpdのOrderAllow fromDeny fromディレクティブを模倣していますが、以下の制限があります。

  • Orderは常にallow, denyになります。
  • ネットマスクのドット付きクォード表記はサポートされていません(つまり、192.168.1.0/255.255.255.0と書くことはできず、192.168.1.0/24と書く必要があります)。
  • 10.10.のように、10.10.0.0/16と同等のショートカットはサポートされていません。
  • フィルタ名にもあるように、これはCIDRのみのフィルタであるため、.mydomain.comのようなサブドメイン表記もサポートされていません。

このフィルタのその他の機能は次のとおりです。

  • CIDRプレフィックスを省略すると、このフィルタは単一のIPフィルタになります。
  • リモートホストフィルタとは異なり、IPv6アドレスを簡略化された形式(::1fe80::/71など)で処理できます。

フィルタークラス名

リモートアドレスフィルタのフィルタクラス名はorg.apache.catalina.filters.RemoteCIDRFilterです。

初期化パラメータ

リモートCIDRフィルタは、以下の初期化パラメータをサポートしています。

属性説明
allow

リモートクライアントのIPアドレスと照合される、IPv4またはIPv6のネットマスクまたはアドレスのカンマ区切りリスト。この属性が指定されている場合、このリクエストを受け入れるには、リモートアドレスが一致する必要があります。この属性が指定されていない場合、deny属性のネットマスクとリモートIPが一致しない限り、すべてのリクエストが受け入れられます。

deny

リモートクライアントのIPアドレスと照合される、IPv4またはIPv6のネットマスクまたはアドレスのカンマ区切りリスト。この属性が指定されている場合、このリクエストを受け入れるには、リモートアドレスが一致してはなりません。この属性が指定されていない場合、リクエストの受理はaccept属性によってのみ決定されます。

localhostとローカルネットワーク192.68.0.*からのクライアントからのアクセスのみを許可するには、以下のようにします。

      <filter>
        <filter-name>Remote CIDR Filter</filter-name>
        <filter-class>org.apache.catalina.filters.RemoteCIDRFilter</filter-class>
        <init-param>
          <param-name>allow</param-name>
          <param-value>127.0.0.1, ::1, 192.68.0.0/24</param-value>
        </init-param>
      </filter>

      <filter-mapping>
        <filter-name>Remote CIDR Filter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

リモートIPフィルター

はじめに

Tomcat port of mod_remoteip、このフィルタは、リクエストのクライアントの実際のIPアドレスとホスト名を、プロキシまたはロードバランサによってリクエストヘッダ(例:「X-Forwarded-For」)を介して提示されたIPアドレスリストに置き換えます。

このフィルタのもう1つの機能は、リクエストヘッダ(例:「X-Forwarded-Proto」)を介してプロキシまたはロードバランサによって提示されたスキームを使用して、実際のスキーム(http/https)、サーバポート、request.secureを置き換えることです。

リモートアドレス/ホストフィルタと併用する場合、正しいクライアントIPアドレスがリモートアドレス/ホストフィルタに提示されるように、このフィルタを最初に定義する必要があります。

注:デフォルトでは、このフィルタはアクセスログに書き込まれる値に影響を与えません。リクエスト処理がフィルタから抜けると元の値が復元され、それは常にアクセスログ記録よりも前に発生します。このフィルタによって設定されたリモートアドレス、リモートホスト、サーバポート、プロトコルの値をアクセスログに渡すには、それらをリクエスト属性に配置します。これらの値の公開はデフォルトで有効になっていますが、AccessLogValveで明示的にそれらを使用するように構成する必要があります。AccessLogValverequestAttributesEnabled属性に関するドキュメントを参照してください。

このフィルタによって設定され、アクセスログで使用できるリクエスト属性の名前は次のとおりです。

  • org.apache.catalina.AccessLog.RemoteAddr
  • org.apache.catalina.AccessLog.RemoteHost
  • org.apache.catalina.AccessLog.Protocol
  • org.apache.catalina.AccessLog.ServerPort
  • org.apache.tomcat.remoteAddr

フィルタークラス名

リモートIPフィルタのフィルタクラス名はorg.apache.catalina.filters.RemoteIpFilterです。

'x-forwarded-for'を処理するための基本的な設定

フィルタはx-forwarded-for HTTPヘッダーを処理します。

      <filter>
        <filter-name>RemoteIpFilter</filter-name>
        <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
      </filter>

      <filter-mapping>
        <filter-name>RemoteIpFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
      </filter-mapping>

'x-forwarded-for'と'x-forwarded-proto'を処理するための基本的な設定

フィルタはx-forwarded-forx-forwarded-proto HTTPヘッダーを処理します。SSL接続の場合、x-forwarded-protoヘッダーの期待値はhttps(大文字と小文字の区別なし)です。

      <filter>
        <filter-name>RemoteIpFilter</filter-name>
        <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
        <init-param>
          <param-name>protocolHeader</param-name>
          <param-value>x-forwarded-proto</param-value>
        </init-param>
      </filter>

      <filter-mapping>
        <filter-name>RemoteIpFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
      </filter-mapping>

内部プロキシを使用した高度な設定

RemoteIpFilter設定

     <filter>
       <filter-name>RemoteIpFilter</filter-name>
       <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
       <init-param>
         <param-name>allowedInternalProxies</param-name>
         <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpHeader</param-name>
         <param-value>x-forwarded-for</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpProxiesHeader</param-name>
         <param-value>x-forwarded-by</param-value>
       </init-param>
       <init-param>
         <param-name>protocolHeader</param-name>
         <param-value>x-forwarded-proto</param-value>
       </init-param>
     </filter>

リクエスト値

プロパティ RemoteIpFilter適用前 RemoteIpFilter適用後
request.remoteAddr 192.168.0.10 140.211.11.130
request.header['x-forwarded-for'] 140.211.11.130, 192.168.0.10 null
request.header['x-forwarded-by'] null null
request.header['x-forwarded-proto'] https https
request.scheme http https
request.secure false true
request.serverPort 80 443

注:リクエストが通過したプロキシは内部プロキシのみであるため、x-forwarded-byヘッダーはnullです。すべてのプロキシが信頼されているか内部プロキシであるため、x-forwarded-fornullです。

信頼できるプロキシを使用した高度な設定

RemoteIpFilter設定

     <filter>
       <filter-name>RemoteIpFilter</filter-name>
       <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
       <init-param>
         <param-name>allowedInternalProxies</param-name>
         <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpHeader</param-name>
         <param-value>x-forwarded-for</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpProxiesHeader</param-name>
         <param-value>x-forwarded-by</param-value>
       </init-param>
       <init-param>
         <param-name>trustedProxies</param-name>
         <param-value>proxy1|proxy2</param-value>
       </init-param>
     </filter>

リクエスト値

プロパティ RemoteIpFilter適用前 RemoteIpFilter適用後
request.remoteAddr 192.168.0.10 140.211.11.130
request.header['x-forwarded-for'] 140.211.11.130, proxy1, proxy2 null
request.header['x-forwarded-by'] null proxy1, proxy2

注:proxy1proxy2はどちらも、x-forwarded-forヘッダーに含まれる信頼できるプロキシであり、両方ともx-forwarded-byヘッダーに移行されます。すべてのプロキシが信頼されているか内部プロキシであるため、x-forwarded-fornullです。

内部プロキシと信頼できるプロキシを使用した高度な設定

RemoteIpFilter設定

     <filter>
       <filter-name>RemoteIpFilter</filter-name>
       <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
       <init-param>
         <param-name>allowedInternalProxies</param-name>
         <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpHeader</param-name>
         <param-value>x-forwarded-for</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpProxiesHeader</param-name>
         <param-value>x-forwarded-by</param-value>
       </init-param>
       <init-param>
         <param-name>trustedProxies</param-name>
         <param-value>proxy1|proxy2</param-value>
       </init-param>
     </filter>

リクエスト値

プロパティ RemoteIpFilter適用前 RemoteIpFilter適用後
request.remoteAddr 192.168.0.10 140.211.11.130
request.header['x-forwarded-for'] 140.211.11.130, proxy1, proxy2, 192.168.0.10 null
request.header['x-forwarded-by'] null proxy1, proxy2

注:proxy1proxy2はどちらも、x-forwarded-forヘッダーに含まれる信頼できるプロキシであり、両方ともx-forwarded-byヘッダーに移行されます。192.168.0.10は内部プロキシであるため、x-forwarded-byには表示されません。すべてのプロキシが信頼されているか内部プロキシであるため、x-forwarded-fornullです。

信頼できないプロキシを使用した高度な設定

RemoteIpFilter設定

     <filter>
       <filter-name>RemoteIpFilter</filter-name>
       <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
       <init-param>
         <param-name>allowedInternalProxies</param-name>
         <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpHeader</param-name>
         <param-value>x-forwarded-for</param-value>
       </init-param>
       <init-param>
         <param-name>remoteIpProxiesHeader</param-name>
         <param-value>x-forwarded-by</param-value>
       </init-param>
       <init-param>
         <param-name>trustedProxies</param-name>
         <param-value>proxy1|proxy2</param-value>
       </init-param>
     </filter>

リクエスト値

プロパティ RemoteIpFilter適用前 RemoteIpFilter適用後
request.remoteAddr 192.168.0.10 untrusted-proxy
request.header['x-forwarded-for'] 140.211.11.130, untrusted-proxy, proxy1 140.211.11.130
request.header['x-forwarded-by'] null proxy1

注:x-forwarded-byには、信頼できるプロキシproxy1が含まれています。untrusted-proxyは信頼されていないため、untrusted-proxyが実際のリモートIPであると信頼することはできません。そのため、x-forwarded-byには140.211.11.130が含まれています。request.remoteAddrは、proxy1によって検証されたIPであるuntrusted-proxyです。

初期化パラメータ

リモートIPフィルタは、以下の初期化パラメータをサポートしています。

属性説明
enableLookups

ServletRequest#getRemoteHost()を呼び出す際に、ホスト名を取得するためにDNSルックアップを実行するかどうか。指定しない場合、デフォルトのfalseが使用されます。

remoteIpHeader

リクエスト元クライアントから始まる、通過したIPアドレスのリストを保持する、このバルブによって読み取られるHTTPヘッダーの名前。指定しない場合、デフォルトのx-forwarded-forが使用されます。

internalProxies

プロキシのIPアドレスが内部プロキシと見なされるために一致する必要がある正規表現(java.util.regexを使用)。remoteIpHeaderに表示される内部プロキシは信頼され、proxiesHeaderの値には表示されません。指定しない場合、デフォルト値の 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|100\.6[4-9]{1}\.\d{1,3}\.\d{1,3}|100\.[7-9]{1}\d{1}\.\d{1,3}\.\d{1,3}|100\.1[0-1]{1}\d{1}\.\d{1,3}\.\d{1,3}|100\.12[0-7]{1}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1 が使用されます。

proxiesHeader

このバルブによって作成され、受信remoteIpHeaderで処理されたプロキシのリストを保持するHTTPヘッダーの名前。指定しない場合、デフォルトのx-forwarded-byが使用されます。

requestAttributesEnabled

AccessLog実装で使用されるリクエスト属性を設定して、リモートアドレス、リモートホスト、サーバーポート、プロトコルに関するリクエストからの値をオーバーライドするには、trueに設定します。リクエスト属性は、転送されたリモートアドレスをManager Webアプリケーションのステータスページに表示するためにも使用されます。設定しない場合、デフォルト値のtrueが使用されます。

trustedProxies

プロキシのIPアドレスが信頼できるプロキシと見なされるために一致する必要がある正規表現(java.util.regexを使用)。remoteIpHeaderに表示される信頼できるプロキシは信頼され、proxiesHeaderの値に表示されます。指定しない場合、プロキシは信頼されません。

protocolHeader

クライアントがプロキシに接続するために使用したプロトコルを保持する、このバルブによって読み取られるHTTPヘッダーの名前。指定しない場合、デフォルトのX-Forwarded-Protoが使用されます。

hostHeader

クライアントがプロキシに接続するために使用したホストを保持する、このバルブによって読み取られるHTTPヘッダーの名前。指定しない場合、デフォルトのnullが使用されます。

portHeader

クライアントがプロキシに接続するために使用したポートを保持する、このバルブによって読み取られるHTTPヘッダーの名前。指定しない場合、デフォルトのnullが使用されます。

protocolHeaderHttpsValue

HTTPSリクエストであることを示すprotocolHeaderの値。指定しない場合、デフォルトのhttpsが使用されます。

httpServerPort

protocolHeaderhttpプロトコルを示し、portHeaderが存在しない場合に、ServletRequest.getServerPort()によって返される値。指定しない場合、デフォルトの80が使用されます。

httpsServerPort

protocolHeaderhttpsプロトコルを示し、portHeaderが存在しない場合に、ServletRequest.getServerPort()によって返される値。指定しない場合、デフォルトの443が使用されます。

changeLocalName

trueの場合、ServletRequest.getLocalName()ServletRequest.getServerName()によって返される値はこのフィルタによって変更されます。指定しない場合、デフォルトのfalseが使用されます。

changeLocalPort

trueの場合、ServletRequest.getLocalPort()ServletRequest.getServerPort()によって返される値はこのフィルタによって変更されます。指定しない場合、デフォルトのfalseが使用されます。

リクエストダンプフィルター

はじめに

リクエストダンプフィルタは、リクエストとレスポンスオブジェクトからの情報をログに記録し、デバッグ目的で使用することを目的としています。このフィルタを使用する場合は、org.apache.catalina.filter.RequestDumperFilterロガーを専用のファイルに送信し、org.apache.juli.VerbatimFormatterを使用することをお勧めします。

警告:このフィルタを使用すると副作用が発生します。このフィルタからの出力には、リクエストに含まれるパラメータが含まれます。パラメータはデフォルトのプラットフォームエンコーディングを使用してデコードされます。Webアプリケーション内のrequest.setCharacterEncoding()への後続の呼び出しは、効果がありません。

フィルタークラス名

リクエストダンプフィルタのフィルタクラス名はorg.apache.catalina.filters.RequestDumperFilterです。

初期化パラメータ

リクエストダンプフィルタは、初期化パラメータをサポートしていません。

設定例

Webアプリケーションのweb.xml内の次のエントリは、そのWebアプリケーションのすべてのリクエストに対してリクエストダンプフィルタを有効にします。エントリがCATALINA_BASE/conf/web.xmlに追加された場合、リクエストダンプフィルタはすべてのWebアプリケーションで有効になります。

<filter>
    <filter-name>requestdumper</filter-name>
    <filter-class>
        org.apache.catalina.filters.RequestDumperFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>requestdumper</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

CATALINA_BASE/conf/logging.properties 内の以下のエントリにより、Request Dumper Filter の出力を個別のログファイルに書き込むことができます。

# To this configuration below, 1request-dumper.org.apache.juli.FileHandler
# also needs to be added to the handlers property near the top of the file
1request-dumper.org.apache.juli.FileHandler.level = INFO
1request-dumper.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1request-dumper.org.apache.juli.FileHandler.prefix = request-dumper.
1request-dumper.org.apache.juli.FileHandler.encoding = UTF-8
1request-dumper.org.apache.juli.FileHandler.formatter = org.apache.juli.VerbatimFormatter
org.apache.catalina.filters.RequestDumperFilter.level = INFO
org.apache.catalina.filters.RequestDumperFilter.handlers = \
  1request-dumper.org.apache.juli.FileHandler

セッションイニシャライザフィルター

はじめに

Session Initializer Filter は、リクエストの処理前にjakarta.servlet.http.HttpSessionを初期化します。これは、Handshake フェーズでHttpSessionが必要な場合、JSR-356 準拠の WebSocket 実装に必要です。

WebSocket 用 Java API では、リクエスト時にHttpSessionが初期化されることは必須ではなく、そのためHttpSessionが事前に初期化されていない場合、jakarta.servlet.http.HttpServletRequestgetSession()nullを返します。

このフィルタは、そのurl-patternに一致する任意のHttpServletRequestに対して HttpSession を初期化することで、この問題を解決します。

フィルタークラス名

Session Initializer Filter のフィルタクラス名は、org.apache.catalina.filters.SessionInitializerFilterです。

初期化パラメータ

Session Initializer Filter は、初期化パラメータをサポートしていません。

設定例

Webアプリケーション配置記述子(web.xml)内の以下のエントリにより、指定されたURLパターン(この例では "/ws/*")に一致するリクエストに対して Session Initializer Filter を有効にすることができます。

<filter>
    <filter-name>SessionInitializer</filter-name>
    <filter-class>org.apache.catalina.filters.SessionInitializerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SessionInitializer</filter-name>
    <url-pattern>/ws/*</url-pattern>
</filter-mapping>

文字エンコーディング設定フィルター

はじめに

ユーザーエージェントは、リクエストに文字エンコーディング情報を必ずしも含んでいません。リクエストの処理方法によっては、通常、デフォルトエンコーディングとして ISO-8859-1 が使用されます。これは常に望ましいわけではありません。このフィルタは、そのエンコーディングの設定、または特定の値への強制を可能にするオプションを提供します。基本的に、このフィルタはServletRequest.setCharacterEncoding()メソッドを呼び出します。

このフィルタによって設定された値は、このフィルタの後でパラメータの解析が行われる場合、POST リクエストのパラメータ解析で使用されます。したがって、フィルタマッピングの順序が重要です。GET リクエストのエンコーディングはここで設定されず、コネクタで設定されることに注意してください。詳細は、FAQ の CharacterEncoding のページを参照してください。

フィルタークラス名

Set Character Encoding Filter のフィルタクラス名は、org.apache.catalina.filters.SetCharacterEncodingFilterです。

初期化パラメータ

Set Character Encoding Filter は、以下の初期化パラメータをサポートします。

属性説明
encoding

設定する文字エンコーディングの名前。

ignore

ユーザーエージェントによって指定された文字エンコーディングを無視するかどうかを決定します。この属性がtrueの場合、ユーザーエージェントによって提供された値は無視されます。falseの場合、ユーザーエージェントがエンコーディングを指定していない場合にのみ、エンコーディングが設定されます。デフォルト値はfalseです。

WebDAV修正フィルター

はじめに

Microsoft オペレーティングシステムには、2 つの WebDAV クライアントがあります。1 つはポート 80 で使用され、もう 1 つはその他のすべてのポートで使用されます。ポート 80 で使用される実装は WebDAV 仕様に準拠しておらず、Tomcat WebDAV Servlet との通信を試行すると失敗します。このフィルタは、ポート 80 を介して接続する場合でも、機能する WebDAV 実装の使用を強制することで、この問題に対する修正を提供します。

フィルタークラス名

WebDAV Fix Filter のフィルタクラス名は、org.apache.catalina.filters.WebdavFixFilterです。

初期化パラメータ

WebDAV Fix Filter は、初期化パラメータをサポートしていません。