おはようございます!
NetScaler 製品担当 です、初めてのブログ投稿となりますどうぞよろしくお願いします。ここ数年はSSL-VPN関連機器を狙った攻撃が増加しており、少しでも安全な環境を構築するために役立ちそうな機能をいくつかまとめてみました。
本ブログの注意点:
- 「絶対安全」というものは存在しないため、製品のリリースノートを定期的に確認し、脆弱性情報が公開された際には速やかにOSのアップグレードを行うことをお勧めします。
- ここで紹介する機能や設定例は検証環境では動作することを確認出来ておりますがお客様環境での動作を保証するものではありません。導入前に必ず検証することをお勧めします。
1 想定構成
- 検証環境情報:
・製品名:NetScaler VPX (Flex License)
・OS Version:14.1-38.53 (2025年1月時点最新)
・物理構成:One Arm構成、冗長化
・論理構成:図に記載
- 設定例の前提:
・ICA Proxy が可能な状態であること

2 悪意ある通信から VPN 仮想サーバ を防御する
Citrix は、NetScaler OS 13.1-53.17 および 14.1-21.57 に AAA ・VPN 仮想サーバーを保護するための重要な機能を追加しました。この機能は、 NetScaler の WAF 機能に基づいており、仕様に適合しないHTTP リクエストを破棄することが出来ます。WAF Protection を有効にするとNetScaler はこれらの組込み profile を自動的に活用します。
GUI) Configuration > Security > NetScaler Web App Firewall > Profiles

・ns-aaatm-default-appfw-profile
・ns-vpn-default-appfw-profile
本来 、NetScaler の WAF 機能を利用するには Premium Edition が必要でした。WAF Protection はAAA・VPN 仮想サーバーを保護することに特化しておりStandard 、Advance 、Premium のいずれのエディションでも利用出来ます。
VDI 案件において、「NetScaler をWAF 配下に構築したものの、通信途中で停止してしまう」というお客様からのご相談をいただくことがありました。この問題は WAF が ICA プロトコルに対応していないことが原因で発生していました。そのため、WAF の導入を断念するもしくは構成の変更をせざるを得ない状況でした。本機能を有効化することで、セキュリティ要件を満たすことが出来ます。
注意:
本機能を利用している場合でも、最新のセキュリティ修正を適用するために、OS を最新バージョンにアップグレードすることをお勧めします。
参考情報:
- https://docs.netscaler.com/en-us/citrix-adc/current-release/aaa-tm/waf-protection-endpoint-urls.html
2.1 設定例パラメータ

2.2 設定手順
- NetScaler にログインします。
- 「AAA – Application Traffic」メニューに移動します。
GUI) Config > Security > AAA – Application Traffic

- 「Configure AAA Parameter」メニューに移動し 「WAF Protection」内 「VPN」を選択の上「OK」をクリックします。
GUI) Authentication Settings > Change authentication AAA settings

2.3 項目説明

2.4 動作確認
- WAF Protection 「VPN」適用時クライアントリクエスト、通信が正常に完了しない様子。curl を使って 「https://vpn01.nw.local/」 に対して HTTP POST メソッドを送信。

NetScaler 「ns.log」、通信がブロックされた様子。

- WAF Protection 無効化(デフォルト値空白)クライアントリクエスト、通信が完了する様子。curl を使って 「https://vpn01.nw.local/」に対して HTTP POST メソッドを送信。

NetScaler 、ログ無し。
2.5 誤検知緩和
動作確認中に、VPN 仮想サーバーのポータルサイトへアクセス出来ない事象が、異なるタイミングで2回発生しました。調査のためにns.log を確認したところ、2つの URL に対して 「blocked」と記録されたログが確認されました。
- 事象(1回目):
ポータルサイト:

