Citrix ADC ingress controller

書き換えポリシーとレスポンダーポリシーを使用した HTTP コールアウト

HTTPコールアウトを使用すると、Citrix ADCはポリシー評価の一環としてHTTPまたはHTTPS要求を生成して外部サーバー(コールアウトエージェント)に送信できます。サーバ (コールアウトエージェント) から取得した情報は、高度なポリシー式で分析でき、適切なアクションを実行できます。HTTPコールアウトについて詳しくは、 Citrix ADC ドキュメントを参照してください

Citrix が提供するリライトおよびレスポンダー CRD を使用して、次の式を使用して HTTP コールアウトを開始できます。

  • sys.http_callout(): この式は、httpcallout エージェントの応答を評価する必要がある場合に、コールをブロックするために使用されます。

  • sys.non_blocking_http_callout(): この式は、ノンブロッキングコール (トラフィックミラーリングなど) に使用されます。

これらの式は CRD で定義されたhttpcallout_policy名前をパラメータとして受け入れ、名前は二重引用符で指定する必要があります。

例:sys.http_callout("callout_name")。 この式では、callout_nameはリライトおよびレスポンダ CRD YAMLファイルで定義されている適切なhttpcallout_policyを参照します。

次の表に、リライトおよびレスポンダ CRD の HTTP コールアウトリクエストの属性について説明します。

パラメーター 説明
name コールアウトの名前を指定します。最大 32 文字です。
server_ip コールアウトの送信先となるサーバ (コールアウトエージェント) の IP アドレスを指定します。
server_port コールアウトの送信先となるサーバ (コールアウトエージェント) の [ポート] を指定します。
http_method このコールアウトが送信する HTTP リクエストで使用されるメソッドを指定します。デフォルト値は GET です。
host_expr ホストヘッダーを設定するテキスト式を指定します。この式は、リテラル値 (192.101.10.11 など) でも、値を導出する高度な式 (http.req.header (「Host」) など) でもかまいません。リテラル値は IP アドレスまたは完全修飾ドメイン名にすることができます。完全な HTTP リクエスト式と相互に排他的です。
url_stem_expr URL ステムを生成する文字列式を指定します。文字列式には、リテラル文字列 (「/mysite/index.html」など) または値を導出する式 (http.req.url など) を含めることができます。
headers HTTP リクエストに挿入する 1 つ以上のヘッダーを指定します。各ヘッダー nameおよびexpexpは 、指定されたヘッダーの値を提供するために実行時に評価される式です。
parameters HTTP リクエスト URL(GET リクエストの場合)またはリクエスト本文(POST リクエストの場合)に挿入する 1 つ以上のクエリパラメータを指定します。各パラメータはnameexprで表されます。expr は 、名前付きパラメータ (name=value) の値を提供するために実行時に評価される式です。パラメータ値は URL エンコードされます。
body_expr リクエストの本文を生成するための高度な文字列式。式には、リテラル文字列または値を導出する式 (client.ip.src など) を含めることができます。
full_req_expr Citrix ADCがコールアウトエージェントに送信する正確なHTTP要求を式の形式で指定します。リクエスト式は、コールアウトが使用される機能によって制約されます。たとえば、HTTP.RES 式は、要求時ポリシーバンクまたは TCP コンテンツスイッチングポリシーバンクでは使用できません。
scheme コールアウトサーバーの方式の種類を指定します。例:HTTP、HTTPS
return_type コールアウトに応答してターゲットコールアウトエージェントが返すデータのタイプを指定します。使用可能な設定は次のように機能します。TEXT-戻り値をテキスト文字列として扱います。NUM-戻り値を数値として扱います。BOOL-戻り値をブール値として扱います。
cache_for_secs コールアウト応答がキャッシュされる期間を秒単位で指定します。キャッシュされたレスポンスは、 calloutContentGroupという名前の統合キャッシュコンテンツグループに保存されます。期間が設定されていない場合、コールアウト応答は通常のキャッシュ設定を使用してキャッシュされない限りキャッシュされません。このパラメータは、これらの応答に適用される通常のキャッシュ設定よりも優先されます。
result_expr HTTP コールアウトエージェントから送信された応答からコールアウト結果を抽出する式を指定します。この式はレスポンスベースの式である必要があります。つまり、HTTP.RESで始まる必要があります。この式の操作は、戻り値の型と一致する必要があります。たとえば、戻り値の型をTEXTに設定した場合、結果式はテキストベースの式である必要があります。戻り値の型がNUMの場合 、結果式 (result_expr) は次の例のように数値を返さなければなりません。 http.res.body(10000).length
comment この HTTP コールアウトに関する情報を保持するコメントを指定します。

