Citrix ADC

変数の構成と使用

最初に変数を作成し、次に値を代入するか、変数に対して実行する必要のある操作を指定する必要があります。これらの操作を実行した後で、割り当てをポリシーアクションとして使用できます。

注:いったん構成すると、変数の設定を変更したりリセットしたりすることはできません。変数を変更する必要がある場合は、変数と変数へのすべての参照(式と代入)を削除する必要があります。その後、変数を新しい設定で再追加し、参照(式と代入)を再追加することができます。

コマンドラインインターフェイスを使用して変数を構成するには

  1. 変数を作成します。
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]

:コマンド・パラメータの説明については、マニュアル・ページ「man add ns 変数」を参照してください。

例 1:「my_counter」という名前の ulong 変数を作成し、1 に初期化します。

add ns variable my_counter –type ulong -init 1

例 2:「ユーザー_特権_マップ」という名前のマップを作成します。マップには、最大長15文字のキーと、最大長10文字のテキスト値、最大10000エントリが含まれます。

add ns variable user_privilege_map -type map(text(15),text(10),10000)

: マップに 10000 個の期限切れのエントリが含まれている場合、新しいキーの割り当ては、最も最近使用されていないエントリの 1 つを再利用します。デフォルトでは、存在しないキーの値を取得しようとする式は、空のテキスト値を初期化します。

値を代入するか、変数に対して実行する操作を指定します。これは、割り当てを作成することによって行われます。

add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]

注:変数は、変数セレクタ($)を使用して参照されます。したがって、 $variable1 は、テキストまたはulong変数を参照するために使用されます。同様に、 $variable2[キー式]は、マップ変数を参照するために使用されます。

例 1:「inc_my_counter」という名前の割り当てを定義し、自動的に「my_counter」変数に 1 を追加します。

add ns assignment inc_my_counter -variable $my_counter -add 1

例 2:「set_user_privilege」という名前の割り当てを定義し、”get_user_privilege」HTTP コールアウトによって返された値を持つクライアントの IP アドレスのエントリを「user_map」変数に追加します。

add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)

:そのキーのエントリがすでに存在する場合、値は置き換えられます。それ以外の場合は、キーと値の新しいエントリが追加されます。user_privilege_map の前の宣言に基づいて、マップにすでに 10000 エントリがある場合、最も最近使用されていないエントリの 1 つが新しいキーと値に再利用されます。

  1. ポリシーで変数割り当てを呼び出します。

    マップ変数を操作できる2つの関数があります。

    • $name.valueExists(key-expression). キー式によって選択されたマップ内の値がある場合はtrueを返します。それ以外の場合は false を返します。この関数は、マップ・エントリが存在する場合は有効期限とLRU情報を更新しますが、値が存在しない場合は新しいマップ・エントリを作成しません。

    • $name.valueCount. 現在変数に保持されている値の数を返します。これは、マップ内のエントリの数です。シングルトン変数の場合、変数が初期化されていない場合は0、そうでない場合は1です。

    例: 圧縮ポリシーを使用して「set_user_privilege」という名前の割り当てを呼び出します。

add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege

レスポンス側にHTTPヘッダーを挿入するユースケース

次の例は、シングルトン変数の例を示しています。

テキスト型のシングルトン変数を追加します。この変数は、最大 100 バイトのデータを保持できます。

add ns variable http_req_data -type text(100) -scope transaction

変数に HTTP リクエストデータを格納するために使用される代入アクションを追加します。

add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)

変数から値をフェッチするHTTPヘッダーを挿入する書き換えアクションを追加します。

add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")

要求時間に評価する書き換えポリシーを追加し、データを格納するための割り当てアクションを実行します。このポリシーにヒットすると、代入アクションを実行し、データをns変数(http_req_data)に格納します。

add rewrite policy pol_set_variable true set_http_req_data

bind rewrite global pol_set_variable 10 -type req_dEFAULT

応答時間に評価する書き換えポリシーを追加し、応答に HTTP ヘッダーを追加します。