ns.log(太文字:HTTP メソット、宛先URL):
Jan 14 13:37:03 <local0.info> 10.16.31.1 2025/01/14:13:37:03 nsvpx01 0-PPE-0 : default APPFW APPFW_SCHEMA_OTHER 11122 0 : 10.16.33.100 30079-PPE0 - ns-vpn-default-appfw-profile Schema validation failed as per API Spec: (ns-vpn-spec) for Endpoint: (POST https://vpn01.nw.local/logon/LogonPoint/Resources/List) <blocked>
- 事象(2回目):
ポータルサイト:

ns.log(太文字:HTTP メソット、宛先URL):
Jan 14 13:49:39 <local0.info> 10.16.31.1 2025/01/14:13:49:39 nsvpx01 0-PPE-0 : default APPFW?APPFW_SCHEMA_OTHER 13208 0 : 10.3.0.253 36185-PPE0 - ns-vpn-default-appfw-profile Schema validation failed as per API Spec: (ns-vpn-spec) for Endpoint: (POST https://vpn01.nw.local/p/u/setClient.do) <blocked>
これらのURL がブロックされると、ポータルサイトが正常に表示されず、利用者がStoreFront にアクセス出来なくなります。この状況を踏まえると、動作が誤検知でると考えられ、緩和することで回避が出来ます。ログの内容から「ns-vpn-default-appfw-profile」がブロックの原因であることが判明しており、設定変更の対象はこのプロファイルとなります。
2.6 誤検知回避設定手順
- NetScaler にログインします。
- NetScaler Web App Firewall の「Profiles」メニューに移動します。
GUI) Config > Security > NetScaler Web App Firewall > Profiles
- 設定変更対象のプロファイルにチェックを入れ「Edit」します。

- 「NetScaler Web App Firewall Profile」メニューから 「Relaxation Rules」をクリックします。

- 「Relaxation Rules」をクリックするとそのメニューが現れます。
- メニューの中から「REST API Schema Validation」にチェックを入れ「Edit」します。

- 「REST API Schema Validation Relaxation Rules」メニュー内の「Add」をクリックします。
- 「REST API Schema Validation Relaxation Rule」メニューの「REST URL Pattern」緩和対象のURL を入力し「Create」します。

- 設定内容の様子。

- 同様の手順を残りの URL に対して行い「Close」、「Done」の順に設定画面を閉じます。
3 仮想サーバ-宛てHTTPリクエストホストヘッダーチェック
インターネット上にNetScalerの VPN 仮想サーバーを配置すると、ホストヘッダーの値がIPアドレスまたは他の値のHTTP リクエストを受信することがあります。これらの通信は接続性の確認や脆弱性スキャンに使われることがあります。
一方、Citrix StoreFrontはNetScaler から受信したHTTP リクエストの「X-Citrix-Via」ヘッダー内の値を精査し、「Citrix Gateway の管理」内で設定された「Citrix Gateway URL」 のFQDN と一致するかどうかを確認します。この値がIPアドレスもしくはその他指定外の値であった場合はStoreFront の認証画面が表示されNetScaler のシングルサインオンが失敗します。
- StoreFront 設定画面。

- NetScaler から StoreFront 宛ての HTTP リクエストのパケット情報、「X-Citrix-Via」が見られます。

- URL が 「Citrix Gateway URL」 と一致しない場合のStoreFrontの画面。
NetScaler 認証は成功するが、NetScaler からStoreFront間のシングルサインオンが失敗します。

- NetScaler から StoreFront 宛ての HTTP リクエストのパケット情報、「X-Citrix-Via」が見られます。

- StoreFront イベントビューアのログ。

これらの情報から、通常のクライアントリクエストでは、 IP アドレスの指定や指定外のURLを使用して接続することはありません。「Citrix Gateway URL」に設定した FQDN を含まないリクエストをNetScaler でドロップすることで、サービスへの影響を与えることなく、不要な通信を削減し、リスク低減できます。この様な要件を満たすために Responder 機能を使います。
- Responder によってドロップする通信のイメージ図。

FQDN が vpn01.nw.local は通すが、それ以外はドロップします。
参考情報:
3.1 設定例パラメータ

仮想サーバー bind 時の Priority:
・Responder #1 Priority =100
・Responder #2 Priority =110
3.2 設定手順
- NetScaler にログインします。
- 「Responder Policies」メニューに移動し、「Add」をクリックします。
GUI) Config > AppExpert > Responder > Policies

- 「設定例パラメータ」を「Create Responder Policy」メニューの各項目に入力し最後に「Create」をクリックします。

- 残りの Responder Policy も同じ手順に従って作成します。
- 作成後の様子

- VPN 仮想サーバーに Responder Policy を bind する。
- 「NetScaler Gateway Virtual Servers」メニューに移動し VPN 仮想サーバーを選択 「Edit」します。
GUI) Config > NetScaler Gateway > Virtual Servers

- 「VPN Virtual Server」メニュー 「Policies」の 「+」をクリックします。
*Responder Policy のbind が初めての場合に使う手順。

- 「Choose Type」メニューの「Choose Policy」から 「Responder」を選択し「Continue」をクリックします。

- 画面が変わり「Policy Binding」の「Click to select」を選択します。

