FortiGate の SSL-VPN では、ユーザー認証に SAML を使えます。この記事では、IdP に Azure Active Directory(現在の Microsoft Entra ID)を使い、Entra ID のユーザーでシングルサインオンして SSL-VPN(Web モード)に接続できることを確かめます。最後に、ブラウザの拡張機能で SAML のやり取りの中身も見ていきます。
- Entra ID でユーザー・グループ・エンタープライズアプリケーション(FortiGate SSL VPN)を設定する
- FortiGate に IdP を登録し、Entra ID のグループで SSL-VPN の接続を許可する
- AuthnRequest・Response・ログアウトの SAML メッセージで、何がやり取りされているかを確かめる
SAML の仕組みは 【SAML】シングルサインオン(SSO)の動作概要 で紹介しています。FortiGate の SSL-VPN は、SAML 以外にローカルユーザーや LDAP サーバでも認証できます。
検証構成
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 の接続を許可するポリシーを作ります。
| 項目 | 今回の値 |
|---|---|
| FortiGate | FortiOS 6.4.5。port1 で SSL-VPN を受け、port2 が LAN 側 |
| FortiGate の FQDN | 今回は FQDN の代わりにグローバル IP アドレスを使用(アドレスは伏せています) |
| IdP | Azure Active Directory(現在の Microsoft Entra ID) |
| ユーザー・グループ | 検証用ユーザー(名前は伏せています)を、グループ ssl-vpn-group に入れる |
| 接続先 | Windows サーバ 10.0.1.167(RDP) |
SAML では、FortiGate と Entra ID が直接通信するのではなく、PC のブラウザがメッセージを運びます。この記事で作る構成のやり取りは次のとおりです。
FortiGate の管理アクセスのポート番号を変える
今回は、Web 管理画面にアクセスするインタフェースと、SSL-VPN の接続を受けるインタフェースを同じにします。どちらも既定のポート番号が 443 で重なるため、管理アクセスの HTTPS ポートを 10443 に変えます。システム ›› 設定 の「管理者設定」で設定します。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。Entra ID の画面は、検証した 2021年7月時点の Azure portal(Azure Active Directory)のものです。
| HTTPポート | 80 |
| HTTPSへリダイレクト | オン |
| 1HTTPSポート | 10443 |
| HTTPSサーバ証明書 | self-sign |
| SSHポート | 22 |
変更したら、https://<インタフェースのアドレス>:10443 で管理画面にログインできることを確かめます。
IdP(Entra ID)の設定
Entra ID では、ユーザー、グループ、エンタープライズアプリケーションを設定します。検証時は Azure portal の Azure Active Directory から操作しました。
ユーザーとグループを作る
グループ ssl-vpn-group を作り、検証用ユーザーを所属させます。まず Azure Active Directory ›› ユーザー ›› 新しいユーザー でユーザーを作ります。
| 種類 | ◉ ユーザーの作成○ ユーザーの招待 |
| 1ユーザー名 | (伏せています) @ (伏せています).onmicrosoft.com |
| 名前 | (伏せています) |
| 名・姓 |
| ○ パスワードの自動生成◉ 自分でパスワードを作成する | |
| 2初期パスワード | ●●●●●●●● |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | ユーザー名・名前 | 検証用ユーザーの名前。ユーザー名は 名前@テナントのドメイン の形(UPN)になる |
| 2 | 初期パスワード | 自分で決めたパスワード。初回サインイン時に変更を求められる |
| 3 | 作成 | ユーザーが一覧に追加される |
次に Azure Active Directory ›› グループ ›› 新しいグループ でグループを作ります。
| グループの種類 | セキュリティ |
| 1グループ名 | ssl-vpn-group |
| グループの説明 | |
| メンバーシップの種類 | 割り当て済み |
| メンバー | メンバーが選択されていません |
作成したグループは一覧に表示されます。Entra ID の SAML トークンでは、グループの情報はグループ名ではなくオブジェクト ID で返ります。FortiGate の設定で使うので、オブジェクト ID をコピーして控えておきます。
| 名前 | オブジェクト ID |
|---|---|
| ssl-vpn-group | 1(伏せています) |
オブジェクト ID は xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx の形の GUID です。続けて、グループにユーザーを入れます。グループ名をクリックし、メンバー ›› メンバーの追加 で検証用ユーザーを選んで 選択 をクリックします。
| 名前 | 種類 |
|---|---|
| 1(伏せています) | ユーザー |
エンタープライズアプリケーションを追加する
Entra ID に、SP として FortiGate を登録します。ギャラリーに FortiGate 用のアプリケーションが用意されているので、それを使います。Azure Active Directory ›› エンタープライズ アプリケーション ›› 新しいアプリケーション で Fortigate と検索し、FortiGate SSL VPN を選んで 作成 をクリックします。
| 名前 | ホームページ URL |
|---|---|
| 1FortiGate SSL VPN | https://www.fortinet.com/ |
アプリケーション名をクリックし、シングル サインオン で SAML を選びます。ここからは、SAML の設定画面の各項目を順に設定します。
基本的な SAML 構成を設定する
基本的な SAML 構成 の 編集 をクリックし、FortiGate 側の URL を設定します。[FQDN] は FortiGate の FQDN(今回はグローバル IP アドレス)です。SSL-VPN のポートを 443 以外にしている場合は、[FQDN]:ポート番号 にします。
| 項目 | 設定する URL |
|---|---|
| 識別子(エンティティ ID) | https://[FQDN]/remote/saml/metadata |
| 応答 URL | https://[FQDN]/remote/saml/login |
| サインオン URL | https://[FQDN]/remote/login(今回の入力値) |
| ログアウト URL | https://[FQDN]/remote/saml/logout |
| 1識別子(エンティティ ID) | https://(伏せています)/remote/saml/metadata ☑ 既定 |
| 2応答 URL(Assertion Consumer Service URL) | https://(伏せています)/remote/saml/login ☑ 既定 |
| 3サインオン URL | https://(伏せています)/remote/login パターン: https://<FORTIGATE-FQDN>/remote/saml/login |
| リレー状態 | |
| 4ログアウト URL | https://(伏せています)/remote/saml/logout |
| No. | 項目 | 役割 |
|---|---|---|
| 1 | 識別子 | SP(FortiGate)を識別する名前。FortiGate の entity-id と同じ値にする |
| 2 | 応答 URL | Entra ID が SAML Response を送る先(ACS)。FortiGate の single-sign-on-url と同じ値にする |
| 3 | サインオン URL | マイ アプリなど Entra ID 側からアプリを開いたときに、ユーザーを送る FortiGate の URL。FortiGate の設定では使わない |
| 4 | ログアウト URL | ログアウトの応答を送る先。FortiGate の single-logout-url と同じ値にする |
| 5 | 保存 | 設定を保存する |
画面のパターンや Microsoft のチュートリアルでは、サインオン URL は https://<FortiGate の FQDN>/remote/saml/login の形です。サインオン URL は Entra ID 側(マイ アプリや「テスト」)からサインインを始めるときに使う値で、この記事のようにブラウザで FortiGate に直接アクセスする場合は使われません。マイ アプリから起動させたい場合は、パターンどおりの値にしておきます。
ユーザー属性とクレームを設定する
FortiGate は、SAML Response の中の username と group という名前の属性から、ユーザー名と所属グループを読み取ります。Entra ID 側で、この名前の属性(クレーム)を送るようにします。ユーザー属性とクレーム の 編集 をクリックします。
ギャラリーのアプリケーションには、最初から値が user.groups [SecurityGroup] のグループ クレームがあります。これをクリックし、詳細オプションで名前を group にして保存します。
| 返すグループ | ○ なし○ すべてのグループ◉ セキュリティ グループ ○ ディレクトリ ロール○ アプリケーションに割り当てられているグループ |
| ソース属性 | グループ ID |
| グループ要求の名前をカスタマイズする | ☑ |
| 1名前(必須) | group |
| 名前空間(省略可能) | |
| グループをロール要求として生成する | ☐ |
ソース属性が グループ ID なので、グループはオブジェクト ID で送られます。次に、値が user.userprincipalname の行(クレーム名 …/claims/name)をクリックし、名前を username に変えます。名前空間の値は消してから保存します。
| 1名前 | username |
| 2名前空間 | 名前空間の URI を入力してください |
| ソース | ◉ 属性○ 変換 |
| ソース属性 | user.userprincipalname |
username と group ができていることを確かめます。ほかの属性は使わないので、残しても削除してもかまいません。
| クレーム名 | 値 |
|---|---|
| 一意のユーザー識別子(名前 ID) | user.userprincipalname [nameid-for… |
| クレーム名 | 値 |
|---|---|
| 1group | user.groups |
| http://schemas.xmlsoap.org/ws/2005/05/ | user.mail |
| http://schemas.xmlsoap.org/ws/2005/05/ | user.givenname |
| http://schemas.xmlsoap.org/ws/2005/05/ | user.surname |
| 2username | user.userprincipalname |
クレーム名は大文字と小文字を区別します。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 をコピーして控えます。
| 状態 | アクティブ |
| 有効期限 | 2024/7/3 17:03:17 |
| 1証明書 (Base64) | ダウンロード |
| 証明書 (未加工) | ダウンロード |
| フェデレーション メタデータ XML | ダウンロード |
| 2ログイン URL | https://login.microsoftonline.com/(伏せています)/saml2 |
| Azure AD 識別子 | https://sts.windows.net/(伏せています)/ |
| ログアウト URL | https://login.microsoftonline.com/(伏せています)/saml2 |
| No. | 項目 | 使い道 |
|---|---|---|
| 1 | 証明書 (Base64) | FortiGate にリモート証明書としてインポートし、idp-cert に指定する |
| 2 | ログイン URL・Azure AD 識別子・ログアウト URL | FortiGate の idp-single-sign-on-url・idp-entity-id・idp-single-logout-url に設定する。URL の途中の値はテナント ID |
署名証明書には有効期限があります(今回は作成から3年)。期限が切れる前に Entra ID で新しい証明書を作り、FortiGate の証明書も入れ替える必要があります。
アプリケーションにユーザーを割り当てる
FortiGate SSL VPN アプリケーションを使えるユーザーを登録します。ユーザーとグループ ›› ユーザーまたはグループの追加 をクリックし、ユーザー の「選択されていません」から検証用ユーザーを選びます。
| 2ユーザー | 1 人のユーザーが選択されました。 |
| ロール | Default Access |
| No. | 表示・項目 | 意味・設定内容 |
|---|---|---|
| 1 | オレンジの警告 | グループ単位の割り当てには Entra ID P1 または P2 が必要。今回のテナントでは使えないため、ユーザーを個別に割り当てる |
| 2 | ユーザー | 検証用ユーザーを選ぶ |
| 3 | 割り当て | 割り当てを実行する |
| 表示名 | オブジェクトの種類 | 割り当てられたロール |
|---|---|---|
| 1(伏せています) | ユーザー | Default Access |
アプリケーションに割り当てたユーザーがサインインできます。どのユーザーに SSL-VPN を許可するかは、次の FortiGate の設定で、SAML Response の group(グループのオブジェクト ID)を見て決めます。
SP(FortiGate)の設定
証明書をインポートする
システム ›› 証明書 の インポート ›› リモート で、ダウンロードした Base64 の証明書をアップロードします。既定では REMOTE_Cert_1 という名前で登録されます。
| 名前 | サブジェクト |
|---|---|
| リモート(1) | |
| 1REMOTE_Cert_1 | CN = Microsoft Azure Federated SSO Certificate |
| リモート CA 証明書(4) | |
| Fortinet_CA | C = US, ST = California, L = Sunnyvale, O = Fortinet, … |
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-id | FortiGate SSL VPN のセットアップの「Azure AD 識別子」 |
| idp-single-sign-on-url | FortiGate SSL VPN のセットアップの「ログイン URL」 |
| idp-single-logout-url | FortiGate 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 の接続を受ける設定をします。
| 1リッスンするインターフェース | Untrust (port1) |
| 2リッスンするポート | 443 Webモードアクセスをリッスンするポート: https://10.0.0.196:443 |
| HTTPをSSL-VPNにリダイレクトする | オフ |
| アクセスを制限 | ◉ 任意のホストからアクセス許可○ 特定ホストへアクセス制限 |
| アイドル ログアウト(非アクティブ) | オン 300 秒 |
| サーバ証明書 | self-sign |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | リッスンするインターフェース | インターネット側の port1 |
| 2 | リッスンするポート | 443。管理アクセスを 10443 に移したので重ならない |
サーバ証明書は検証のため自己署名(self-sign)のままにしています。この場合、ブラウザに証明書の警告が出ます。本番では、FQDN に合った証明書を設定します。
SSL-VPN ポータルを設定する
VPN ›› SSL-VPNポータル でポータル画面を設定します。今回は full-access を使います。ポータルは、SSL-VPN 設定の「認証/ポータルマッピング」でユーザーグループごとに割り当てます。
| 名前 | トンネルモード | Webモード |
|---|---|---|
| 1full-access | 有効化済み | 有効化済み |
| tunnel-access | 有効化済み | 無効化済み |
| web-access | 無効化済み | 有効化済み |
緑のアイコンはそのモードが有効、赤のアイコンは無効であることを表します。full-access はトンネルモードと Web モードの両方が有効です。full-access を編集し、Web モードで 10.0.1.167 に RDP で接続するブックマークを作っておきます。
| ポータルメッセージ | SSL-VPN Portal | ||||||
| テーマ | 青 | ||||||
| ユーザブックマーク | オン | ||||||
| 1Predefined Bookmarks |
|
SSL-VPN 用のポリシーを作る
ポリシー&オブジェクト ›› ファイアウォールポリシー で、SSL-VPN 用のポリシーを作ります。
| 1名前 | SAML-SSL-VPN |
| 2着信インターフェース | SSL-VPNトンネルインターフェース |
| 3発信インターフェース | port2 |
| 4送信元 | SSLVPN_TUNNEL_ADDR1 ssl-vpn-group |
| 宛先 | all |
| スケジュール | always |
| サービス | ALL |
| アクション | ◉ ACCEPT○ DENY |
| インスペクションモード | ◉ フローベース○ プロキシベース |
| NAT | オン(発信インターフェースのアドレスを使用) |
| ⋮ (中略) | |
| 許可トラフィックをログ | すべてのセッション |
| 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 ポータルが表示されます。
10.0.1.167 のブックマークをクリックすると、ブラウザのタブの中で RDP の画面が開きます。
ログ&レポート ›› 転送トラフィック で通信のログを見ると、送信元に Entra ID のユーザー名(UPN)が表示されます。
| 送信元 | 宛先 | 結果 | ポリシー |
|---|---|---|---|
| 1(伏せています) ユーザー名(UPN)と接続元 IP アドレス | 10.0.1.167 | ✔ 4.08 kB / 156.17 kB | 2SAML-SSL-VPN (2) |
| 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)は別の試行で取ったものなので、値は一致していない |
| Issuer | https://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:IdP | config user saml の azure-idp。証明書は REMOTE_Cert_1 |
| FortiGate:ユーザーグループ | ssl-vpn-group。config match でグループのオブジェクト ID と照合 |
| FortiGate:SSL-VPN | port1 の 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 への移行を勧めています。
コメント