0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

StoreFrontとCsrfトークン

Posted at

クロスサイトリクエストフォージェリ(CSTRF)対策のため、StoreFrontではCsrf Tokenを利用する機能が
実装されています。
SDKを確認すると、HTTP、HTTPSの両通信で必須となっており、GUIから無効にすることはできないのですが、
極稀にですが、Csrf-Tokenの利用を無効化したい場合があります。

NetScaler等の機器でこのCookieを削除するルール(Rewrite)を作成してStoreFrontのLB用VIPに適用すると
エラーが発生して利用できません。やはりCsrf-TokenのCookieは必須のようです。

Wiresharkでキャプチャしたパケットを眺めていると、ブラウザを経由せずにReceiverへサイトを登録して
接続するとCsrf-Tokenを利用していないことが判明しました。Csrf-Tokenは、Firefox等のブラウザで利用
した時だけ利用するような仕組みが実装されているようです。

StoreWeb\Web.conf の中身を調査していくと、気になる行が見つかりました。

excludedUserAgentsとあるのでこの後に記述されているUserAgentsはcsrfProtectionが無効になるような
雰囲気を醸し出しています。
Receiverから接続した際のUserAgentsはCitrixReceiverが設定されておりReceiverからの利用では
Csrf-Tokenが利用されていないのも納得できそうな雰囲気がします。

ちなみにMozillaを追加すると、ブラウザ経由で利用した時もCsrf-Tokenを利用しなくなりました。

Csrf-Tokenの利用の有無は、内部的にIsCsrfProtectionEnabled()関数で処理されており、
System.Text.RegularExpressions内のIsMatchメソッドで判断していました。
ILSpyを使うと内部構造がわかるので重宝しています。

Web.confを直接書き換えてしまうとメーカサポートが受けられなかったり、何かしらのタイミングで元に
戻る心配があります。
その場合には、直接ヘッダに含まれているUser-Agentを書き換えてしまえば解決します。
NetScalerをStoreFrontのLBとして利用している場合にはRewrite機能を利用します。
GUIでは説明が大変なのでコンソールより次のコマンドを実行します。

add rewrite action replace_useragent_action replace "HTTP.REQ.HEADER(\"User-Agent\")" "\"CitrixReceiver\"" add rewrite policy replace_useragent_policy HTTP.REQ.IS_VALID replace_useragent_action

作成したポリシーをVIPに割り当てます。
bind lb vserver LB用VIP名 -policyName replace_useragent_policy -priority 100 -gotoPriorityExpression END -type REQUEST

これでVIPに対するリクエストに含まれるUser-AgentをCitrixReceiverに書き換えます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?