add rewrite policy pol_ins_header true act_ins_header

bind rewrite global pol_ins_header 10 -type res_dEFAULT

割り当てアクション

Citrix ADCアプライアンスでは、ポリシールールがtrueと評価されると、ポリシーにバインドされた割り当てアクションがトリガーされます。アクションによって、変数の値が更新されます。この値は後続のポリシールール評価で使用できます。このようにして、同じ変数を更新して、同じ機能内の後続のポリシー評価に使用できます。以前は、関連付けられた割り当てアクションのポリシーが true と評価されたときに、機能内のすべてのポリシーを評価した後にのみ割り当てアクションを実行していました。したがって、割り当てアクションによって設定された変数値は、機能内の後続のポリシールール評価で使用できません。

この機能は、Citrix ADCアプライアンス上のクライアントのアクセスリストを制御するユースケースでよりよく理解できます。アクセス決定は、本体に「BLOCK」または「ALLOW」を含む応答GET /client-access?<client-IP-address> を返すリクエストで、別のWebサービスによって提供されます。HTTP コールアウトは、着信要求に関連付けられているクライアントの IP アドレスを含めるように設定されます。Citrix ADCアプライアンスがクライアントからの要求を受信すると、アプライアンスはコールアウト要求を生成し、コールアウトサーバーに送信します。コールアウトサーバーは、ブラックリストに登録されたIPアドレスのデータベースと、クライアントのIPアドレスがデータベースにリストされているかどうかをチェックするHTTPコールアウトエージェントをホストします。HTTP コールアウトエージェントは、コールアウト要求を受信し、クライアントの IP アドレスがリストされているかどうかを確認し、応答を送信します。応答は、本体の「BLOCK」または「ALLOW」とともに、ステータスコード、200、302です。ステータスコードに基づいて、アプライアンスはポリシー評価を実行します。ポリシー評価が true の場合、割り当てアクションはただちにトリガーされ、action は値を変数に設定します。アプライアンスは、同じモジュール内の後続のポリシー評価にこの変数値を使用し、設定します。

割り当てアクションを構成するためのユースケース

次の手順に従って、割り当てアクションを設定し、後続のポリシーに変数を使用します。

  1. アクセス決定は、本体に BLOCK または ALLOW を含む応答を返すリクエストで、別の Web サービスによって提供されます。

    GET /url-service>/url-allowed?<URL path>

  2. URL のアクセス決定を保持するマップ変数を設定します。

    add ns variable url_list_map -type 'map(text(1000),text(10),10000)'

  3. Web サービスにアクセス要求を送信する HTTP コールアウトを設定します。

    add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'

  4. 割り当てアクションを設定して、コールアウトを呼び出してアクセス決定を取得し、URL のマップエントリに割り当てます。

    add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. URL 要求がブロックされた場合に 403 応答を送信するように応答側アクションを設定します。

    add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'

  6. URL のマップエントリが設定されていない場合は、レスポンダーポリシーを設定します。即時アクション拡張により、このポリシーの評価時にマップエントリの値が設定されます。拡張以前は、すべてのレスポンダーポリシーが評価され、別の Web サービスによって決定が行われるまで、割り当ては行われませんでした。

    add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn

  7. マップエントリの値が BLOCK の場合、URL へのアクセスをブロックするレスポンダーポリシーを設定します。即時アクション拡張により、前述のポリシーによって設定されたマップエントリをこのポリシーで使用できます。機能強化以前は、この時点ではマップエントリの設定が解除されます。

    add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act

  8. 応答側ポリシーを仮想サーバにバインドします。:別の仮想サーバー上の HTTP コールアウトに対してポリシーを実行したくないため、ポリシーをグローバルにバインドすることはできません。

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

構成ユーティリティを使用して変数を構成するには

  1. AppExpert > NS変数に移動し、変数を作成します。
  2. AppExpert > NS割り当てに移動し、変数に値を割り当てます。
  3. 割り当てをアクションとして構成する適切な機能領域に移動します。