【Fortigate】SSL-VPNリモート接続(SAML シングルサインオン)FortiOS6.4.5

FortiGate の SSL-VPN では、ユーザー認証に SAML を使えます。この記事では、IdP に Azure Active Directory(現在の Microsoft Entra ID)を使い、Entra ID のユーザーでシングルサインオンして SSL-VPN(Web モード)に接続できることを確かめます。最後に、ブラウザの拡張機能で SAML のやり取りの中身も見ていきます。

この記事でわかること
  1. Entra ID でユーザー・グループ・エンタープライズアプリケーション(FortiGate SSL VPN)を設定する
  2. FortiGate に IdP を登録し、Entra ID のグループで SSL-VPN の接続を許可する
  3. AuthnRequest・Response・ログアウトの SAML メッセージで、何がやり取りされているかを確かめる

検証構成

IdP は Entra ID(テナントは xxxx.onmicrosoft.com)、SP は FortiGate です。PC のブラウザから FortiGate に SSL-VPN で接続し、Web モードのブックマークから LAN 側の Windows サーバ 10.0.1.167 に RDP で入ります。

Entra ID ではユーザーとグループを作ります。FortiGate では、Entra ID のグループに入っているユーザーにだけ SSL-VPN の接続を許可するポリシーを作ります。

SAML 認証(サインイン)SSL-VPN(Web モード)RDPEntra IDIdPxxxx.onmicrosoft.comPCWeb ブラウザFortiGate(SP)port1port2グローバル IP(伏せています)Win10.0.1.167
図1 検証構成
項目今回の値
FortiGateFortiOS 6.4.5。port1 で SSL-VPN を受け、port2 が LAN 側
FortiGate の FQDN今回は FQDN の代わりにグローバル IP アドレスを使用(アドレスは伏せています)
IdPAzure Active Directory(現在の Microsoft Entra ID)
ユーザー・グループ検証用ユーザー(名前は伏せています)を、グループ ssl-vpn-group に入れる
接続先Windows サーバ 10.0.1.167(RDP)

SAML では、FortiGate と Entra ID が直接通信するのではなく、PC のブラウザがメッセージを運びます。この記事で作る構成のやり取りは次のとおりです。

PC(ブラウザ)FortiGate(SP)Entra ID(IdP)1https://(FortiGate)/ にアクセス2AuthnRequest を付けて IdP へリダイレクト3AuthnRequest を IdP へ渡す4ユーザーがサインイン(ID・パスワード)5SAML Response(username・group)6応答 URL(/remote/saml/login)へ POST7group を照合して SSL-VPN ポータルを表示
図2 SAML 認証の流れ(SP 起点)

FortiGate の管理アクセスのポート番号を変える

今回は、Web 管理画面にアクセスするインタフェースと、SSL-VPN の接続を受けるインタフェースを同じにします。どちらも既定のポート番号が 443 で重なるため、管理アクセスの HTTPS ポートを 10443 に変えます。システム ›› 設定 の「管理者設定」で設定します。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。Entra ID の画面は、検証した 2021年7月時点の Azure portal(Azure Active Directory)のものです。

FortiGate 管理画面画面イメージ
システム ›› 設定
管理者設定
HTTPポート80
HTTPSへリダイレクトオン
1HTTPSポート10443
HTTPSサーバ証明書self-sign
SSHポート22
図3 管理アクセスの HTTPS ポートの変更(実際の画面ではなく、設定項目のポイントを示したイメージです)

変更したら、https://<インタフェースのアドレス>:10443 で管理画面にログインできることを確かめます。

IdP(Entra ID)の設定

Entra ID では、ユーザー、グループ、エンタープライズアプリケーションを設定します。検証時は Azure portal の Azure Active Directory から操作しました。

ユーザーとグループを作る

グループ ssl-vpn-group を作り、検証用ユーザーを所属させます。まず Azure Active Directory ›› ユーザー ›› 新しいユーザー でユーザーを作ります。