書き換えとレスポンダ CRD を使用して、クライアント IP アドレスがブロックリストに登録されているかどうかを検証する

ここでは、rewrite and Responder CRD を使用して HTTP コールアウトを開始し、クライアント IP アドレスがブロックリストに登録されているかどうかを検証し、適切なアクションを実行する方法を示します。

次の図は、リクエストのワークフローを説明しています。図中の各数字はワークフローのステップを示しています。 HTTP-Call-Out

  1. クライアント要求

  2. クライアントがブロックリストに登録されているかどうかを確認する HTTP コールアウトリクエスト (クライアント IP アドレスは、Cipという名前のクエリパラメータとして送信されます )

  3. HTTP コールアウトサーバからの応答

  4. ステップ 3 の応答が安全な IP アドレス(クライアント IP アドレスがコールアウトサーバ上のブロックリストに登録されている IP アドレスと一致しない)を示している場合、要求はサービスに転送されます。

  5. 手順 3 の応答が不正な IP アドレス(クライアント IP アドレスがコールアウトサーバ上のブロックリストに登録されている IP アドレスと一致している)を示している場合は、Access deniedとしてクライアントに応答します。

ブロックリストに登録された IP アドレスを検証するための YAML ファイル (ip_validate_responder.yaml) の例を次に示します。

注:

ip_validate_responder YAML ファイルをデプロイする前に、 リライトおよびレスポンダー CRD をデプロイする必要があります。

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: validateip
spec:
  responder-policies:
    - servicenames:
        - frontend
      responder-policy:
        respondwith:
          http-payload-string: '"HTTP/1.1 401 Access denied\r\n\r\n"'
        respond-criteria: 'sys.http_callout("blocklist_callout").CONTAINS("IP Matched")' #Callout name needs to be given in double quotes to pick httpcallout_policy
        comment: 'Invalid access'

  httpcallout_policy:
    - name: blocklist_callout
      server_ip: "192.2.156.160"
      server_port: 80
      http_method: GET
      host_expr: '"192.2.156.160"'
      url_stem_expr: '"/validateIP.pl"'
      headers:
      - name: X-Request
        expr: '"Callout Request"'
      parameters:
      - name: Cip
        expr: 'CLIENT.IP.SRC'
      return_type: TEXT
      result_expr: 'HTTP.RES.BODY(100)'
<!--NeedCopy-->

リライトとレスポンダ CRD を使用して、クライアントが要求した有効なパスで URL を更新する

この項では、セキュリティ上の理由により、クライアントに公開されるパスが実際のパスと異なる場合に、リライトおよびレスポンダ CRD を使用して HTTP コールアウトを開始する方法について説明します。

リクエストのワークフローを次の図に示します。図の各数字は、ワークフローのステップを示しています。

HTTP コールアウト

  1. クライアント要求

  2. 有効なパスを取得するための HTTP コールアウトリクエスト (クライアントからリクエストされたパスは、コールアウトサーバーへのパスという名前のクエリパラメータとして送信されます)

  3. HTTP コールアウトサーバからの応答

  4. URL リクエストは有効なパスで書き直され、サービスに転送されます ( コールアウト応答のタグnewpath間に有効なパスが記載されています)。

以下は YAML (path_rewrite) ファイルのサンプルです。

注:

path_rewrite YAML ファイルをデプロイする前に、 リライトおよびレスポンダー CRD をデプロイする必要があります。

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: getvalidpath
spec:
  rewrite-policies:
    - servicenames:
        - frontend
      rewrite-policy:
        operation: replace
        target: http.req.url
        modify-expression: 'sys.http_callout("mapping_callout")' #Callout name needs to be given in double quotes to pick httpcallout_policy
        comment: 'Get the valid path'
        direction: REQUEST
        rewrite-criteria: 'TRUE'

  httpcallout_policy:
    - name: mapping_callout
      server_ip: "192.2.156.160"
      server_port: 80
      http_method: GET
      host_expr: '"192.2.156.160"'
      url_stem_expr: '"/getPath.pl"'
      headers:
      - name: X-Request
        expr: '"Callout Request"'
      parameters:
      - name: path
        expr: 'http.req.url'
      return_type: TEXT
      result_expr: '"HTTP.RES.BODY(500).AFTER_STR("<newpath>").BEFORE_STR("</newpath>")"'
<!--NeedCopy-->
書き換えポリシーとレスポンダーポリシーを使用した HTTP コールアウト