ICAPを使用したリモートコンテンツ検査またはコンテンツ変換サービス
インターネットコンテンツ適応プロトコル (ICAP) は、HTTPメッセージで付加価値変換サービスを実行するためのシンプルで軽量なプロトコルです。一般的なシナリオでは、ICAPクライアントはHTTPリクエストとレスポンスを1つ以上のICAPサーバーに転送して処理します。ICAPサーバーはリクエストに対してコンテンツ変換を実行し、リクエストまたはレスポンスに対して適切なアクションを実行するレスポンスを返します。
NetScalerのセットアップでは、NetScalerはアンチマルウェアやデータ損失防止 (DLP) などのサードパーティICAPサーバーと相互運用するICAPクライアントとして機能します。NetScalerが受信ウェブトラフィックを受信すると、トラフィックを傍受し、コンテンツ検査ポリシーを使用してHTTPリクエストがICAP処理を必要とするかどうかを評価します。必要であれば、NetScalerはメッセージを復号化し、プレーンテキストとしてICAPサーバーに送信します。ICAPサーバーはリクエストメッセージに対してコンテンツ変換サービスを実行し、NetScalerに応答を返します。変更されたメッセージは、HTTPリクエストまたはHTTPレスポンスのいずれかです。NetScalerが複数のICAPサーバーと相互運用する場合、NetScalerはICAPサーバーの負荷分散を実行します。このセットアップは、1つのICAPサーバーではすべてのトラフィック負荷を処理するのに十分でない場合に役立ちます。ICAPサーバーが変更されたメッセージを返した後、NetScalerは変更されたメッセージをバックエンドのオリジンサーバーに転送します。
NetScalerは、受信トラフィックがHTTPSタイプの場合、セキュアなICAPサービスも提供します。NetScalerはSSLベースのTCPサービスを使用して、NetScalerとICAPサーバー間のセキュアな接続を確立します。
Kubernetes環境では、NetScaler Ingress Controllerを介してNetScalerでICAPを有効にするために、NetScalerはICAPカスタムリソース定義 (CRD) を提供します。ICAPを有効にすることで、次のアクションを実行できます。
-
指定された文字列を含むURLをブロックする
-
DDoS攻撃を軽減するために一連のIPアドレスをブロックする
-
HTTPからHTTPSへの強制
KubernetesクラスターにICAP CRDをデプロイした後、ICAP CRD属性を使用してICAPポリシーを定義し、NetScalerの統計情報のために監査ログを有効にすることができます。NetScalerが提供するICAP機能の詳細については、リモートコンテンツ検査のためのICAPを参照してください。
ICAPポリシーは、大きくリクエスト変更ポリシーとレスポンス変更ポリシーに分類できます。
リクエスト変更: リクエスト変更 (REQMOD) モードでは、NetScalerはクライアントから受信したHTTPリクエストをICAPサーバーに転送します。リクエスト変更CRDリソースの例については、サンプルポリシー構成を参照してください。
レスポンス変更: レスポンス変更 (RESPMOD) モードでは、NetScalerはHTTPレスポンスをICAPサーバーに送信します (NetScalerが送信するレスポンスは通常、オリジンサーバーが送信するレスポンスです)。レスポンス変更CRDリソースの例については、サンプルポリシー構成を参照してください。
リクエストおよびレスポンス変更ポリシーの詳細については、リモートコンテンツ検査のためのICAPを参照してください。
NetScaler® ICAP CRDのデプロイ
NetScaler ICAP CRDデプロイYAMLファイルは、GitHubの次の場所にあります: icap-crd-deployment.yaml。
注記:
デプロイメントYAMLファイルを変更しないようにしてください。
次のコマンドを使用してICAP CRDを展開します。
kubectl create -f icap-crd-deployment.yaml
例:
root@master:~# kubectl create -f icap-crd-deployment.yaml
customresourcedefinition.apiextensions.k8s.io/icap-crd.citrix.com created
ICAP CRD属性
ICAP CRD は、コンテンツ検査を有効にし、ICAPポリシーを定義するために必要なさまざまなオプションを設定するための属性を提供します。これらのCRD属性は、それぞれ NetScaler コマンドと属性に対応しています。
次の表に、ICAPポリシーを定義するために使用できる CRD 属性を示します。また、この表には対応するNetScalerコマンドと属性も記載されています。
ICAPサーバーの追加
ICAP CRD仕様の
icap-servers オブジェクトの下にICAPサーバーを指定できます。要件に基づいて、1つまたは複数のICAPサーバーを指定できます。
| CRD属性 | NetScalerコマンド | NetScaler属性 | 説明 |
|---|---|---|---|
| ip (必須) | add service <name> <IP> <serviceType> <port> |
IP | ICAPサーバーのIPアドレス |
| ポート (必須) | add service <name> <IP> <serviceType> <port> |
ポート | ICAPサーバーが通信するポート |
| サーバータイプ (必須) | add service <name> <IP> <serviceType> <port> |
serviceType | ICAPサーバーのタイプ。指定可能な値はTCPとSSL_TCPです。 |
バックエンドサービスとイングレスクラスの指定
次の設定を行うには、
Servicesとingressclass属性を指定します。
-
ICAPポリシーを有効にする必要があるバックエンドサービスを指定します。
-
イングレスコントローラーによって処理される必要があるICAPリソースを指定します。
| CRD属性 | NetScalerコマンド | 説明 |
| Services (必須) | NA | ICAPポリシーを有効にする必要があるバックエンドサービスを一覧表示します。 |
| ingressclass (必須) | NA | 指定されたイングレスクラスに関連付けられたイングレスコントローラーのみがリソースを処理するように、イングレスクラスを指定します。そうでない場合、クラスター内のすべてのコントローラーがこのCRDリソースを処理します。 |
ICAPプロファイルの追加
NetScaler の ICAP 設定は、ICAP プロファイルと呼ばれるエンティティで指定されます。このプロファイルには、ICAP 設定のコレクションが含まれています。設定には、ICAP リクエストを動的に生成し、ICAP レスポンスを受信し、コンテンツ検査データをログに記録するためのパラメータが含まれます。
| CRD属性 | NetScalerコマンド | NetScaler属性 | 説明 |
|---|---|---|---|
| preconfigured-profile (オプション) | NA | NA | 事前設定されたICAPプロファイルの名前。 |
| direction (必須) | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) |
Mode |
ICAPの動作モード。可能な値はREQUESTとRESPONSEです。 |
| uri (必須) | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) |
URI | ICAPサービスを表すURI。 |
| プレビュー | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -preview ( ENABLED \| DISABLED )] |
プレビュー | ICAPリクエストでプレビューヘッダーを有効または無効にします。この機能により、ICAPサーバーはトランザクションの開始部分を確認できます。その後、リクエストメッセージの残りの部分を受信する代わりに、早期にトランザクションからオプトアウトするかどうかを決定できます。 |
| プレビュー長 | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -previewLength <positive_integer> |
previewLength | Preview Headerフィールドの値。NetScalerは、この設定値とOPTIONSで受信したプレビューサイズのうち、小さい方の値を使用します。 |
| ホストヘッダー | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -hostHeader <string> |
hostHeader | ICAPホストヘッダー。 |
| ユーザーエージェントヘッダー | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -userAgent <string> |
userAgent | ICAPユーザーエージェントヘッダー。 |
| クエリパラメータ | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -queryParams <string> |
queryParams | ICAPリクエストURIに含めるクエリパラメータ。入力値はarg=value形式である必要があります。複数のパラメータがある場合は、パラメータ間に&を追加します。例: arg1=val1&arg2=val2。 |
| コネクションキープアライブ | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -connectionKeepAlive ( ENABLED \| DISABLED ) |
connectionKeepAlive | ICAPリクエストでAllow: 204ヘッダーの送信を有効または無効にします。 |
| ICAPヘッダーの挿入 | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -insertICAPHeaders <string> |
insertICAPHeaders | ICAPサーバーに送信するICAPリクエストにカスタムICAPヘッダーを挿入します。ヘッダーは静的でも、PIポリシー式を使用して動的に構築することもできます。たとえば、静的なユーザーエージェントとクライアントのIPアドレスを送信するには、式を"User-Agent: NS-ICAP-Client/V1.0r0-Client-IP: "+CLIENT.IP.SRC+"r0として指定できます。NetScalerは、指定されたヘッダー名と値の有効性をチェックしません。指定されたヘッダー構文を手動で検証する必要があります。 |
| HTTPリクエストの挿入 | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -insertHTTPRequest <string> |
insertHTTPRequest | NetScalerがカプセル化してICAPサーバーに送信する、式形式の正確なHTTPリクエスト。このパラメーターを設定すると、ICAPリクエストはこのヘッダーのみを使用して送信されます。この属性は、HTTPヘッダーを送信できない場合や、ICAPサーバーが受信HTTPリクエストの一部のみを必要とする場合に使用できます。NetScalerはこのリクエストの有効性をチェックしません。リクエストを手動で検証する必要があります。 |
| リクエストタイムアウト | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -reqTimeout <positive_integer> |
reqTimeout | リモートサーバーがICAPリクエストに応答するまでの時間(秒単位)。NetScalerがこの時間内に完全な応答を受信しない場合、指定されたリクエストタイムアウトアクションが実行されます。値がゼロに設定されている場合、この機能は無効になります。 |
| リクエストタイムアウトアクション | add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -reqTimeoutAction <reqTimeoutAction> |
reqTimeoutAction | 設定されたタイムアウト値内にリモートサービスを表す仮想サーバーが応答しない場合に実行するアクション。サポートされているアクションは次のとおりです。BYPASS - リモートサーバーの応答を無視し、リクエスト/応答をクライアント/サーバーに送信します。カプセル化されたヘッダーを含むICAP応答が設定されたリクエストタイムアウト値内に受信されない場合、このオプションはリモートICAPサーバーの応答を無視し、完全なリクエスト/応答をサーバー/クライアントに送信します。DROP - ユーザーに応答を送信せずにリクエストを破棄します。RESET - クライアント接続を閉じてリセットします。クライアントは必要に応じてリクエストを再送信できます。 |
コンテンツ検査ポリシーとアクション
コンテンツ検査機能を有効にした後、ICAPリクエスト情報を処理するためのICAPアクションを追加する必要があります。作成されたICAPプロファイルとサービス、またはロードバランシング仮想サーバーは、ICAPアクションにバインドされます。
| CRD 属性 | NetScaler コマンド | NetScaler 属性 | 説明 |
|---|---|---|---|
| コンテンツ検査基準 | add contentInspection policy <name> -rule <expression> -action <string> |
ルール | ポリシーが指定されたアクションを実行するかどうかを決定するために使用する式。 |
| デフォルトアクション | add contentInspection action <name> -type ICAP -serverName <string> -icapProfileName <string> -ifserverdown <if-server-down> |
undefAction | ポリシー評価の結果が未定義 (UNDEF) の場合に実行するアクション。UNDEF イベントは内部エラー状態を示します。これより前の組み込みアクションのみを使用できます。 |
| ログアクション | add contentinspection policy <name> -rule <expression> -action <string> -logAction <string> |
logAction | このポリシーに一致するリクエストに使用するメッセージログアクションの名前。 |
| 操作 | add ContentInspection action <name> -type ICAP -serverip <ip> - serverport <port> -icapProfileName <string> |
タイプ | このICAPアクションが実行する操作のタイプ。設定可能なアクションは次のとおりです。 ICAP - 受信リクエストまたは応答をICAPサーバーに転送して変更します。 INLINEINSPECTION - 受信または送信パケットをIPSサーバーに転送して侵入防止を行います。 MIRROR - クローンされたパケットを転送して侵入検知を行います。 NOINSPECTION - 受信および送信パケットを検査デバイスに転送しません。 NSTRACE - このトランザクションで現在およびそれ以降の受信パケットをキャプチャします。 |
| サーバー障害時のアクション | add contentInspection action <name> -type ICAP -serverName <string> -icapProfileName <string> -ifserverdown <> |
サーバーダウン時 | リモートサービスを表す仮想サーバーが稼働していない場合に実行するアクション。サポートされているアクションは次のとおりです。 RESET - クライアント接続を閉じてリセットします。ブラウザなどのクライアントプログラムがこのアクションを処理し、ユーザーに通知する場合があります。クライアントは必要に応じてリクエストを再送信できます。 DROP - ユーザーに応答を送信せずにリクエストを破棄します。 CONTINUE - コンテンツ検査をバイパスし、クライアントまたはサーバーへのトラフィックフローを再開します。 |
Goto優先度式
次の表は、ポリシーのグループをサービスにバインドするためのCRD属性である
goto-priority-expression属性に関する情報を提供します。
| CRD属性 | NetScalerコマンド | NetScaler属性 | サポートされている値 | デフォルト値 |
|---|---|---|---|---|
| ゴートゥー・プライオリティ・エクスプレッション | lb vserverをバインド | gotoPriorityExpression | NEXT と END | End |
ポリシー構成の記述方法
NetScalerが提供するICAP CRD仕様をKubernetesクラスターにデプロイした後、
.yaml ファイルでポリシー構成を定義できます。.yaml ファイルでは、kind フィールドで icappolicy を使用し、要件に基づいてポリシー構成の属性に値を指定します。必須およびオプションのパラメーターとその説明については、前のセクションを参照してください。
.yaml ファイルをデプロイすると、NetScaler Ingress ControllerはNetScalerにポリシー構成を適用します。
ポリシー構成のガイドライン
-
CRDがnamespace に関連付けられている場合、デフォルトでは、ポリシーはその名前空間に関連付けられているサービスに適用されます。たとえば、複数の名前空間に同じサービス名が関連付けられている場合、ポリシーはCRDに関連付けられている名前空間に属するサービスに適用されます。
-
単一の
.yamlファイルで複数のポリシーを定義している場合、ファイル内で最初に定義されたポリシー構成が優先され、その後のポリシー構成はシーケンスに従って適用されます。異なるファイルで複数のポリシーを定義している場合、最初にデプロイしたファイルで定義された最初のポリシー構成が優先されます。
Goto-priority-expression の使用に関するガイドライン
-
ICAPポリシーは、
goto-priority-expressionフィールド内でNEXTキーワードを使用することで、複数のグループとして組み合わせることができます。 -
現在のポリシー内で
goto-priority-expressionフィールドがNEXTであり、現在のポリシーがTrueと評価される場合、グループ内の次のポリシーが実行されます。このプロセスは、goto-priority-expressionフィールドがENDに設定されているポリシーが見つかるまで、後続のポリシーで継続されます。 -
現在のポリシーが
FALSEと評価される場合、ポリシーの実行は現在のポリシーで停止するため、goto-priority-expressionは影響しません。 -
ICAPポリシー内のICAPポリシーグループは、NEXTとして
goto-priority-expressionが割り当てられたポリシーから始まり、goto-priority-expressionフィールドにENDが割り当てられるまですべての連続するポリシーを含みます。 -
goto-priority-expressionを使用してICAPポリシーをグループ化する場合、グループ内のポリシーにバインドされているサービス名は同じである必要があります。 -
ICAP内の最後のポリシーは、常に
goto-priority-expressionをENDとして持つ必要があります。 -
ポリシーに対して
goto-priority-expressionフィールドが指定されていない場合、ENDのデフォルト値がgoto-priority-expressionに割り当てられます。
ICAPポリシーの作成と検証
文字列
exampleを含むマイクロサービスへのすべての受信URLをドロップするためにNetScalerでポリシーを定義したいシナリオを考えます。exampleicappolicy.yamlという名前の.yamlファイルを作成し、適切なCRD属性を使用してICAPポリシーを次のように定義します。
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
name: exampleicappolicy
spec:
ingressclass: "cic-vpx"
services:
- "frontend"
icap-servers:
servers:
- ip: "192.168.1.1"
port: 1344
server-type: "TCP"
icap:
- direction: "REQUEST"
profile:
preview: "ENABLED"
preview-length: 1024
uri: "http://icap.example.com/reqmod"
host-header: "icap.example.com"
user-agent-header: "testAgent"
query-params: "arg1=val1&arg2=val2"
connection-keep-alive: "ENABLED"
req-timeout: 30
req-timeout-action: "BYPASS"
content-inspection-criteria: "HTTP.REQ.URL.CONTAINS(\"example\")"
default-action: "DROP"
goto-priority-expression: "END"
operation: "ICAP"
server-failure-action: "CONTINUE"
コマンド
kubectl create -f exampleicappolicy.yamlを実行して.yamlファイルをデプロイした後、NetScaler Ingress ControllerはNetScalerにポリシー構成を適用します。
Kubernetesクラスターのマスターノードで、次のコマンドを実行して適用されたICAPポリシーCRDのステータスを確認できます。
kubectl get icappolicies.citrix.com exampleicappolicy
次のコマンドを実行してステータスを表示できます。
kubectl get icappolicies.citrix.com exampleicappolicy
NAME STATUS MESSAGE
exampleicappolicy Success CRD Activated
CRDの作成または適用中に問題がある場合、イングレスコントローラーのログを使用してデバッグできます。
kubectl logs <nsic pod name>
また、次の手順を使用して、構成がNetScalerに適用されているかどうかを確認できます。
-
NetScaler CLIにログインします。
-
構成がNetScalerに適用されているかどうかを確認するには、次のコマンドを使用します。
show ns icapProfile | grep exampleicappolicy
show icapProfile <icapProfile-name>
show run | grep -i icap
ポリシー設定の例
応答モードでのICAPポリシー
この例では、ICAPポリシーが応答トラフィックに適用されます。つまり、ポリシーはICAPサーバーからNetScalerに送信される応答を検査し、場合によっては変更します。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
name: exampleicappolicy
spec:
ingressclass: "cic-vpx"
services:
- "frontend"
icap-servers:
servers:
- ip: "192.168.1.1"
port: 1344
server-type: "TCP"
icap:
- direction: "RESPONSE"
profile:
preview: "ENABLED"
preview-length: 1024
uri: "http://icap.example.com"
user-agent-header: "testAgent"
query-params: "arg1=val1&arg2=val2"
connection-keep-alive: "ENABLED"
req-timeout: 30
req-timeout-action: "BYPASS"
content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
default-action: "DROP"
goto-priority-expression: "END"
operation: "ICAP"
server-failure-action: "CONTINUE"
EOF
複数のICAPサーバーのパイプライン処理
この例では、リクエストの処理に複数のICAPサーバーを使用します。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
name: exampleicappolicy
spec:
ingressclass: "cic-vpx"
services:
- "frontend"
icap-servers:
servers:
- ip: "192.168.1.1"
port: 1344
- ip: "192.168.1.2"
port: 1344
- ip: "192.168.1.3"
port: 1344
server-type: "TCP"
icap:
- direction: "RESPONSE"
profile:
preview: "ENABLED"
preview-length: 1024
uri: "http://icap.example.com"
user-agent-header: "testAgent"
query-params: "arg1=val1&arg2=val2"
connection-keep-alive: "ENABLED"
req-timeout: 30
req-timeout-action: "BYPASS"
content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
default-action: "DROP"
goto-priority-expression: "END"
operation: "ICAP"
server-failure-action: "CONTINUE"
EOF
複数のポリシー設定
単一の
.yamlファイルに複数のポリシー設定を追加し、それらのポリシーをNetScalerに適用できます。ここに示されている例のように、各ポリシー設定に対して個別のセクションを追加する必要があります。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
name: exampleicappolicy1
spec:
ingressclass: "cic-vpx"
services:
- "frontend"
icap-servers:
servers:
- ip: "192.168.1.1"
port: 1344
server-type: "TCP"
icap:
- direction: "RESPONSE"
profile:
preview: "ENABLED"
preview-length: 1024
uri: "http://icap.example.com"
user-agent-header: "testAgent"
query-params: "arg1=val1&arg2=val2"
connection-keep-alive: "ENABLED"
req-timeout: 30
req-timeout-action: "BYPASS"
content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
default-action: "DROP"
goto-priority-expression: "NEXT"
operation: "ICAP"
server-failure-action: "CONTINUE"
---
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
name: exampleicappolicy2
spec:
ingressclass: "cic-vpx"
services:
- "frontend"
icap-servers:
servers:
- ip: "192.168.1.1"
port: 1344
server-type: "TCP"
icap:
- direction: "RESPONSE"
profile:
preview: "ENABLED"
preview-length: 1024
uri: "http://icap.example.com"
user-agent-header: "testAgent"
query-params: "arg1=val1&arg2=val2"
connection-keep-alive: "ENABLED"
req-timeout: 30
req-timeout-action: "BYPASS"
content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"sample\")"
default-action: "DROP"
goto-priority-expression: "END"
operation: "ICAP"
server-failure-action: "CONTINUE"
EOF