ユースケース:IP ブラックリストを使用したクライアントのフィルタリング
HTTP コールアウトは、管理者がブラックリストに載っているクライアントからの要求をブロックするために使用できます。クライアントのリストには、一般に知られているブラックリスト、組織で管理するブラックリスト、またはその両方の組み合わせを使用できます。
Citrix ADCアプライアンスは、事前設定されたブラックリストに対してクライアントのIPアドレスをチェックし、IPアドレスがブラックリストに登録されている場合はトランザクションをブロックします。IPアドレスがリストにない場合、アプライアンスはトランザクションを処理します。
この設定を実装するには、次のタスクを実行する必要があります。
- Citrix ADCアプライアンスでレスポンダーを有効にします。
- Citrix ADCアプライアンスでHTTPコールアウトを作成し、外部サーバーの詳細およびその他の必須パラメータを使用して設定します。
- 応答側ポリシーを設定して、HTTP コールアウトへの応答を分析し、ポリシーをグローバルにバインドします。
- リモートサーバに HTTP コールアウトエージェントを作成します。
レスポンダの有効化
応答側を使用するには、応答側を有効にする必要があります。
GUI を使用してレスポンダを有効にするには
- レスポンダーライセンスがインストールされていることを確認します。
- 構成ユーティリティで、[AppExpert]を展開し、[レスポンダー]を右クリックして、[レスポンダー機能を有効にする]をクリックします。
Citrix ADCアプライアンスでのHTTPコールアウトの作成
次の表に示すパラメータ設定を使用して、HTTP コールアウト HTTP_Callout を作成します。HTTP コールアウトの作成の詳細については、「HTTP コールアウト PDF の設定」を参照してください。
レスポンダーポリシーを構成し、グローバルにバインドする
HTTP コールアウトを設定したら、コールアウト設定を確認し、コールアウトを呼び出すようにレスポンダーポリシーを設定します。[ Policies] サブノードでレスポンダーポリシーを作成し、 レスポンダーポリシーマネージャーを使用してグローバルにバインドできますが、このデモでは、 レスポンダーポリシーマネージャーを使用してレスポンダーポリシーを作成し、ポリシーをグローバルにバインドします。
レスポンダーポリシーを作成し、usin によってグローバルにバインドするには
- [AppExpert] > [応答者] に移動します。
- 詳細ペインの [ポリシーマネージャ] で、[ポリシーマネージャ] をクリックします。
- [レスポンダーポリシーマネージャー] ダイアログボックスで、[グローバルに上書き] をクリックします。
- [ポリシーの挿入] をクリックし、[ポリシー名] の [新しいポリシー] をクリックします。
[レスポンダーポリシーの作成] ダイアログボックスで、次の操作を行います。
- [名前] に「ポリシー応答1」と入力します。
- [アクション]で、[リセット]を選択します。
- [未定義の結果のアクション]で、[グローバルな未定義の結果のアクション]を選択します。
[式]に、次の既定の構文式を入力します。
"HTTP.REQ.HEADER("Request").EQ("Callout Request").NOT && SYS.HTTP_CALLOUT(HTTP_Callout).CONTAINS("IP Matched")"
- [Create]をクリックしてから、[Close]をクリックします。
- [変更を適用]をクリックし、[閉じる]をクリックします。
リモートサーバでの HTTP コールアウトエージェントの作成
ここで、Citrix ADCアプライアンスからコールアウト要求を受信し、適切に応答するHTTPコールアウトエージェントをリモートコールアウトサーバー上に作成する必要があります。HTTP コールアウトエージェントは、展開ごとに異なるスクリプトです。データベースの種類やサポートされるスクリプト言語など、サーバーの仕様を念頭に置いて記述する必要があります。
次に、指定した IP アドレスが IP ブラックリストの一部であるかどうかを検証するコールアウトエージェントの例を示します。エージェントはPerlスクリプト言語で書かれており、MYSQLデータベースを使用しています。
次のCGIスクリプトは、コールアウトサーバー上の指定された IP アドレスをチェックします。
#!/usr/bin/perl -w print "Content-type: text/html\n\n"; use DBI(); use CGI qw(:standard); #Take the Client IP address from the request query my $ip_to_check = param('cip'); # Where a MYSQL database is running my $dsn = 'DBI:mysql:BAD_CLIENT:localhost'; # Database username to connect with my $db_user_name = ‘dbuser’; # Database password to connect with my $db_password = 'dbpassword'; my ($id, $password); # Connecting to the database my $dbh = DBI->connect($dsn, $db_user_name, $db_password); my $sth = $dbh->prepare(qq{ select * from bad_clnt }); $sth->execute(); while (my ($ip_in_database) = $sth->fetchrow_array()) { chomp($ip_in_database); # Check for IP match if ($ip_in_database eq $ip_to_check) { print "\n IP Matched\n"; $sth->finish(); exit; } } print "\n IP Failed\n"; $sth->finish(); exit;