Citrix GatewayとMicrosoft Azureの多要素認証
Citrix Gatewayは、すべてのホストされたアプリケーション、SaaS/Web アプリケーション、エンタープライズアプリケーション、モバイルアプリケーションを、あらゆるデバイスやブラウザーのユーザーに提供します。nFactor認証を使用して、オンプレミスのMicrosoft ADに対してユーザーを認証し、Azure多要素認証(MFA) に Microsoft AD FSを活用します。
Citrix Gateway
Citrix Gatewayでは、データセンターやクラウドに展開されたビジネスアプリケーションやデータに対して、1つのアクセスポイントとシングルサインオン(SSO)をユーザーに提供します。ノートパソコン、デスクトップ、シンクライアント、タブレット、スマートフォンなど、さまざまなデバイスでSaaSとして提供されます。Citrix Gatewayは、統合、リモートアクセスインフラストラクチャの設置面積の削減、コストの削減、管理の容易さ、エンドユーザーエクスペリエンスの向上を実現します。Citrix Gatewayは、ITをハイブリッドクラウドおよびSaaS環境に移行するのに役立ちます。
- フェデレーションとシングルサインオン
Citrix GatewayはフェデレートIDを提供し、SAML 2.0、OAuth、OpenIDをサポートしているため、Web、VDI、エンタープライズ、SaaSアプリケーションなど、すべてのアプリケーションでシングルサインオンを実現します。
- オンプレミスのユーザーディレクトリ
Citrix Gatewayは、Office 365やSalesforceなどのSaaSアプリケーションに対してSSOを提供し、ユーザーディレクトリをオンプレミスで保持します。これは、Active Directory フェデレーションサービス (AD FS) の IdP またはプロキシとして実装できます。
- 多要素(nFactor)認証
Citrix Gatewayは、nFactor認証メカニズムを提供し、ネットワークにアクセスするユーザー、アクセス内容、アクセス方法とアクセス時期をきめ細かく制御できます。これは、このようなRADIUS、タカス、NTLM、直径、SAML 2.0、OAuth 2.0、およびOpenID 2.0などのすべての認証メカニズムをサポートしています。
- コンテキストに基づくアクセス制御ポリシー
Citrix Gateway では、エンドユーザーデバイス、ユーザー、ユーザーの場所などのデータの状態に基づいて、ビジネスアプリケーションへのきめ細かいアクセス制御が可能です。IT管理者は、アプリケーション環境でデータに安全にアクセスするためのポリシーを作成、管理、および適用できます。これらのポリシーは、VDI、Web、モバイル、エンタープライズ、SaaS アプリケーションに対して実装できます。
- 可視性とモニタリング
Citrix Application Delivery Management には、Citrix Gatewayを介してアクセスされるすべてのアプリケーションのエンドツーエンドのユーザーエクスペリエンスを可視化するためのGateway Insightが含まれています。EPA チェックの失敗やシングルサインオンの失敗など、認証の失敗に関する問題のトラブルシューティングを行うために、アプリケーションサポートチームが情報を提供します。
Microsoft Azure MFA
人々はますます複雑化するシナリオで、組織のリソースに接続しています。企業は、スマートフォン、タブレット、PC、ラップトップを使用して、企業ネットワーク内外で、組織所有のデバイス、個人用デバイス、公共デバイスから接続できます。多くの場合、複数のプラットフォームを使用します。この常時接続、マルチデバイス、マルチプラットフォームの世界では、ユーザーアカウントのセキュリティがこれまで以上に重要になっています。デバイス、ネットワーク、プラットフォーム間で使用されるパスワードは、複雑さに関係なく、ユーザーアカウントのセキュリティを確保するのに十分ではありません。特に、ユーザーがアカウント間でパスワードを再利用する傾向がある場合は特にそうです。高度なフィッシングやその他のソーシャルエンジニアリング攻撃により、暗い Web 上でユーザー名とパスワードが投稿され、販売される可能性があります。
2段階検証プロセスのセキュリティは、階層化されたアプローチにあります。複数の認証要素が侵害されることは、攻撃者にとって大きな課題となります。攻撃者がユーザーのパスワードを習得しても、追加の認証方法を所有することなく役に立たない。これは、次の認証方法の2つ以上を要求することによって機能します。
- あなたが知っているもの(通常はパスワード)
- あなたが持っているもの(電話のように簡単に複製できない信頼できるデバイス)
- あなたが何か(生体認証)
Azure 多要素認証は、データとアプリケーションへのアクセスを保護するのに役立ちます。これは、認証の第二の形式を使用して、セキュリティの余分な層を提供します。組織は、条件付きアクセスを使用して、ソリューションを特定のニーズに合わせることができます。
Microsoft Azure MFAの展開方法
Azure MFAを認証の 2 番目の要素として活用するには、さまざまな方法があります。ここでは、それぞれの長所と短所を簡単に説明します。
Azure MFAサーバー
Microsoft Azureの多要素認証サーバーは、元の方法であり、廃止される予定です。そのため、新しい実装での使用は考慮しないでください。
- この方法については、今後Microsoftからの更新はありません。
- SSPRおよびAzure MFAクラウドベースとの統合はありません。
- MFAサーバーから MFAクラウドベースのソリューションへのシームレスな移行ツールはありません。
Azure MFA ネットワークポリシーサーバー拡張
Azure MFA 用のネットワークポリシーサーバー (NPS) 拡張機能は、NPS アダプターを使用して Azure MFA クラウドベースに接続するためにサポートされているソリューションです。オンプレミスの RADIUS サーバーとして使用できます。
- NPS アダプタ(RADIUS)は、MFA 規則内外またはオン/オフのネットワークロケーションを提供します。
- SAML 統合方法と同様、Azure AD 条件付きアクセスポリシーと互換性がありません。条件付きアクセスポリシーは、より豊かで優れたユーザーエクスペリエンスを提供します。
- ユーザーは、NPS アダプターを使用する前に MFA に登録する必要があります。Azure MFA クラウドベースおよび条件付きアクセスとは異なり、ユーザーが登録されていない場合、NPS 拡張機能はユーザーの認証に失敗し、ヘルプデスクへの呼び出しが増えます。
- NPS アダプターが MFA を起動すると、ユーザーが登録したデフォルトオプションにヒットします。ユーザーには、MFA が必要であり、これから来るという視覚的な通知はありません。ゲート処理中にユーザーが MFA メソッドを変更するための UI はありません。ユーザーがデフォルトのデバイスを持っていない場合、失敗します。ユーザーは、セルフサービスポータルに戻り、デフォルトオプションをリセットしてから、もう一度接続を試みる必要があります。
Microsoft AD FSとAzure MFA
組織がAzure ADとフェデレートされているがパスワードハッシュがAzure ADと同期されていない場合は、Lightweight Directory Access Protocol(LDAP)にオンプレミスADを使用し、AD FSの証明書利用者のアクセスポリシーの一部としてAzure MFAを有効にできます。Windows Server 2016以降、プライマリ認証用に Azure MFA を構成できるようになりました。
- Azure MFA アダプターは Windows Server 2016 に組み込まれており、追加のインストールは必要ありません。
- Azure MFA アダプターは Azure AD と直接統合され、オンプレミスの Azure MFA サーバーは必要ありません。
- ユーザーが MFA に登録されていない場合は、次回のサインイン時にプロセスを案内します。これにより、ヘルプデスクへの呼び出しが少なくなり、ユーザーにとってより良いプロセスが実現されます。
- ユーザーは、MFA が必要であり、今後予定されているという視覚的な通知を受け取ります。ユーザーは、UI のゲート処理中にGateway オプションを変更できます。
Azure ADとAzure MFA
組織がパスワードハッシュを Azure AD に同期している場合は、条件付きアクセスポリシーによって Azure MFA を活用して、ユーザーに第 2 要素認証をチャレンジできます。
- この方法では、オンプレミスで追加のインストールは必要ありません。
- ユーザーが MFA に登録されていない場合は、次回のサインイン時にプロセスを案内します。これにより、ヘルプデスクへの呼び出しが少なくなり、ユーザーにとってより良いプロセスが実現されます。
- ユーザーは、MFA が必要であり、今後予定されているという視覚的な通知を受け取ります。ユーザーは、UI のゲート処理中にGateway オプションを変更できます。
Azure AD パススルー認証と Azure MFA
Azure AD パススルー認証 (PTA) を使用すると、ユーザーは同じパスワードを使用して、オンプレミスアプリケーションとクラウドベースの両方のアプリケーションにサインインできます。ユーザーが Azure AD を使用してサインインすると、この機能はユーザーのパスワードをオンプレミスの Active Directoryに対して直接検証します。Azure AD PTA は、Azure AD パスワードハッシュ同期の代替手段であり、組織にクラウド認証の同じ利点を提供します。
- Azure AD PTA では、軽量エージェントをオンプレミスにインストールする必要があります。
- Azure AD PTA は、Azure MFA を含む Azure AD 条件付きアクセスポリシーとシームレスに連携することで、ユーザーアカウントを保護します。
- ユーザーは、セルフサービスのパスワード管理タスクをクラウドで完了できます。
- オンプレミスのパスワードは、どのような形式でもクラウドに保存されることはありません。
- エージェントは、ネットワーク内からのみアウトバウンド接続を行います。したがって、境界ネットワーク (DMZ とも呼ばれる) にエージェントをインストールする必要はありません。
現在の状況
次の特性を持つ環境では、認証の 2 番目の要素として Azure MFA を活用する必要があります。
- Azure AD 同期を使用するオンプレミス AD が構成されています。
- Azure AD パスワードハッシュ同期が無効になっています。
- O365 アプリケーションへのアクセスが必要です。
- Citrix Virtual Apps and Desktops をオンプレミスでアクセスする必要があります。
- 最新の認証方法(SAML、OAuth)を使用したアプリケーションへのアクセスが必要です。
- レガシー認証方式を使用するアプリケーションへのアクセスが必要です。
デザイン面の考慮事項
提案されたソリューションのデザイン面での考慮事項は次のとおりです。
- ホストされたアプリケーション、SaaSアプリケーション、エンタープライズアプリケーション、Webアプリケーションに1つのポータルで安全にアクセスする必要があります。
- ユーザーは、認証プロセス中に資格情報の入力を1回だけ要求される必要があります。
- シングルサインオンは、ホスト型、SaaS型、エンタープライズ、Webのすべてのアプリケーションに提供する必要があること。
提案されたソリューション
概要
提案されたソリューションは、次のコンポーネントに基づいています。
- オンプレミスのCitrix Gateway
- オンプレミスのMicrosoft AD
- オンプレミスのAD FS
- AD FSプロキシとしてのオンプレミスのCitrix ADC
- Microsoft Azure MFA
Citrix Gatewayでは、認証、承認、監査機能 (Citrix ADC AAA) および nFactor認証メカニズムを利用して、LDAPポリシーを使用してユーザーを認証し、AD FS証明書利用者のアクセスポリシーを利用して Azure MFA検証プロセスをトリガーします。Azure MFA がユーザーを検証した後、AD FS は SAML アサーション (SAML 応答) を生成し、ユーザーを Citrix Gatewayにリダイレクトします。この時点で、ユーザーは認証され、Citrix Gatewayはそのユーザーが使用を許可されているすべてのアプリケーションを表示します。
このソリューションには、2 つのパブリック DNSレコードと 2 つのパブリック IP アドレスが必要です。
説明 | 値 |
---|---|
Citrix Gateway FQDN | access.ctxdemos.com |
Citrix の認証、承認、および監査FQDNの | aaa.ctxdemos.com |
このソリューションでは、1 つのパブリック SSL 証明書を使用します。
説明 | 値 |
---|---|
コモンネーム | access.ctxdemos.com |
サブジェクトの別名 | sts.ctxdemos.com |
サブジェクトの別名 | aaa.ctxdemos.com |
このソリューションは、内部の Microsoft 認証局サービスによって発行されたワイルドカード SSL 証明書も使用します。
説明 | 値 |
---|---|
コモンネーム | *.ctxdemos.com |
認証フロー
シーケンス図
次のシーケンス図は、ソリューションの認証フローを示しています。
認証手順
認証手順は次のとおりです。
- ユーザーがhttps://access.ctxdemos.comに移動します。
- Citrix Gatewayは、最初のCitrix ADC AAA VIP(アドレス指定不可)にユーザーをリダイレクトします。
- 最初のCitrix ADC AAA VIPは、シングルサインオンで構成されたスキーマなしのログオンを使用します。次に、高度な認証ポリシーの処理を開始します。
- 最初の認証ポリシーは、認証クッキーを生成するために、アドレス指定できない LB VIP への SAML SP です。
- ヘルパー LB VIP は、認証に 2 番目の Citrix ADC AAA VIP(アドレス可能)を使用するように構成されています。したがって、ユーザは 2 番目の認証、認可、および監査 VIP にリダイレクトされます。
- 2つ目の Citrix ADC AAA VIP は、ユーザー名の入力を求める
Username Only
ログオンスキーマを使用します。次に、高度な認証ポリシーの処理を開始します。 - 最初の認証ポリシーは、オンプレミスADでユーザー名を照会し、ユーザーがAzureMFACAUsersセキュリティグループに属しているかどうかを検証するグループの抽出です。検証結果が成功すると、次の認証要素(LDAPポリシー)の処理が開始されます。
- LDAP ポリシーは、
UsernameAndPassword
ログインスキーマと事前に入力されたユーザー名フィールドを使用して、AD パスワードの入力をユーザーに要求します。 - 2 つ目の Citrix ADC AAA VIP での認証が正常に完了すると、ヘルパー LB VIP に戻り、最初の認証、承認、および監査 VIP の SAML 応答を生成します。
- 最初のCitrix ADC AAA VIPは次の要素の処理を開始します。これは、ユーザーのグループがADから抽出され、認証、承認、および監査変数に格納され、プロセスの後半で使用できるようになります。
- まず、Citrix ADC AAA VIP は、次の要因の処理を開始します。これは、Citrix ADC 上の AD FS プロキシ VIP への SAML SP です。
注:
Citrix ADCはAD FSファームとフェデレートされます。詳細な手順については、後のセクションで説明します。
- AD FS プロキシ VIP は、認証クッキー (NSC_TMAA および NSC_TMAS) が設定されていることを検証します。次に、SAML 要求をバックエンド AD FSサーバーに送信します(高可用性とサービスの復元性を実現するために、バックエンド AD FSサーバーは内部 Citrix ADC で負荷分散される必要があります)。
- AD FSサーバーは SAML 要求を処理します。証明書利用者のアクセスポリシーが「すべてのユーザーを許可し、認証に MFA を要求する」に設定されているため、Azure MFA認証プロセスがトリガーされます。
- Azure MFAはユーザー名を処理します。すでに登録されている場合は、設定された方法でユーザにチャレンジします。そうでない場合は、プライマリ認証方式とセカンダリ認証方式を登録して設定するよう求められます。
- Azure MFA認証プロセスが正常に完了すると、AD FS は、Citrix Gateway (最初の Citrix ADC AAA VIP) の SAML 応答を生成します。
- まず、Citrix ADC AAA VIP が SAML 応答を受信し、ユーザーの認証プロセスが完了したことを確認します。
- Citrix Gatewayは認証情報をCitrix StoreFrontに送信します。この情報は、ユーザーが使用を許可されているすべてのアプリケーションとデスクトップを列挙します。また、ユーザーのグループメンバーシップを処理して、Citrix Gatewayに公開されたブックマークを表示します。
認証画面
上記の手順のほとんどは、Citrix ADC上のさまざまなVIP間で内部的に発生するため、ユーザーにとってシームレスです。ユーザーエクスペリエンスを以下に示します。
実装
Microsoft AD FS
証明書の要件
フェデレーションサーバーには、次の表に示す証明書が必要です。
証明書の種類 | 説明 | 展開する前に知る必要があること |
---|---|---|
Secure Sockets Layer (SSL) 証明書 | これは、フェデレーションサーバーとクライアント間の通信をセキュリティで保護するために使用される標準のセキュアソケットレイヤー (SSL) 証明書です。 | この証明書は、フェデレーションサーバーまたはフェデレーションサーバープロキシのインターネットインフォメーションサービス (IIS) の既定の Web サイトにバインドする必要があります。フェデレーションサーバープロキシの場合、フェデレーションサーバープロキシ構成ウィザードを正常に実行する前に、IIS でバインドを構成する必要があります。推奨事項:この証明書は AD FSのクライアントによって信頼される必要があるため、パブリック (サードパーティ) 証明機関 (CA) によって発行されたサーバー認証証明書を使用します。たとえば、ベリサイン。ヒント:この証明書のサブジェクト名は、展開する AD FSの各インスタンスのフェデレーションサービス名を表すために使用されます。このため、パートナーにとって会社または組織の名前を最もよく表す新しい CA 発行の証明書で、サブジェクト名を選択することを検討してください。 |
サービス通信証明書 | この証明書により、フェデレーションサーバー間の通信をセキュリティで保護するための WCF メッセージセキュリティが有効になります。 | デフォルトでは、SSL 証明書がサービス通信証明書として使用されます。これは、AD FS 管理コンソールを使用して変更できます。 |
トークン署名証明書 | これは、フェデレーションサーバーが発行するすべてのトークンに安全に署名するために使用される標準の X509 証明書です。 | トークン署名証明書には秘密キーが含まれていなければならず、フェデレーションサービスの信頼されたルートにチェーンする必要があります。既定では、AD FS は自己署名証明書を作成します。ただし、組織のニーズに応じて、AD FSの管理スナップインを使用して、後で CA 発行の証明書に変更できます。 |
トークン暗号化解除証明書 | これは、パートナーフェデレーションサーバーによって暗号化された受信トークンの復号化に使用される標準 SSL 証明書です。また、フェデレーションメタデータにも公開されます。 | 既定では、AD FS は自己署名証明書を作成します。ただし、組織のニーズに応じて、AD FSの管理スナップインを使用して、後で CA 発行の証明書に変更できます。 |
デモ環境の構成
証明書の種類 | デモ環境の構成 |
---|---|
Secure Sockets Layer (SSL) 証明書 | AD FSサーバー上の内部発行 CA によって発行された内部証明書。Citrix ADC上の信頼できる公開証明書。 |
サービス通信証明書 | AHS 内部発行認証局によって発行された内部証明書。 |
トークン署名証明書 | AD FSサービスによって自動生成されます。 |
トークン暗号化解除証明書 | AD FSサービスによって自動生成されます。 |
デモ環境では、ワイルドカード証明書が登録され、サーバーにインストールされます。
サービスアカウントの要件
サービスアカウントを作成するか、グループ管理サービスアカウント(gMSA)を活用できます。gMSAを使用するには、キー配布サービスのルートキーを作成する必要があります。そのため、PowerShellを起動し、次のコマンドを実行します。
Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))
<!--NeedCopy-->
このコマンドは、Active Directoryに格納されたキー配布サービスのルートキーを作成します。これにより、後で作成する AD FSサービスアカウントとして、グループ管理サービスアカウント (gMSA) を作成できます。ドメイン管理者権限でこのコマンドを実行します。
DNSレコードの要件
内部および外部のAD FSフェデレーションサービス名のDNS Aレコードが必要です。デモ環境では、内部DNSレコードはAD FSサーバーのIPを指し、外部DNSレコードはCitrix Gatewayのパブリック IP を指しています。
レコード名 | スコープ | 種類 | IPアドレス |
---|---|---|---|
sts.ctxdemox.com | 内部 | A | 22.22.22.6 |
sts.ctxdemox.com | 外部 | A | 40.85.225.175 |
AD FSの役割の追加AD FSファームの構成
AD FSの役割の追加
AD FSの役割をWindows Server 2016に追加するには、PowerShell を起動し、次のコマンドを実行します。
Install-WindowsFeature AD FS-Federation -IncludeManagementTools
<!--NeedCopy-->
AD FSファームの構成
これで、 サーバーマネージャーからAD FSの展開後の構成を開始できます。[ このサーバーでフェデレーションサービスを構成する] をクリックします。
[ようこそ] ページで、 [フェデレーションサーバーファームに最初のフェデレーションサーバーを作成する]を選択し、[次へ] をクリックします。
[Active Directoryドメインサービスへの接続] ページで、ドメイン管理者アカウントが指定されていることを確認し、[次へ] をクリックします。
[サービスのプロパティの指定] ページで、次の手順を完了し、[次へ] をクリックします。
- 前の手順でサーバーにインストールされた証明書を選択します。
- フェデレーションサービス名は、証明書のサブジェクト名に基づいて自動的に設定されます。
- フェデレーションサービスの表示名を入力します。たとえば、「CTXDEMOS STS」などです。
[サービスアカウントの指定] ページで、[グループ管理サービスアカウントの作成] を選択し、このアカウントの一意の名前を入力します。グループ管理サービスアカウントは、Windows Server 2012 以降でサポートされており、30日ごとに自動的に変更される厳密な複雑なパスワードが付属しています。[次へ] をクリックします。
[構成データベースの指定] ページで、SQL Serverデータベースの場所を指定します。[次へ] をクリックします。
[確認オプション] ページで、構成の選択を確認し 、[次へ] をクリックします。
[前提条件のチェック] ページで、すべての前提条件のチェックが正常に完了していることを確認し、[構成] をクリックします。
[結果] ページで、インストールが正常に完了していることを確認します。[Close]をクリックしてウィザードを終了します。
注:
次の手順を完了するには、AzureテナントIDが必要です。
Azure テナント ID は、Microsoft のドキュメント記事「 AzureID テナントの詳細を取得する」の手順に従って取得できます。
Microsoftのドキュメントには、 AD FS 2016 と Azure MFA の構成の Azure MFAクライアント GUID に関する情報も記載されています。
AD FS ファームの構成-自動化
次のPowerShellスクリプトを実行できます。
#
# Windows PowerShell script for AD FS Deployment
#
Import-Module ADFS
Install-AdfsFarm `
-CertificateThumbprint:"BD02F30D90A96EEE4A5934F2EA979E7A052584AE" `
-FederationServiceDisplayName:"CTXDEMOS STS" `
-FederationServiceName:"adfs.ctxdemos.com" `
-GroupServiceAccountIdentifier:"C
<!--NeedCopy-->
Azure MFAを使用したAD FSの構成
AD FSサーバーを構成する
各AD FSサーバーでPowerShellを起動し、次のコマンドを実行します。
# Install Windows PowerShell MSOnline Module
Install-Module MSOnline
# Import Windows PowerShell MSOnline Module
Import-Module MSOnline
# Get the Azure Global Administrator credential
$credential = Get-Credential
# Sign in to your Azure Active Directory environment
Connect-MsolService -Credential $credential
# Set a variable for the Azure Tenant name
$azureTenantID = "ctxdemos.onmicrosoft.com"
# Set a variable for the Azure MFA Client GUID
$azureMFAClientGUID = "981f26a1-7f43-403b-a875-f8b09b8cd720"
# Generate a certificate for the Azure MFA on AD FS server
$azureMFACertificate = New-AdfsAzureMfaTenantCertificate -TenantId $azureTenantID
# Add the new credentials to the Azure MFA Client Service Principal
New-MsolServicePrincipalCredential -AppPrincipalId $azureMFAClientGUID -Type asymmetric -Usage verify -
Value $azureMFACertificate
<!--NeedCopy-->
AD FSファームを構成する
AD FSサーバーの 1 つだけで、次のコマンドを実行します。
Set-AdfsAzureMfaTenant -TenantId $azureTenantID -ClientId $azureMFAClientGUID
<!--NeedCopy-->
各サーバーで AD FSサービスを再起動します。次に、Azure MFA がイントラネットとエクストラネットのプライマリおよび多要素認証方法として使用できることがわかります。
Citrix ADC を使用してAD FS を構成する
AD FS と Citrix ADC の間にフェデレーション信頼を作成する必要があります。AD FS管理コンソールで、[証明書利用者の信頼] に移動し、[証明書利用者の信頼の追加] を選択します。
[証明書利用者に関するデータを手動で入力する] を選択し、[次へ] をクリックします。
わかりやすい表示名およびオプションの注記を入力します。[次へ] をクリックします。
[次へ] をクリックします。
[SAML 2.0 WebSSO プロトコルのサポートを有効にする] を選択し、https://CitrixGatewayFQDN/cgi/samlauth
と入力します。デモ環境では、https://access.ctxdemos.com/cgi/samlauth
です。[次へ] をクリックします。
証明書利用者信頼の一意の識別子文字列を入力します。デモ環境では、https://access.ctxdemos.com
です。この識別子は、Citrix ADC SAMLプロファイルの発行者URLとして使用されます。[次へ] をクリックします。
[アクセス制御ポリシーの選択] ページで、[全員を許可し、MFAを要求する] を選択します。[次へ] をクリックします。
[次へ] をクリックします。
[完了] ページで、[このアプリケーションの要求発行ポリシーを構成する] を選択します。[閉じる] をクリックします。
[発行変換規則] ページで、[規則の追加] をクリックします。
[次へ] をクリックします。
[要求規則名] フィールドにわかりやすい名前を入力します。[属性ストア] で、[Active Directory] を選択します。次に、[LDAP属性] と [送信要求タイプ] を選択します。
新しい規則を作成し、[規則テンプレートとして要求] として、[カスタム規則を使用して要求を送信する] を使用します。[要求規則名] にわかりやすい名前 を入力し、[カスタム規則] に次の文字列を入力します。
=> issue(Type = "logoutURL", Value = "https://access.ctxdemos.com/cgi/tmlogout", Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/attributename"] = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified");
<!--NeedCopy-->
要求発行ポリシーが作成されたら、[OK] をクリックします。
[証明書利用者の信頼] > [Citrix ADC] を右クリックし、[プロパティ] を選択します。[エンドポイント] を選択し、[ログアウト用のSAMLを追加] をクリックしてエンドポイントを追加します。[エンドポイントタイプ] リストから [SAMLログアウト] を選択します。[バインド] で [POST] を選択し、[信頼済みURL] にhttps://sts.ctxdemos.com/adfs/ls/?wa=wsignout1.0
と入力します。これは、Citrix ADCからログアウトするときのログアウトURLとして機能します。[OK] をクリックします。
[証明書利用者の信頼] > [Citrix ADC] を右クリックし、[プロパティ] を選択します。[ 暗号化 ]を選択し、Citrix GatewayにインストールされているパブリックSSL証明書を追加します。この証明書は、Citrix ADCからの受信SMLリクエストの復号化に使用されます。[署名] タブでも同じ操作を繰り返します。この証明書は、着信 SAML リクエストの署名を確認するために使用されます。[OK] をクリックします。
IdP 開始サインオンページの有効化
AD FS IdP が開始するサインオンページを有効にできます。IdP が開始したサインオンを使用して、未登録の MFA ユーザーにカスタムエラーページを表示します。有効にするには、次のコマンドを実行します。
Set-AdfsProperties -EnableIdPInitiatedSignonPage $true
<!--NeedCopy-->
AD FS ファームのテスト
Web ブラウザーを開き、次の場所に移動します。
- https://sts.ctxdemos.com/FederationMetadata/2007-06/FederationMetadata.xml
- https://sts.ctxdemos.com/adfs/fs/federationserverservice.asmx
- https://sts.ctxdemos.com/adfs/ls/idpinitatedsignon.aspx
Citrix ADCおよびCitrix Gateway
Citrix Gatewayを構成します
ウィザードを使用してCitrix Gatewayを構成できます。Citrix ADC管理GUIにログオンし、 Unified Gatewayに移動し、[新しいGatewayの作成] をクリックします。次に、[続行] をクリックします。
Unified Gatewayの名前、IP、およびFQDNを入力し、[続行] をクリックします。
パブリックSSL証明書を選択し、[続行] をクリックします。
基本的な LDAP ポリシーを作成し、 Unified Gatewayにバインドします。[続行] をクリックします。
RfWebUI に基づいてポータルテーマを作成し、 Unified Gatewayにバインドします。[続行] をクリックします。
Citrix GatewayとStoreFront を統合するアプリケーションの前にあるプラス記号(+)を選択します。
Citrix StoreFrontとCitrix Gatewayの統合
[アプリケーション]ページで [XenApp & XenDesktop] を選択し、[統合ポイントの選択] リストから [StoreFront] を選択します。[続行] をクリックします。
StoreFront URLを入力し、[ストアの取得] をクリックします。次に、[デフォルトのActive Directoryドメイン] と [Secure Ticket Authority URL] 設定を入力します。[STA接続のテスト] 、[続行] の順にクリックします。
[完了] 、[続行] の順にクリックします。
Citrix Gatewayの構成とStoreFrontの統合 — CLI
# Create Session Policy and Action for Citrix Receiver
add vpn sessionAction AC_OS_22.22.44.50 -transparentInterception OFF -defaultAuthorizationAction ALLOW -SSO ON -icaProxy ON -wihome "https://access.ctxdemos.com/Citrix/ExternalWeb" -ClientChoices OFF -ntDomain CTXDEMOS -clientlessVpnMode OFF -storefronturl "https://access.ctxdemos.com"
add vpn sessionPolicy PL_OS_22.22.44.50 "HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixReceiver") && HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixVPN").NOT && HTTP.REQ.HEADER("User-Agent").CONTAINS("NSGiOSplugin").NOT" AC_OS_22.22.44.50
# Create Session Policy and Action for Citrix Web Client
add vpn sessionAction AC_WB_22.22.44.50 -transparentInterception ON -defaultAuthorizationAction ALLOW -forceCleanup cookie -SSO ON -ssoCredential PRIMARY -icaProxy OFF -wihome "https://storefront.ctxdemos.com/Citrix/ExternalWeb" -wiPortalMode COMPACT -ClientChoices OFF -ntDomain CTXDEMOS -clientlessVpnMode ON -clientlessPersistentCookie ALLOW
add vpn sessionPolicy PL_WB_22.22.44.50 "HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixReceiver").NOT" AC_WB_22.22.44.50
# Create Session Policy and Action for Citrix Gateway Client
add vpn sessionAction UG_VPN_SAct_22.22.44.50 -transparentInterception ON -defaultAuthorizationAction ALLOW -SSO ON -ClientChoices ON -clientlessVpnMode ON
add vpn sessionPolicy UG_VPN_SPol_22.22.44.50 true UG_VPN_SAct_22.22.44.50
# Create Responder Policy and Action for Gateway Logout
add responder action RESACT_GATEWAY_LOGOFF_REDIRECT redirect ""https://" + HTTP.REQ.HOSTNAME.HTTP_URL_SAFE" -responseStatusCode 302
add responder policy RESPOL_GATEWAY_LOGOFF_REDIRECT "HTTP.REQ.URL.CONTAINS("/cgi/logout")" RESACT_GATEWAY_LOGOFF_REDIRECT
# Create Citrix Gateway vServer
add vpn vserver UGVS_VPN_UGCTXDEMOS SSL 0.0.0.0 -loginOnce ON -Listenpolicy NONE -vserverFqdn access.ctxdemos.com
set ssl vserver UGVS_VPN_UGCTXDEMOS -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver UGVS_VPN_UGCTXDEMOS -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver UGVS_VPN_UGCTXDEMOS -cipherName CTXDEMOS_FRONTEND_APLUS
bind vpn vserver UGVS_VPN_UGCTXDEMOS -portaltheme CTXDEMOS_PORTAL
bind vpn vserver UGVS_VPN_UGCTXDEMOS -staServer "https://wsctxdc01.ctxdemos.com"
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy RESPOL_GATEWAY_LOGOFF_REDIRECT -priority 100 -gotoPriorityExpression END -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy PL_OS_22.22.44.50 -priority 100 -gotoPriorityExpression NEXT -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy PL_WB_22.22.44.50 -priority 110 -gotoPriorityExpression NEXT -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy UG_VPN_SPol_22.22.44.50 -priority 58000 -gotoPriorityExpression NEXT -type REQUEST
# Create Content Switching Policy and Action for Citrix Gateway
add cs action CSACT_UGCTXDEMOS -targetVserver UGVS_VPN_UGCTXDEMOS
add cs policy CSPOL_UGCTXDEMOS -rule "is_vpn_url || HTTP.REQ.URL.PATH.SET_TEXT_MODE(IGNORECASE).STARTSWITH("/Citrix/External")" -action CSACT_UGCTXDEMOS
# Create Content Switching vServer for Citrix Gateway
add cs vserver CSVS_UGCTXDEMOS SSL 22.22.44.50 443 -cltTimeout 180
set ssl vserver CSVS_UGCTXDEMOS -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver CSVS_UGCTXDEMOS -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver CSVS_UGCTXDEMOS -cipherName CTXDEMOS_FRONTEND_APLUS
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_UGCTXDEMOS -priority 63000
# Create Responder Policy and Action for HTTP to HTTPS Redirection
add responder action RESACT_HTTP_TO_HTTPS redirect ""https://" + HTTP.REQ.HOSTNAME.HTTP_URL_SAFE + HTTP.REQ.URL.PATH_AND_QUERY.HTTP_URL_SAFE" -responseStatusCode 301
add responder policy RESPOL_HTTP_TO_HTTPS HTTP.REQ.IS_VALID RESACT_HTTP_TO_HTTPS
# Create Always On Server and Service
add server LBSRV_ALWAYS_UP 127.0.0.1
add service LBSVC_ALWAYS_UP LBSRV_ALWAYS_UP HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip ENABLED cip-header -usip YES -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP NO
# Create Always On vServer for Citrix Gateway
add lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS HTTP 22.22.44.50 80 -persistenceType NONE -cltTimeout 180
bind lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS LBSVC_ALWAYS_UP
bind lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS -policyName RESPOL_HTTP_TO_HTTPS -priority 100 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->
最初の認証サーバーの構成
# Create Initialization SAML SP Policy and Action and Bind it to Citrix ADC AAA Authentication vServer
add authentication samlAction AUTH_ACT_SAML_SP_VPN_TO_LB -samlIdPCertName CTXDEMOS_PUBLIC_CERT -samlSigningCertName CTXDEMOS_PUBLIC_CERT -samlRedirectUrl "https://access.ctxdemos.com/samltolb" -signatureAlg RSA-SHA256 -digestMethod SHA256 -samlBinding REDIRECT -groupNameField Groups
add authentication Policy AUTH_POL_SAMP_SP_VPN_TO_LB -rule TRUE -action AUTH_ACT_SAML_SP_VPN_TO_LB
# Create Authentication Policy and Action for SAML SP to ADFS
add authentication samlAction AUTH_ACT_SAML_SP_ADFS -samlIdPCertName CTXDEMOS_ADFS_TOKEN_SIGNING -samlSigningCertName CTXDEMOS_PUBLIC_CERT -samlRedirectUrl "https://sts.ctxdemos.com/adfs/ls/" -samlUserField "Name ID" -samlRejectUnsignedAssertion OFF -samlIssuerName "https://access.ctxdemos.com" -Attribute1 "E-Mail Address" -signatureAlg RSA-SHA256 -digestMethod SHA256 -logoutURL "https://sts.ctxdemos.com/adfs/ls/wa=wsignout1.0" -forceAuthn ON
add authentication Policy AUTH_POL_SAML_SP_ADFS -rule TRUE -action AUTH_ACT_SAML_SP_ADFS
# Create Authentication Policy Label for for SAML SP to ADFS
add authentication policylabel AUTH_POLLBL_ADFS_AZUREMFA -loginSchema LSCHEMA_INT
bind authentication policylabel AUTH_POLLBL_ADFS_AZUREMFA -policyName AUTH_POL_SAML_SP_ADFS -priority 100 -gotoPriorityExpression NEXT
# Create Authentication Policy and Action for Group Extraction
add authentication ldapAction AUTH_ACT_LDAP_GROUP_EXTRACTION_AZUREMFACA -serverIP 22.22.22.61 -serverPort 636 -ldapBase "DC=ctxdemos,DC=com" -ldapBindDn "CN=svc_ctxadc01,OU=Services,OU=Accounts,DC=ctxdemos,DC=com" -ldapBindDnPassword 0c4fe86d56a865ef514a15affd1429f3e079ce1089731d4a407772d21036f3c8 -encrypted -encryptmethod ENCMTHD_3 -ldapLoginName sAMAccountName -searchFilter "memberOf:1.2.840.113556.1.4.1941:=CN=AzureMFACAUsers,OU=Groups,OU=Authorizations,DC=ctxdemos,DC=com" -groupAttrName memberOf -subAttributeName cn -secType SSL -authentication DISABLED -nestedGroupExtraction ON -maxNestingLevel 5 -groupNameIdentifier sAMAccountName -groupSearchAttribute memberOf -groupSearchSubAttribute CN -Attribute1 mail -Attribute2 objectGUID
add authentication Policy AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -rule TRUE -action AUTH_ACT_LDAP_GROUP_EXTRACTION_AZUREMFACA
# Create Authentication Policy Label for Group Extraction
add authentication policylabel AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -loginSchema LSCHEMA_INT
bind authentication policylabel AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -policyName AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -priority 100 -gotoPriorityExpression NEXT -nextFactor AUTH_POLLBL_ADFS_AZUREMFA
# Create Login Schema Policy and Profile for First Citrix ADC AAA Authentication vServer
add authentication loginSchema LSCHEMA_PRF_NOSCHEMA -authenticationSchema noschema -SSOCredentials YES
add authentication loginSchemaPolicy LSCHEMA_POL_NOSCHEMA -rule TRUE -action LSCHEMA_PRF_NOSCHEMA
# Create First Citrix ADC AAA Authentication vServer
add authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN SSL 0.0.0.0
set ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -cipherName CTXDEMOS_FRONTEND_APLUS
bind authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN -policy LSCHEMA_POL_NOSCHEMA -priority 100 -gotoPriorityExpression END
bind authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN -policy AUTH_POL_SAMP_SP_VPN_TO_LB -priority 100 -nextFactor AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -gotoPriorityExpression NEXT
# Create First Citrix ADC AAA Authentication Profile
add authentication authnProfile AAA_AUTH_PRF_VPN -authnVsName AAAVS_CTXDEMOS_COM_FOR_VPN -AuthenticationHost aaa.ctxdemos.com
# Set Authentication Profile on Gateway vServer
set vpn vserver UGVS_VPN_UGCTXDEMOS -authnProfile AAA_AUTH_PRF_VPN
<!--NeedCopy-->
2番目の認証サーバーの構成
# Create Authentication Policy and Action for LDAP
add authentication ldapAction AUTH_ACT_LDAP -serverIP 22.22.22.61 -serverPort 636 -authTimeout 60 -ldapBase "DC=ctxdemos,DC=com" -ldapBindDn "CN=svc_ctxadc01,OU=Services,OU=Accounts,DC=ctxdemos,DC=com" -ldapBindDnPassword 273881819af883e70c33d83c0546eac84e81d6eeba904f2d65bbebf2819c025a -encrypted -encryptmethod ENCMTHD_3 -ldapLoginName sAMAccountName -groupAttrName memberOf -subAttributeName cn -secType SSL -passwdChange ENABLED -nestedGroupExtraction ON -maxNestingLevel 5 -groupNameIdentifier sAMAccountName -groupSearchAttribute memberOf -groupSearchSubAttribute CN -Attribute1 userprincipalname -Attribute2 mail -Attribute3 userParameters
add authentication Policy AUTH_POL_LDAP_USER_NAME_PASSWORD -rule TRUE -action AUTH_ACT_LDAP
# Create Login Schema Policy and Profile for Second Citrix ADC AAA Authentication vServer - Username (Pre-filled ) and Password
add authentication loginSchema LSCHEMA_USER_NAME_PASSWORD -authenticationSchema "/nsconfig/loginschema/CTXDEMOS_USER_NAME_PASS.xml" -SSOCredentials YES
add authentication loginSchemaPolicy LSCHEMA_POL_USER_NAME_PASSWORD -rule TRUE -action LSCHEMA_USER_NAME_PASSWORD
# Create Authentication Policy Label for LDAP Username and Password
add authentication policylabel AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -loginSchema LSCHEMA_USER_NAME_PASSWORD
bind authentication policylabel AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -policyName AUTH_POL_LDAP_USER_NAME_PASSWORD -priority 110 -gotoPriorityExpression NEXT
# Create Login Schema Policy and Profile for Second Citrix ADC AAA Authentication vServer - Username Only
add authentication loginSchema LSCHEMA_USER_NAME_ONLY -authenticationSchema "/nsconfig/loginschema/CTXDEMOS_USER_NAME_ONLY.xml"
add authentication loginSchemaPolicy LSCHEMA_POL_NOPASSWORD -rule TRUE -action LSCHEMA_USER_NAME_ONLY
# Create Citrix ADC AAA Session Policy and Profile
add tm sessionAction AAA_SESSION_PRF_CTXDEMOS -SSO ON -ssoDomain CTXDEMOS -persistentCookie ON -persistentCookieValidity 30
add tm sessionPolicy AAA_SESSION_POL_CTXDEMOS TRUE AAA_SESSION_PRF_CTXDEMOS
# Create Second Citrix ADC AAA Authentication vServer
add authentication vserver AAAVS_CTXDEMOS_COM SSL 22.22.44.51 443
set ssl vserver AAAVS_CTXDEMOS_COM -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver AAAVS_CTXDEMOS_COM -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver AAAVS_CTXDEMOS_COM -cipherName CTXDEMOS_FRONTEND_APLUS
bind authentication vserver AAAVS_CTXDEMOS_COM -portaltheme CTXDEMOS_PORTAL
bind authentication vserver AAAVS_CTXDEMOS_COM -policy AAA_SESSION_POL_CTXDEMOS -priority 100 -gotoPriorityExpression NEXT
bind authentication vserver AAAVS_CTXDEMOS_COM -policy LSCHEMA_POL_NOPASSWORD -priority 110 -gotoPriorityExpression END
bind authentication vserver AAAVS_CTXDEMOS_COM -policy AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -priority 140 -nextFactor AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -gotoPriorityExpression NEXT
# Create Second Citrix ADC AAA Authentication Profile
add authentication authnProfile AAA_AUTH_PRF -authnVsName AAAVS_CTXDEMOS_COM -AuthenticationHost aaa.ctxdemos.com
<!--NeedCopy-->
Citrix ADCのAD FS WAPとしての構成
Citrix ADC CLIで次のコマンドを実行して、Citrix ADCをAD FS Webアプリケーションプロキシ(WAP)として構成します。
# Pattern Set - ADFS Proxy Hostname
add policy patset PATSET_ADFS_HOSTNAME
bind policy patset PATSET_ADFS_HOSTNAME sts.ctxdemos.com -index 1 -charset ASCII
# Policy Expression - ADFS Proxy Hostname
add policy expression is_ADFS_HOSTNAME "HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_ADFS_HOSTNAME")"
# Pattern Set - ADFS Proxy Path for NoAuth
add policy patset PATSET_ADFS_PATH_NOAUTH
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust" -index 1 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/federationmetadata/2007-06/federationmetadata.xml" -index 2 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/fs/federationserverservice.asmx" -index 3 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/ls/FormsSignIn.aspx" -index 4 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust/2005/usernamemixed" -index 5 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust/mex" -index 6 -charset ASCII
# Policy Expression - ADFS Proxy Path for NoAuth
add policy expression is_ADFS_PROXY_NOAUTH "HTTP.REQ.URL.PATH.TO_LOWER.CONTAINS_ANY("PATSET_ADFS_PATH_NOAUTH")"
# Pattern Set - ADFS Proxy Path for Passive Client
add policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE
bind policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE "/adfs" -index 1 -charset ASCII
bind policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE "/cgi/selfauth" -index 2 -charset ASCII
# Policy Expression - ADFS Proxy Path for Passive Client
add policy expression is_ADFS_PROXY_ACTIVE_PASSIVE "(HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_ADFS_HOSTNAME") && HTTP.REQ.URL.PATH.TO_LOWER.STARTSWITH_ANY("PATSET_ADFS_PATH_ACTIVE_PASSIVE"))"
# Rewrite Policies for ADFS PIP
add rewrite action RWACT_X_MS_Proxy insert_http_header X-MS-Proxy ""NETSCALER""
add rewrite policy RWPOL_X_MS_Proxy true RWACT_X_MS_Proxy
add rewrite action RWACT_X_MS_Forwarded_Client_IP insert_http_header X-MS-Forwarded-Client-IP CLIENT.IP.SRC
add rewrite policy RWPOL_X_MS_Forwarded_Client_IP true RWACT_X_MS_Forwarded_Client_IP
add rewrite action RWACT_X_MS_Endpoint_Absolute_Path insert_http_header X-MS-Endpoint-Absolute-Path HTTP.REQ.URL
add rewrite policy RWPOL_X_MS_Endpoint_Absolute_Path true RWACT_X_MS_Endpoint_Absolute_Path
add rewrite action RWACT_X_MS_Target_Role insert_http_header X-MS-Target-Role ""PrimaryComputer""
add rewrite policy RWPOL_X_MS_Target_Role true RWACT_X_MS_Target_Role
add rewrite action RWACT_X_MS_ADFS_Proxy_Client_IP insert_http_header X-MS-ADFS-Proxy-Client-IP CLIENT.IP.SRC
add rewrite policy RWPOL_X_MS_ADFS_Proxy_Client_IP true RWACT_X_MS_ADFS_Proxy_Client_IP
add rewrite action RWACT_X_MS_Client_User_Agent insert_http_header X-MS-Client-User-Agent "HTTP.REQ.HEADER("User-Agent")"
add rewrite policy RWPOL_X_MS_Client_User_Agent true RWACT_X_MS_Client_User_Agent
add rewrite action RWACT_ADFS_PROXYMEX replace HTTP.REQ.URL.PATH_AND_QUERY ""/adfs/services/trust/proxymex" + HTTP.REQ.URL.SET_TEXT_MODE(IGNORECASE).PATH_AND_QUERY.STRIP_START_CHARS("/adfs/services/trust/mex").HTTP_URL_SAFE"
add rewrite policy RWPOL_ADFS_PROXYMEX "is_ADFS_HOSTNAME && HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/services/trust/mex")" RWACT_ADFS_PROXYMEX
add rewrite policy RWPOL_ADFS_PROXY_HEADERS-NOACT TRUE NOREWRITE
add rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS http_req
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Proxy 100 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Forwarded_Client_IP 110 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Endpoint_Absolute_Path 120 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Target_Role 130 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_ADFS_Proxy_Client_IP 140 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Client_User_Agent 150 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_ADFS_PROXYMEX 160 NEXT
# Create ADFS Server and Service Group
add server LBSRV_ADFS wsadfs01.ctxdemos.com
add serviceGroup LBSVCGRP_ADFS_443 SSL -maxClient 0 -maxReq 0 -cip ENABLED X-MS-Forwarded-Client-IP -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP YES
bind ssl serviceGroup LBSVCGRP_ADFS_443 -cipherName CTXDEMO_BACKEND
set ssl serviceGroup LBSVCGRP_ADFS_443 -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED
bind serviceGroup LBSVCGRP_ADFS_443 LBSRV_ADFS 443
# Create ADFS Proxy NoAuth Load Balancing vServer
add lb vserver LBVS_ADFS_PROXY_NOAUTH SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180
set ssl vserver LBVS_ADFS_PROXY_NOAUTH -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver LBVS_ADFS_PROXY_NOAUTH -certkeyName CTXDEMOS-PUBLIC
bind ssl vserver LBVS_ADFS_PROXY_NOAUTH -cipherName CTXDEMO_BACKEND
bind lb vserver LBVS_ADFS_PROXY_NOAUTH LBSVCGRP_ADFS_443
bind lb vserver LBVS_ADFS_PROXY_NOAUTH -policyName RWPOL_ADFS_PROXY_HEADERS-NOACT -priority 100 -gotoPriorityExpression NEXT -type REQUEST -invoke policylabel RWPOLLBL_ADFS_PROXY_HEADERS
# Create ADFS Proxy NoAuth Content Switching Policy and Action
add cs action CSACT_ADFS_PROXY_NOAUTH -targetLBVserver LBVS_ADFS_PROXY_NOAUTH
add cs policy CSPOL_ADFS_PROXY_NOAUTH -rule is_ADFS_PROXY_NOAUTH -action CSACT_ADFS_PROXY_NOAUTH
# Create ADFS Proxy Active-Passive Load Balancing vServer
add lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180 -Authentication ON -authnProfile AAA_AUTH_PRF
set ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE LBSVCGRP_ADFS_443
bind ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -certkeyName CTXDEMOS-PUBLIC
bind ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -cipherName CTXDEMO_FRONTEND_APLUS
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName RWPOL_ADFS_PROXY_HEADERS-NOACT -priority 100 -gotoPriorityExpression NEXT -type REQUEST -invoke policylabel RWPOLLBL_ADFS_PROXY_HEADERS
# Create ADFS Proxy Active-Passive Content Switching Policy and Action
add cs action CSACT_ADFS_PROXY_ACTIVE_PASSIVE -targetLBVserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE
add cs policy CSPOL_ADFS_PROXY_ACTIVE_PASSIVE -rule is_ADFS_PROXY_ACTIVE_PASSIVE -action CSACT_ADFS_PROXY_ACTIVE_PASSIVE
# Bind Content Switching Policies to Citrix Gateway Content Switching vServer
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_ADFS_PROXY_NOAUTH -priority 100
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_ADFS_PROXY_ACTIVE_PASSIVE -priority 300
# Create Citrix ADC AAA Traffic Policies and Bind them to ADFS Proxy Active-Passive Load Balancing vServer
add tm formSSOAction AAATM_SSOPRF_ADFS_LOGIN -actionURL "/adfs/ls" -userField UserName -passwdField Password -ssoSuccessRule true -nameValuePair AuthMethod=FormsAuthentication -responsesize 15000 -submitMethod POST
add tm trafficAction AAATM_PRF_ADFS_LOGIN -appTimeout 1 -SSO ON -formSSOAction AAATM_SSOPRF_ADFS_LOGIN -persistentCookie OFF -InitiateLogout OFF -kcdAccount NONE -userExpression "HTTP.REQ.USER.ATTRIBUTE(3)" -passwdExpression "HTTP.REQ.USER.ATTRIBUTE(2)"
add tm trafficPolicy AAATM_POL_ADFS_LOGIN "HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/ls")" AAATM_PRF_ADFS_LOGIN
add tm trafficAction AAATM_PRF_ADFS_LOGOUT -appTimeout 1 -persistentCookie OFF -InitiateLogout ON -kcdAccount NONE
add tm trafficPolicy AAATM_POL_ADFS_LOGOUT "HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/ls") && HTTP.REQ.URL.QUERY.VALUE("wa").EQ("wsignout1.0")" AAATM_PRF_ADFS_LOGOUT
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName AAATM_POL_ADFS_LOGIN -priority 100 -gotoPriorityExpression END -type REQUEST
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName AAATM_POL_ADFS_LOGOUT -priority 110 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->
初期認証フローの設定
# Pattern Set - Gateway and AAA Hostname
add policy patset PATSET_GATEWAY_HOSTHEADER
bind policy patset PATSET_GATEWAY_HOSTHEADER access.ctxdemos.com -index 1 -charset ASCII
bind policy patset PATSET_GATEWAY_HOSTHEADER aaa.ctxdemos.com -index 2 -charset ASCII
# Policy Expression - Gateway and AAA Hostname
add policy expression is_GATEWAY_HOSTNAME "HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_GATEWAY_HOSTHEADER")"
# Create Initialization Load Balancing vServer
add lb vserver LBVS_SAML_SP_INITIALIZATION SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180 -Authentication ON -authnProfile AAA_AUTH_PRF
set ssl vserver LBVS_SAML_SP_INITIALIZATION -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind lb vserver LBVS_SAML_SP_INITIALIZATION LBSVC_ALWAYS_UP
bind ssl vserver LBVS_SAML_SP_INITIALIZATION -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver LBVS_SAML_SP_INITIALIZATION -cipherName CTXDEMOS_FRONTEND_APLUS
# Create Initialization Content Switching Policy and Action
add cs action CSACT_SAML_SP_INITIALIZATION -targetLBVserver LBVS_SAML_SP_INITIALIZATION
add cs policy CSPOL_SAML_SP_INITIALIZATION -rule "is_GATEWAY_HOSTNAME && HTTP.REQ.URL.PATH.TO_LOWER.STARTSWITH("/samltolb")" -action CSACT_SAML_SP_INITIALIZATION
# Bind Content Switching Policies to Citrix Gateway Content Switching vServer
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_SAML_SP_INITIALIZATION -priority 500
# Create Initialization Citrix ADC AAA Traffic Policy and Action and Bind it to Load Balancing vServer
add tm samlSSOProfile AAATM_SAMLSSOPRF_VPN_TO_LB -samlSigningCertName CTXDEMOS_PUBLIC_CERT -assertionConsumerServiceURL "https://access.ctxdemos.com/cgi/samlauth" -relaystateRule "HTTP.REQ.URL.QUERY.VALUE("RelayState")" -signatureAlg RSA-SHA256 -digestMethod SHA256 -Attribute1 Password -Attribute1Expr AAA.USER.PASSWD -Attribute2 Groups -Attribute2Expr AAA.USER.GROUPS -encryptAssertion ON -samlSPCertName CTXDEMOS_PUBLIC_CERT
add tm trafficAction AAATM_PRF_VPN_TO_LB -SSO ON -persistentCookie OFF -InitiateLogout OFF -kcdAccount NONE -samlSSOProfile AAATM_SAMLSSOPRF_VPN_TO_LB
add tm trafficPolicy AAATM_POL_VPN_TO_LB "HTTP.REQ.URL.STARTSWITH("/samltolb")" AAATM_PRF_VPN_TO_LB
bind lb vserver LBVS_SAML_SP_INITIALIZATION -policyName AAATM_POL_VPN_TO_LB -priority 100 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->
暗号グループ
# Create Cipher Group for Backend vServers
add ssl cipher CTXDEMOS_BACKEND
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 4
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 5
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 6
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 7
# Create Cipher Group for Frondend vServers
add ssl cipher CTXDEMOS_FRONTEND
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 4
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 5
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-SHA256 -cipherPriority 6
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-SHA384 -cipherPriority 7
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-ECDSA-AES128-SHA -cipherPriority 8
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-ECDSA-AES256-SHA -cipherPriority 9
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 10
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 11
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES-128-SHA256 -cipherPriority 12
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES-256-SHA384 -cipherPriority 13
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-RSA-AES128-SHA -cipherPriority 15
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-RSA-AES256-SHA -cipherPriority 16
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-DHE-RSA-AES128-GCM-SHA256 -cipherPriority 17
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-DHE-RSA-AES256-GCM-SHA384 -cipherPriority 18
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-DHE-RSA-AES-128-CBC-SHA -cipherPriority 19
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-DHE-RSA-AES-256-CBC-SHA -cipherPriority 20
# Create Cipher Group for Frondend vServers - A+
add ssl cipher CTXDEMOS_FRONTEND_APLUS
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 4
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 5
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-CHACHA20-POLY1305 -cipherPriority 6
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES256-SHA384 -cipherPriority 7
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES128-SHA256 -cipherPriority 8
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 9
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 13
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-CHACHA20-POLY1305 -cipherPriority 14
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES-256-SHA384 -cipherPriority 15
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES-128-SHA256 -cipherPriority 16
<!--NeedCopy-->
ログインスキーマ XML ファイル
CTXDEMOS_USER_NAME_PASS.XML
<?xml version="1.0" encoding="utf-8"?>
<AuthenticateResponse xmlns="http://citrix.com/authentication/response/1">
<Status>success</Status>
<Result>more-info</Result>
<StateContext/>
<AuthenticationRequirements>
<PostBack>/nf/auth/doAuthentication.do</PostBack>
<CancelPostBack>/Citrix/Authentication/ExplicitForms/CancelAuthenticate</CancelPostBack>
<CancelButtonText>Cancel</CancelButtonText>
<Requirements>
<Requirement>
<Credential>
<ID>login</ID>
<SaveID>ExplicitForms-Username</SaveID>
<Type>username</Type>
</Credential>
<Label>
<Text>User name</Text>
<Type>plain</Type>
</Label>
<Input>
<AssistiveText>Please supply username</AssistiveText>
<Text>
<Secret>false</Secret>
<ReadOnly>false</ReadOnly>
<InitialValue>${AAA.USER.NAME}</InitialValue>
<Constraint>.+</Constraint>
</Text>
</Input>
</Requirement>
<Requirement>
<Credential>
<ID>passwd</ID>
<SaveID>ExplicitForms-Password</SaveID>
<Type>password</Type>
</Credential>
<Label>
<Text>Password:</Text>
<Type>plain</Type>
</Label>
<Input>
<Text>
<Secret>true</Secret>
<ReadOnly>false</ReadOnly>
<InitialValue/>
<Constraint>.+</Constraint>
</Text>
</Input>
</Requirement>
<Requirement>
<Credential>
<ID>saveCredentials</ID>
<Type>savecredentials</Type>
</Credential>
<Label>
<Text>Remember my password</Text>
<Type>plain</Type>
</Label>
<Input>
<CheckBox>
<InitialValue>false</InitialValue>
</CheckBox>
</Input>
</Requirement>
<Requirement>
<Credential>
<ID>loginBtn</ID>
<Type>none</Type>
</Credential>
<Label>
<Type>none</Type>
</Label>
<Input>
<Button>Log On</Button>
</Input>
</Requirement>
</Requirements>
</AuthenticationRequirements>
</AuthenticateResponse>
<!--NeedCopy-->
CTXDEMOS_USER_NAME_ONLY.XML
<?xml version="1.0" encoding="utf-8"?>
<AuthenticateResponse xmlns="http://citrix.com/authentication/response/1">
<Status>success</Status>
<Result>more-info</Result>
<StateContext/>
<AuthenticationRequirements>
<PostBack>/nf/auth/doAuthentication.do</PostBack>
<CancelPostBack>/Citrix/Authentication/ExplicitForms/CancelAuthenticate</CancelPostBack>
<CancelButtonText>Cancel</CancelButtonText>
<Requirements>
<Requirement>
<Credential>
<ID>login</ID>
<SaveID>ExplicitForms-Username</SaveID>
<Type>username</Type>
</Credential>
<Label>
<Text>User name</Text>
<Type>plain</Type>
</Label>
<Input>
<AssistiveText>Please supply username</AssistiveText>
<Text>
<Secret>false</Secret>
<ReadOnly>false</ReadOnly>
<InitialValue/>
<Constraint>.+</Constraint>
</Text>
</Input>
</Requirement>
<Requirement>
<Credential>
<Type>none</Type>
</Credential>
<Label>
<Text> Please submit credentials to continue Login ...</Text>
<Type>confirmation</Type>
</Label>
<Input/>
</Requirement>
<Requirement>
<Credential>
<ID>saveCredentials</ID>
<Type>savecredentials</Type>
</Credential>
<Label>
<Text>Remember my password</Text>
<Type>plain</Type>
</Label>
<Input>
<CheckBox>
<InitialValue>false</InitialValue>
</CheckBox>
</Input>
</Requirement>
<Requirement>
<Credential>
<ID>loginBtn</ID>
<Type>none</Type>
</Credential>
<Label>
<Type>none</Type>
</Label>
<Input>
<Button>Log On</Button>
</Input>
</Requirement>
</Requirements>
</AuthenticationRequirements>
</AuthenticateResponse>
<!--NeedCopy-->
参照ドキュメント
Authentication to NetScaler using AD FS 4.0 on Server 2016, Citrix FAS, and Azure MFA in Azure Cloud. (2018). Retrieved from https://www.jgspiers.com/authentication-to-netscaler-using-ad-fs-4-0-server-2016-citrix-fas-azure-mfa-azure-cloud/
Configure Azure MFA as authentication provider with AD FS. (2019). Retrieved from https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-ad-fs-and-azure-mfa
Deploying a Federation Server Farm. (2017). Retrieved from https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/deployment/deploying-a-federation-server-farm
Federated Authentication Service ADFS deployment. (2018). Retrieved from https://docs.citrix.com/en-us/citrix-virtual-apps-desktops/secure/federated-authentication-service/fas-architectures/fas-adfs.html
Guide to deploying NetScaler as an Active Directory Federation Services Proxy. (n.d.). Retrieved from https://www.citrix.com/content/dam/citrix/en_us/documents/products-solutions/guide-to-deploying-netscaler-as-an-active-directory-federation-services-proxy.pdf
How it works: Azure Multi-Factor Authentication. (2018). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-mfa-howitworks
Planning a cloud-based Azure Multi-Factor Authentication deployment. (2019). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/authentication/howto-mfa-getstarted
Tijl Van den Broeck. (Dec 7, 2017). ADFS v3 on Windows Server 2012 R2 with NetScaler. Retrieved from https://www.citrix.com/blogs/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/
Transition to hybrid cloud and SaaS with Citrix Gateway. (n.d.). Retrieved from https://www.citrix.com/products/citrix-gateway/resources/netscaler-unified-gateway.html
User sign-in with Azure Active Directory Pass-through Authentication. (2018). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta
Written by Saman Salehian, Lead Networking Sales Engineer.