- 「Responder Policies」メニューから先に作成した Responder Policy を「Select」します。この例では「ALLOW_URL」を選択します。

- 「Binding Details」のPriority が「設定例パラメータ」と同じであることを確認し 「Bind」します。

- 「VPN Virtual Server」メニュー 「Policies」の 「Responder Policy」をクリックします。*Responder Policy のbind が初めてでは無い場合に使う手順。

- 「Add Binding」をクリックし 「Policy Binding」メニューに移動します。

- 「Policy Binding」の「Click to select」を選択します。

- 「Responder Policies」メニューから 「DENY_ALL」を選択の上 「Select」します。

- 「Binding Details」のPriority が「設定例パラメータ」と同じであることを確認し 「Bind」します。

- 最後は 「Close」と「Done」をクリックします。
3.3 項目説明

3.4 動作確認
- ホスト名指定時のポータルサイト様子

- IP指定時のポータルサイト様子

- ホスト名(異なるホスト名)指定時のポータルサイト様子

3.5 Responder をVPN 仮想サーバーに使う際の注意
HTTP リクエストによっては、 Responder が処理を行わない場合があります。それは製品の仕様として各機能に処理の優先順位が存在するからです。VPN と AAA や ICA Proxyモジュールは Responder より優先順位が高く、これらの機能に該当するHTTP リクエストは Responder に届かないからです。
4 NetScaler 宛て通信を制御する
NetScaler に入るトラフィックは、ACL を使用して制御出来ます。ACL には2種類があり、それぞれ Simple ACL とExtended ACL と呼ばれます。構築時には、使い勝手の良さから Extended ACL をよく利用します。Simple ACL は簡易的な通信制御が可能である一方、 Extended ACL は送信元および宛先IP のレンジ指定やプロトコルの指定が出来ます。Extended ACLはステートフル設定も出来ますが、セッション同期非対応のためデフォルトのまま(無効)使います。
それぞれの違いを簡易的にまとめました。

参考情報
- https://docs.netscaler.com/en-us/citrix-adc/current-release/networking/access-control-lists-acls/extended-acls-and-extended-acl6s
- https://docs.netscaler.com/en-us/citrix-adc/current-release/networking/access-control-lists-acls/acls-blocking-traffic-on-internal-ports.html
4.1 設定例パラメータ
各ACL の概要:
・管理 IP に対して、SSH を許可するACL (Priority 10)
・管理 IP に対して、HTTPS を許可する ACL(Priority 20)
・VPN vserver に対して、HTTPS を許可する ACL(Priority 30)
・残り通信を全て拒否する ACL(Priority 100)

4.2 設定手順
- NetScaler にログインします。
- 「Extended ACLs」メニューに移動し 「Add」をクリックし ACL を作成します。
GUI) Config > System > Network > ACLs > Extended ACLs

- 「設定例パラメータ」をConfigurate Extended ACL メニューの各項目に入力し最後に「Create」をクリックします。

- 残りの ACL は同じ手順に従って作成します。
- ACL 作成のみでは設定反映されないため、Extended ACLsメニューからまとめて「Apply」します。
GUI) Select Action > Apply を選択します。

4.3 項目説明

4.4 動作確認
許可していない端末から VPN 仮想サーバー以外の IP へ接続する。
- ACL 未適用時


- ACL 適用時


4.5 ACL を使う際の注意
ACL を適用してもデフォルトのままではブロックされないポートが存在します。
*製品ドキュメントより抜粋

これらの通信をACL によって制御する場合は次のコマンドを使って設定します。
set l3param -implicitACLAllow DISABLED
Nmap を使ってポートスキャンした結果です。
Nmap STATE について:
・Open = Nmap が送信した TCP SYN に対して SYN/ACK を受信したこと。
・Closed = Nmapが送信した TCP SYN に対して RST を受信したこと。
・表示されないポートは Nmapが送信した TCP SYN に対して無応答だったこと。
-
implicitACLAllow デフォルト「ENABLED」

-
implicitACLAllow 「DISABLED」

それでも図の様にNSIP、SNIP 宛ての通信においてブロックされないポートも存在します。これ自体は仕様です。
5 まとめ
ここまでお読みいただき、ありがとうございます。初めての投稿となりますが、少しでもお役に立つコンテンツであれば嬉しいな思います。今回の投稿には含めていませんが、SSLサイファーの選定方法やSNIの利用、Rewrite機能を使ったサーバヘッダーの削除などについても、今後追記していきたいと考えています。それではまた今度。