Azure portal(Azure Active Directory)画面イメージ
ホーム ›› 既定のディレクトリ ›› ユーザー ›› 新しいユーザー
種類◉ ユーザーの作成○ ユーザーの招待
ID
1ユーザー名(伏せています) @ (伏せています).onmicrosoft.com
名前(伏せています)
名・姓 
パスワード
 ○ パスワードの自動生成◉ 自分でパスワードを作成する
2初期パスワード●●●●●●●●
3作成
図4 ユーザーの作成(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1ユーザー名・名前検証用ユーザーの名前。ユーザー名は 名前@テナントのドメイン の形(UPN)になる
2初期パスワード自分で決めたパスワード。初回サインイン時に変更を求められる
3作成ユーザーが一覧に追加される

次に Azure Active Directory ›› グループ ›› 新しいグループ でグループを作ります。

Azure portal(Azure Active Directory)画面イメージ
ホーム ›› 既定のディレクトリ ›› グループ ›› 新しいグループ
グループの種類セキュリティ
1グループ名ssl-vpn-group
グループの説明 
メンバーシップの種類割り当て済み
メンバーメンバーが選択されていません
2作成
図5 グループの作成(実際の画面ではなく、設定項目のポイントを示したイメージです)

作成したグループは一覧に表示されます。Entra ID の SAML トークンでは、グループの情報はグループ名ではなくオブジェクト ID で返ります。FortiGate の設定で使うので、オブジェクト ID をコピーして控えておきます。

Azure portal(Azure Active Directory)画面イメージ
ホーム ›› 既定のディレクトリ ›› グループ
名前オブジェクト ID
ssl-vpn-group1(伏せています)
図6 グループのオブジェクト ID(実際の画面ではなく、表示のポイントを示したイメージです)

オブジェクト ID は xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx の形の GUID です。続けて、グループにユーザーを入れます。グループ名をクリックし、メンバー ›› メンバーの追加 で検証用ユーザーを選んで 選択 をクリックします。

Azure portal(Azure Active Directory)画面イメージ
ホーム ›› 既定のディレクトリ ›› グループ ›› ssl-vpn-group ›› メンバー
名前種類
1(伏せています)ユーザー
図7 グループのメンバー(実際の画面ではなく、表示のポイントを示したイメージです)

エンタープライズアプリケーションを追加する

Entra ID に、SP として FortiGate を登録します。ギャラリーに FortiGate 用のアプリケーションが用意されているので、それを使います。Azure Active Directory ›› エンタープライズ アプリケーション ›› 新しいアプリケーション で Fortigate と検索し、FortiGate SSL VPN を選んで 作成 をクリックします。

Azure portal(Azure Active Directory)画面イメージ
ホーム ›› 既定のディレクトリ ›› エンタープライズ アプリケーション
名前ホームページ URL
1FortiGate SSL VPNhttps://www.fortinet.com/
図8 追加したアプリケーション(実際の画面ではなく、表示のポイントを示したイメージです)

アプリケーション名をクリックし、シングル サインオン で SAML を選びます。ここからは、SAML の設定画面の各項目を順に設定します。

基本的な SAML 構成を設定する

基本的な SAML 構成 の 編集 をクリックし、FortiGate 側の URL を設定します。[FQDN] は FortiGate の FQDN(今回はグローバル IP アドレス)です。SSL-VPN のポートを 443 以外にしている場合は、[FQDN]:ポート番号 にします。

項目設定する URL
識別子(エンティティ ID)https://[FQDN]/remote/saml/metadata
応答 URLhttps://[FQDN]/remote/saml/login
サインオン URLhttps://[FQDN]/remote/login(今回の入力値)
ログアウト URLhttps://[FQDN]/remote/saml/logout
Azure portal(Azure Active Directory)画面イメージ
FortiGate SSL VPN ›› SAML によるシングル サインオンのセットアップ ›› 基本的な SAML 構成
1識別子(エンティティ ID)https://(伏せています)/remote/saml/metadata ☑ 既定
2応答 URL(Assertion Consumer Service URL)https://(伏せています)/remote/saml/login ☑ 既定
3サインオン URLhttps://(伏せています)/remote/login
パターン: https://<FORTIGATE-FQDN>/remote/saml/login
リレー状態 
4ログアウト URLhttps://(伏せています)/remote/saml/logout
5保存
図9 基本的な SAML 構成(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目役割
1識別子SP(FortiGate)を識別する名前。FortiGate の entity-id と同じ値にする
2応答 URLEntra ID が SAML Response を送る先(ACS)。FortiGate の single-sign-on-url と同じ値にする
3サインオン URLマイ アプリなど Entra ID 側からアプリを開いたときに、ユーザーを送る FortiGate の URL。FortiGate の設定では使わない
4ログアウト URLログアウトの応答を送る先。FortiGate の single-logout-url と同じ値にする
5保存設定を保存する
サインオン URL について

画面のパターンや Microsoft のチュートリアルでは、サインオン URL は https://<FortiGate の FQDN>/remote/saml/login の形です。サインオン URL は Entra ID 側(マイ アプリや「テスト」)からサインインを始めるときに使う値で、この記事のようにブラウザで FortiGate に直接アクセスする場合は使われません。マイ アプリから起動させたい場合は、パターンどおりの値にしておきます。

ユーザー属性とクレームを設定する

FortiGate は、SAML Response の中の username と group という名前の属性から、ユーザー名と所属グループを読み取ります。Entra ID 側で、この名前の属性(クレーム)を送るようにします。ユーザー属性とクレーム の 編集 をクリックします。

ギャラリーのアプリケーションには、最初から値が user.groups [SecurityGroup] のグループ クレームがあります。これをクリックし、詳細オプションで名前を group にして保存します。

Azure portal(Azure Active Directory)画面イメージ
FortiGate SSL VPN ›› ユーザー属性とクレーム ›› グループ クレーム
返すグループ○ なし○ すべてのグループ◉ セキュリティ グループ
○ ディレクトリ ロール○ アプリケーションに割り当てられているグループ
ソース属性グループ ID
詳細オプション
グループ要求の名前をカスタマイズする☑
1名前(必須)group
名前空間(省略可能) 
グループをロール要求として生成する☐
2保存
図10 グループ クレームの名前を group にする(実際の画面ではなく、設定項目のポイントを示したイメージです)

ソース属性が グループ ID なので、グループはオブジェクト ID で送られます。次に、値が user.userprincipalname の行(クレーム名 …/claims/name)をクリックし、名前を username に変えます。名前空間の値は消してから保存します。

Azure portal(Azure Active Directory)画面イメージ
FortiGate SSL VPN ›› ユーザー属性とクレーム ›› 要求の管理
1名前username
2名前空間名前空間の URI を入力してください
ソース◉ 属性○ 変換
ソース属性user.userprincipalname
3保存変更の破棄
図11 username クレームの設定(実際の画面ではなく、設定項目のポイントを示したイメージです)

username と group ができていることを確かめます。ほかの属性は使わないので、残しても削除してもかまいません。

Azure portal(Azure Active Directory)画面イメージ
FortiGate SSL VPN ›› ユーザー属性とクレーム
必要な要求
クレーム名値
一意のユーザー識別子(名前 ID)user.userprincipalname [nameid-for…
追加の要求
クレーム名値
1groupuser.groups
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddressuser.mail
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givennameuser.givenname
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surnameuser.surname
2usernameuser.userprincipalname
図12 設定後のユーザー属性とクレーム(実際の画面ではなく、表示のポイントを示したイメージです)

クレーム名は大文字と小文字を区別します。FortiGate に設定する user-name・group-name と同じ綴りにします。

証明書と FortiGate 用の URL を控える

IdP(Entra ID)と SP(FortiGate)の間の信頼関係には、Entra ID の SAML 署名証明書を使います。FortiGate は、この証明書で SAML Response の署名を確かめます。SAML 署名証明書 の 証明書 (Base64) をダウンロードします。

あわせて、FortiGate SSL VPN のセットアップ にある3つの URL をコピーして控えます。

Azure portal(Azure Active Directory)画面イメージ
FortiGate SSL VPN ›› SAML によるシングル サインオンのセットアップ
③ SAML 署名証明書
状態アクティブ
有効期限2024/7/3 17:03:17
1証明書 (Base64)ダウンロード
証明書 (未加工)ダウンロード
フェデレーション メタデータ XMLダウンロード
④ FortiGate SSL VPN のセットアップ
2ログイン URLhttps://login.microsoftonline.com/(伏せています)/saml2
Azure AD 識別子https://sts.windows.net/(伏せています)/
ログアウト URLhttps://login.microsoftonline.com/(伏せています)/saml2
図13 証明書のダウンロードと IdP の URL(実際の画面ではなく、表示のポイントを示したイメージです)
No.項目使い道
1証明書 (Base64)FortiGate にリモート証明書としてインポートし、idp-cert に指定する
2ログイン URL・Azure AD 識別子・ログアウト URLFortiGate の idp-single-sign-on-url・idp-entity-id・idp-single-logout-url に設定する。URL の途中の値はテナント ID

署名証明書には有効期限があります(今回は作成から3年)。期限が切れる前に Entra ID で新しい証明書を作り、FortiGate の証明書も入れ替える必要があります。

アプリケーションにユーザーを割り当てる

FortiGate SSL VPN アプリケーションを使えるユーザーを登録します。ユーザーとグループ ›› ユーザーまたはグループの追加 をクリックし、ユーザー の「選択されていません」から検証用ユーザーを選びます。

Azure portal(Azure Active Directory)画面イメージ
エンタープライズ アプリケーション ›› FortiGate SSL VPN ›› 割り当ての追加
1▲ お客様の Active Directory プラン レベルでは、グループを割り当てることができません。個々のユーザーをアプリケーションに割り当てることはできます。
2ユーザー1 人のユーザーが選択されました。
ロールDefault Access
3割り当て
図14 アプリケーションへのユーザーの割り当て(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.表示・項目意味・設定内容
1オレンジの警告グループ単位の割り当てには Entra ID P1 または P2 が必要。今回のテナントでは使えないため、ユーザーを個別に割り当てる
2ユーザー検証用ユーザーを選ぶ
3割り当て割り当てを実行する
Azure portal(Azure Active Directory)画面イメージ
エンタープライズ アプリケーション ›› FortiGate SSL VPN ›› ユーザーとグループ
表示名オブジェクトの種類割り当てられたロール
1(伏せています)ユーザーDefault Access
図15 割り当て後のユーザーとグループ(実際の画面ではなく、表示のポイントを示したイメージです)

アプリケーションに割り当てたユーザーがサインインできます。どのユーザーに SSL-VPN を許可するかは、次の FortiGate の設定で、SAML Response の group(グループのオブジェクト ID)を見て決めます。

SP(FortiGate)の設定

証明書をインポートする

システム ›› 証明書 の インポート ›› リモート で、ダウンロードした Base64 の証明書をアップロードします。既定では REMOTE_Cert_1 という名前で登録されます。

FortiGate 管理画面画面イメージ
システム ›› 証明書
名前サブジェクト
リモート(1)
1REMOTE_Cert_1CN = Microsoft Azure Federated SSO Certificate
リモート CA 証明書(4)
Fortinet_CAC = US, ST = California, L = Sunnyvale, O = Fortinet, …
図16 インポートした Entra ID の署名証明書(実際の画面ではなく、表示のポイントを示したイメージです)

IdP を登録する

IdP の情報は CLI の config user saml で設定します。書式は次のとおりです(CLI Reference config user saml)。

書式

config user saml
 edit azure-idp
  set entity-id [SP 識別子]
  set single-sign-on-url [SP 応答URL]
  set single-logout-url [SP ログアウトURL]
  set idp-single-sign-on-url [IdP ログインURL]
  set idp-entity-id [IdP AzureAD識別子]
  set idp-single-logout-url [IdP ログアウトURL]
  set idp-cert [Base64 SAML 証明書名]
  set user-name username
  set group-name group
end

今回の値を入れると次のとおりです。SP の3つの URL は STEP 3 の値、IdP の3つの URL は STEP 5 で控えた値、証明書は STEP 7 の名前です。

fortigate

fortigate # config user saml
fortigate (saml) # edit azure-idp
new entry 'azure-idp' added
fortigate (azure-idp) # set entity-id https://(伏せています)/remote/saml/metadata 
fortigate (azure-idp) # set single-sign-on-url https://(伏せています)/remote/saml/login
fortigate (azure-idp) # set single-logout-url https://(伏せています)/remote/saml/logout
fortigate (azure-idp) # set idp-single-sign-on-url https://login.microsoftonline.com/(伏せています)/saml2
fortigate (azure-idp) # set idp-entity-id https://sts.windows.net/(伏せています)/
fortigate (azure-idp) # set idp-single-logout-url https://login.microsoftonline.com/(伏せています)/saml2
fortigate (azure-idp) # set idp-cert REMOTE_Cert_1
fortigate (azure-idp) # set user-name username
fortigate (azure-idp) # set group-name group
fortigate (azure-idp) # end
FortiGate の設定Entra ID 側の対応する値
entity-id基本的な SAML 構成の「識別子(エンティティ ID)」
single-sign-on-url基本的な SAML 構成の「応答 URL」
single-logout-url基本的な SAML 構成の「ログアウト URL」
idp-entity-idFortiGate SSL VPN のセットアップの「Azure AD 識別子」
idp-single-sign-on-urlFortiGate SSL VPN のセットアップの「ログイン URL」
idp-single-logout-urlFortiGate SSL VPN のセットアップの「ログアウト URL」
idp-certインポートした証明書の名前(REMOTE_Cert_1)
user-nameユーザー名を入れたクレームの名前(username)
group-nameグループを入れたクレームの名前(group)

SSL-VPN 用のユーザーグループを作る

SSL-VPN に接続できるグループを FortiGate に作ります(CLI Reference config user group)。メンバーに STEP 8 の IdP(azure-idp)を入れ、config match で、SAML Response の group の値と照合します。

fortigate

fortigate # config user group
fortigate (group) # edit ssl-vpn-group
new entry 'ssl-vpn-group' added
fortigate (ssl-vpn-group) # set member azure-idp
fortigate (ssl-vpn-group) # config match
fortigate (match) # edit 1
new entry '1' added
fortigate (1) # set server-name azure-idp 
fortigate (1) # set group-name (伏せています)
fortigate (1) # next
fortigate (match) # end
fortigate (ssl-vpn-group) # next
fortigate (group) # end

group-name には、STEP 1 で控えたグループのオブジェクト ID を設定します。Entra ID の SAML トークンでは、グループはグループ名ではなくオブジェクト ID で返るためです(SAML トークン要求のリファレンス)。

SSL-VPN を有効にする

VPN ›› SSL-VPN設定 で、SSL-VPN の接続を受ける設定をします。

FortiGate 管理画面画面イメージ
VPN ›› SSL-VPN設定
接続設定
1リッスンするインターフェースUntrust (port1)
2リッスンするポート443
Webモードアクセスをリッスンするポート: https://10.0.0.196:443
HTTPをSSL-VPNにリダイレクトするオフ
アクセスを制限◉ 任意のホストからアクセス許可○ 特定ホストへアクセス制限
アイドル ログアウト(非アクティブ)オン 300 秒
サーバ証明書self-sign
図17 SSL-VPN の接続設定(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1リッスンするインターフェースインターネット側の port1
2リッスンするポート443。管理アクセスを 10443 に移したので重ならない

サーバ証明書は検証のため自己署名(self-sign)のままにしています。この場合、ブラウザに証明書の警告が出ます。本番では、FQDN に合った証明書を設定します。

SSL-VPN ポータルを設定する

VPN ›› SSL-VPNポータル でポータル画面を設定します。今回は full-access を使います。ポータルは、SSL-VPN 設定の「認証/ポータルマッピング」でユーザーグループごとに割り当てます。

FortiGate 管理画面画面イメージ
VPN ›› SSL-VPNポータル
名前トンネルモードWebモード
1full-access 有効化済み 有効化済み
tunnel-access 有効化済み 無効化済み
web-access 無効化済み 有効化済み
図18 SSL-VPN ポータルの一覧(実際の画面ではなく、表示のポイントを示したイメージです)

緑のアイコンはそのモードが有効、赤のアイコンは無効であることを表します。full-access はトンネルモードと Web モードの両方が有効です。full-access を編集し、Web モードで 10.0.1.167 に RDP で接続するブックマークを作っておきます。

FortiGate 管理画面画面イメージ
VPN ›› SSL-VPNポータル ›› full-access の編集
Webモード有効
ポータルメッセージSSL-VPN Portal
テーマ青
ユーザブックマークオン
1Predefined Bookmarks
名前タイプロケーション
10.0.1.167RDP10.0.1.167
図19 RDP のブックマーク(実際の画面ではなく、設定項目のポイントを示したイメージです)

SSL-VPN 用のポリシーを作る

ポリシー&オブジェクト ›› ファイアウォールポリシー で、SSL-VPN 用のポリシーを作ります。

FortiGate 管理画面画面イメージ
ポリシー&オブジェクト ›› ファイアウォールポリシー ›› 新規ポリシー
1名前SAML-SSL-VPN
2着信インターフェースSSL-VPNトンネルインターフェース
3発信インターフェースport2
4送信元SSLVPN_TUNNEL_ADDR1
ssl-vpn-group
宛先all
スケジュールalways
サービスALL
アクション◉ ACCEPT○ DENY
インスペクションモード◉ フローベース○ プロキシベース
NATオン(発信インターフェースのアドレスを使用)
⋮ (中略)
許可トラフィックをログすべてのセッション
図20 SSL-VPN 用のポリシー(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1名前任意。今回は SAML-SSL-VPN
2着信インターフェースSSL-VPN トンネルインターフェース(ssl.root)
3発信インターフェースLAN 側の port2
4送信元プールアドレスの SSLVPN_TUNNEL_ADDR1 と、接続を許可するユーザーグループ ssl-vpn-group

送信元にユーザーグループを入れることで、ssl-vpn-group(Entra ID の ssl-vpn-group に入っているユーザー)だけがこのポリシーを使えます。

動作確認

PC のブラウザで https://(FortiGate のグローバル IP)/ にアクセスします。FortiGate のログイン画面ではなく、自動的に Microsoft のサインイン画面が表示されます。検証用ユーザーを選び、パスワードを入力してサインインします。

サインインすると、自動的に SSL-VPN ポータルが表示されます。

SSL-VPN ポータル(ブラウザ)画面イメージ
00:00:38 0 B ↓ 0 B ↑
SSL-VPN Portal
FortiClientを起動FortiClientをダウンロード ▾
ブックマーク
110.0.1.167
クイック接続+ 新規ブックマーク
図21 SAML 認証後の SSL-VPN ポータル(実際の画面ではなく、表示のポイントを示したイメージです)

10.0.1.167 のブックマークをクリックすると、ブラウザのタブの中で RDP の画面が開きます。

クライアントのブラウザ画面イメージ
https://(伏せています)/
SSL-VPN Portal1つ目のタブ
https://(伏せています)/
RDP: 10.0.1.1672つ目のタブ。Windows のデスクトップと「リモートデスクトップツール」(クリップボード、Ctrl-Alt-Delete の送信)が表示される
図22 ブラウザ経由の RDP 接続(実際の画面ではなく、表示結果のイメージです)

ログ&レポート ›› 転送トラフィック で通信のログを見ると、送信元に Entra ID のユーザー名(UPN)が表示されます。

FortiGate 管理画面画面イメージ
ログ&レポート ›› 転送トラフィック
送信元宛先結果ポリシー
1(伏せています)
ユーザー名(UPN)と接続元 IP アドレス
10.0.1.167✔ 4.08 kB / 156.17 kB2SAML-SSL-VPN (2)
図23 転送トラフィックのログ(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1送信元SAML の username で受け取ったユーザー名と、接続元の IP アドレス
2ポリシーSTEP 12 で作った SAML-SSL-VPN で許可された。結果の緑のチェックは、通信が許可されたことを表す

SAML のやり取りを確認する

一連の流れを、ブラウザの拡張機能(SAML-tracer)で見ていきます。以下の SAML メッセージは、どれも一部を抜き出したものです。

AuthnRequest(FortiGate → Entra ID)

PC から FortiGate にアクセスすると、FortiGate は認証要求の AuthnRequest を作り、ブラウザを Entra ID へリダイレクトします(図2 の 2・3)。

SAML-tracer:AuthnRequest

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                    ID="_5E389B38030F4058D17F8C36FD4051EA"
                    Version="2.0"
                    IssueInstant="2021-07-03T10:01:22Z"
                    Destination="https://login.microsoftonline.com/(伏せています)/saml2"
                    ForceAuthn="false"
                    IsPassive="false"
                    >
    <saml:Issuer>https://(伏せています)/remote/saml/metadata</saml:Issuer>
    <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
                        AllowCreate="true"
                        />
</samlp:AuthnRequest>
表示意味
IDこの要求の識別子。Entra ID は、応答の InResponseTo にこの値を入れて返す
Destination送り先。FortiGate の idp-single-sign-on-url(Entra ID のログイン URL)
Issuer要求を出した SP。FortiGate の entity-id で、Entra ID の「識別子」と一致する必要がある
ForceAuthn=”false”Entra ID にサインイン済みのセッションがあれば、再認証を求めない

Response(Entra ID → FortiGate)

Entra ID でサインインすると、Entra ID は SAML Response を返し、ブラウザが FortiGate の応答 URL へ POST します(図2 の 5・6)。Response の中に、username と group の属性が入っています。

SAML-tracer:Response

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                ID="_6d371c2d-9883-43ec-ac8d-736fd836430c"
                Version="2.0"
                IssueInstant="2021-07-03T10:07:32.284Z"
                Destination="https://(伏せています)/remote/saml/login"
                InResponseTo="_1ED7E90C7FE3A9B86B5A97F9C3DA0E85"
                >
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/(伏せています)/</Issuer>
    <Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion"
               ID="_1f689ba9-4dfa-4bfa-85c1-b07c12bcf200"
               IssueInstant="2021-07-03T10:07:32.284Z"
               Version="2.0"
               >
      
        <Subject>
            <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">(伏せています)</NameID>
            <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
                <SubjectConfirmationData InResponseTo="_1ED7E90C7FE3A9B86B5A97F9C3DA0E85"
                                         NotOnOrAfter="2021-07-03T11:07:32.206Z"
                                         Recipient="https://(伏せています)/remote/saml/login"
                                         />
            </SubjectConfirmation>
        </Subject>

        <AttributeStatement>
            <Attribute Name="group">
                <AttributeValue>(伏せています)</AttributeValue>
            </Attribute>
            <Attribute Name="username">
                <AttributeValue>(伏せています)</AttributeValue>
            </Attribute>
        </AttributeStatement>
       
    </Assertion>
</samlp:Response>
表示意味
Destination応答の送り先。FortiGate の応答 URL(/remote/saml/login)
InResponseToこの応答のもとになった AuthnRequest の ID。上の AuthnRequest(10:01)と、この Response(10:07)は別の試行で取ったものなので、値は一致していない
Issuerhttps://sts.windows.net/<テナント ID>/。FortiGate の idp-entity-id と一致する
NotOnOrAfterこのアサーションを使える期限
Attribute Name=”group”所属グループのオブジェクト ID。FortiGate はこれをユーザーグループの config match の値と照合する
Attribute Name=”username”ユーザー名(UPN)。FortiGate のログに表示される

実際の Response には、Entra ID の署名も入っています。FortiGate は、インポートした証明書(idp-cert)で署名を確かめてから、属性を使います。

ログアウト

SSL-VPN ポータルからログアウトすると、FortiGate が SAML のログアウト要求を作り、ブラウザ経由で Entra ID へ送ります。

SAML-tracer:LogoutRequest

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                     xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                     ID="_3CD73597D7EB74354AE6F65983F9AB73"
                     Version="2.0"
                     IssueInstant="2021-07-03T10:18:08Z"
                     Destination="https://login.microsoftonline.com/(伏せています)/saml2"
                     >
    <saml:Issuer>https://(伏せています)/remote/saml/metadata</saml:Issuer>
    <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">(伏せています)</saml:NameID>
    <samlp:SessionIndex>_0fb44fed-4399-4843-b17b-3a27a70ad900</samlp:SessionIndex>
</samlp:LogoutRequest>

Entra ID 側でログアウトの処理が終わると、応答が FortiGate のログアウト URL へ返ります。InResponseTo がログアウト要求の ID と一致し、StatusCode が Success になっています。

SAML-tracer:LogoutResponse

<samlp:LogoutResponse xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                      ID="_469d51af-957c-4862-90ea-33afdb9e8db5"
                      Version="2.0"
                      IssueInstant="2021-07-03T10:19:58.542Z"
                      Destination="https://(伏せています)/remote/saml/logout"
                      InResponseTo="_3CD73597D7EB74354AE6F65983F9AB73"
                      >
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/(伏せています)/</Issuer>
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
    </samlp:Status>
</samlp:LogoutResponse>

うまくいかないとき

状態よくある原因確認すること
Microsoft のサインイン画面でエラーになるAuthnRequest の Issuer と Entra ID の「識別子」が一致していない、ユーザーがアプリケーションに割り当てられていないFortiGate の entity-id と「識別子」、STEP 6 の割り当て
サインイン後に FortiGate で認証に失敗するidp-cert の証明書が違う・期限切れ、idp-entity-id が Response の Issuer と違うインポートした証明書と Entra ID の署名証明書、SAML-tracer の Issuer
認証はできるが SSL-VPN に入れないgroup の値がユーザーグループの config match と一致しない、クレーム名の大文字小文字が違うSAML-tracer の Attribute Name="group" の値と group-name、username・group の綴り
管理画面に入れなくなった管理アクセスの HTTPS ポートを変えたhttps://<アドレス>:10443 でアクセスする

まとめ

Entra ID を IdP、FortiGate を SP にして、Entra ID のユーザーで SSL-VPN にシングルサインオンできることを確かめました。FortiGate は SAML Response の group(グループのオブジェクト ID)を見て、接続を許可するかを決めます。設定した値をまとめます。

設定今回の値
管理アクセスHTTPS ポートを 10443 に変更
Entra ID:ユーザー・グループ検証用ユーザーを ssl-vpn-group(セキュリティ グループ)に追加
Entra ID:アプリケーションギャラリーの FortiGate SSL VPN。識別子・応答 URL・サインオン URL・ログアウト URL を設定
Entra ID:クレームusername(user.userprincipalname)、group(user.groups、グループ ID)
Entra ID:割り当て検証用ユーザーを個別に割り当て
FortiGate:IdPconfig user saml の azure-idp。証明書は REMOTE_Cert_1
FortiGate:ユーザーグループssl-vpn-group。config match でグループのオブジェクト ID と照合
FortiGate:SSL-VPNport1 の 443、ポータル full-access(RDP ブックマーク)
FortiGate:ポリシーSAML-SSL-VPN:SSL-VPN トンネルインターフェース → port2、送信元に ssl-vpn-group
現在の状況

この記事は 2021年7月に FortiOS 6.4.5 と Azure portal で検証した内容です。その後、次のように変わっています。

  • Azure Active Directory は Microsoft Entra ID に名前が変わりました。設定は現在、Microsoft Entra 管理センターの Entra ID ›› エンタープライズ アプリ から行います。
  • FortiOS 6.4 系はサポートが終了しています(2024年9月30日)。
  • FortiOS 7.6.3 以降では、SSL-VPN のトンネルモードが廃止され、Web モードは Agentless VPN という名前になりました(既定では無効)。Fortinet は IPsec VPN への移行を勧めています。

コメント