本記事について
本記事では、Fortinet 社のファイアウォール製品である FortiGate において SSL-VPN 機能を設定する方法について説明します。なお、クライアント認証方法として Azure AD(現 Microsoft Entra ID)を使用する場合を対象としています。
動作確認環境
本記事の内容は以下の機器にて動作確認を行った結果に基づいて作成されています。
- FortiGate-60F
- バージョン 7.4.3
- FortiClient VPN 7.2.4.0972
前提
SSL-VPN のトンネルモードと Web モード
SSL-VPN ではクライアントソフトを使用するのが一般的ですが、クライアントソフトを使わずに Web ブラウザを使用して接続する Web モードも存在します。ただし、クライアントソフトを使用するトンネルモードが主流であり Web モードが使用されるケースは経験上見たことがありません。
本記事ではトンネルモードを使用します。
SSL-VPN 接続時のクライアント認証方法
SSL-VPN サーバはクライアントが接続を試みた際にクライアントの認証を行います。
認証方法としては以下のようなものがあります。
- ローカルユーザ認証(FortiGate で設定したユーザでの認証)
- LDAP 認証(AD サーバのユーザで認証)
- Azure AD (現 Microsoft Entra ID) での認証 (シングルサインオン)
- クライアント証明書による認証(2要素認証)
- FortiToken を利用したワンタイムパスワード(2要素認証)
本記事では③の Azure AD を使用して認証する場合について説明します。
サーバ証明書について
SSL-VPN サーバにはサーバ証明書がインストールされている必要があります。FortiGate にはデフォルトでサーバ証明書が含まれているため、それを SSL-VPN で使用できます。ただしデフォルトのサーバ証明書を使用した場合クライアントが SSL-VPN 接続時にクライアント側の画面にサーバ証明書に関する警告が表示されます。
警告を表示させたくない場合は別途サーバ証明書を用意し FortiGate にインストールする必要があります。
本記事ではデフォルトのサーバ証明書を使用することとしています。
想定するシナリオ
FortiGate は wan1 にて SSL-VPN 接続をリッスンします。FortiGate にSSL-VPN 接続を試みるクライアントの認証方法として、クラウド上の Azure AD のユーザを使用して認証を行います。

SSL-VPN 接続に関する設計は以下の通りです。
- FortiGate は wan1 (192.168.179.21) のポート 8443 で SSL-VPN をリッスンします
- クライアントは 192.168.179.21 のポート 8443 宛に SSL-VPN 接続を行います
Azure AD での設定
まず Azure AD 側で FortiGate の SSL-VPN と連携するための設定を行う必要があります。
Microsoft Entra 管理センター画面を表示し、左側のメニューから「アプリケーション > エンタープライズアプリケーション」をクリックします。

エンタープライズアプリケーション画面で「新しいアプリケーション」をクリックします。

表示された画面の検索枠に「FortiGate SSL VPN」と入力し、検索された「FortiGate SSL VPN」をクリックします。

画面右側の以下のような画面が表示されるため「作成」をクリックします。

FortiGate SSL VPN 概要画面が表示されるため、左側のメニューから「シングルサインオン」をクリックします。

以下の画面が表示されるため「SAML」カードをクリックします。

以下の画面が表示されるため「基本的な SAML 構成」欄の「編集」をクリックします。

以下の画面が表示されるため各項目を設定します。

- 識別子 (エンティティ ID)
- 「識別子の追加」をクリックして枠を表示し、以下の値を入力します
https://<FortiGateのアドレスまたはFQDN>:<FortiGateのリッスンポート>/remote/saml/metadata
例:
https://192.168.179.21:8443/remote/saml/metadata
- 応答 URL (Assertion Consumer Service URL)
- 「応答 URL の追加」をクリックして枠を表示し、以下の値を入力します
https://<FortiGateのアドレスまたはFQDN>:<FortiGateのリッスンポート>/remote/saml/login
例:
https://192.168.179.21:8443/remote/saml/login
- サインオン URL
- 以下の値を枠に入力します(応答 URL と同じ)
https://<FortiGateのアドレスまたはFQDN>:<FortiGateのリッスンポート>/remote/saml/login
例:
https://192.168.179.21:8443/remote/saml/login
続きの項目も設定します。

- リレー状態
- 設定不要です
- ログアウト URL
- 以下の値を枠に入力します
https://<FortiGateのアドレスまたはFQDN>:<FortiGateのリッスンポート>/remote/saml/logout
例:
https://192.168.179.21:8443/remote/saml/logout
以上の設定ができたら画面上にある「保存」をクリックします。

次に「属性とクレーム」欄の「編集」をクリックします。

表示された画面の「新しいクレームの追加」をクリックします。

以下の画面が表示されます。

- 「名前」欄に「username」を入力します
- 「ソース属性」にて「user.userprincipalname」を選択します
- 「保存」をクリックします
以下の画面に戻るため、値が「user.groups[Security…」になっている行の右側にある「…」をクリックし「削除」をクリックします。

確認画面で「OK」をクリックします。エラー画面が表示されますが削除はできているため気にしません。画面を再読み込みすると対象の行が削除されています。

次に「グループ要求を追加する」をクリックします。

以下の画面が表示されます。「クレームで返される必要があるのは~」では「すべてのグループ」を選択します。詳細オプションを展開し、「グループ要求の名前をカスタマイズする」にチェックを入れ名前に「group」と入力します。その後「保存」をクリックします。

追加の要求欄に「group」と「username」が追加されたことを確認します。

確認ができたら属性とクレーム画面を閉じます。
シングルサインオン画面に戻り、「SAML 証明書」欄にある「証明書 (Base64)」右にあるダウンロードをクリックします。すると証明書をダウロードできます。この証明書は後で FortiGate にインポートして使用します。

次に「FortiGate SSL VPN のセットアップ」欄にある Entra 識別子、ログイン URL、ログアウト URL をコピーして取得します。右側のアイコンをクリックするとコピーできます。この URL は後で FortiGate の設定で使用します。

FortiGate SSL VPN 画面左側のメニューの「管理 > ユーザーとグループ」をクリックします。

Azure AD のユーザが FortiGate に SSL-VPN 接続するためには、対象ユーザがこのアプリケーションのユーザとして追加されている必要があります。
表示された画面で「ユーザーまたはグループの追加」をクリックします。

割り当ての追加画面で SSL-VPN 接続を許可したいユーザを追加します。

- 「選択されていません」をクリックします
- 追加したいユーザにチェックを入れます
- 「選択」をクリックします
ユーザが選択されたことを確認し「割り当て」をクリックします。

追加したユーザが表示されたことを確認します。

FortiGate 側の設定で、SSL-VPN 接続できるユーザを指定した Azure AD のセキュリティグループに所属するユーザのみに制限することができます。この設定で使用するセキュリティグループの設定方法です。
Entra 管理センター画面左側のメニューから「グループ > すべてのグループ」をクリックし、表示された画面で「新しいグループ」をクリックします。

新しいグループを設定します。グループ名を入力し、所属するメンバーを選択して「作成」をクリックします。

エンタープライズアプリケーション「FortiGate SSL VPN」の設定にてユーザとして追加されていないユーザはこのセキュリティグループに追加されていても SSL-VPN 接続できないため注意してください。
グループが作成されたことを確認します。

このグループの「オブジェクトID」を FortiGate の設定で使用するため記録しておきます。
以上で Azure AD 側の設定は完了です。
FortiGate での SSL-VPN 設定
SSL-VPN の設定は以下の手順で行います。
- シングルサインオンの設定
- ユーザグループの作成
- クライアント用 IP アドレスプールの設定
- SSL-VPN ポータルの作成
- SSL-VPN 設定
- ファイアウォールポリシー設定
シングルサインオンの設定
GUI にログインし左側のメニューから「ユーザ&認証 > シングルサインオン」をクリックします。

表示された画面で「新規作成」をクリックします。

以下の画面が表示されるため設定していきます。

- 「名前」には任意の表示名を入力します
- 「アドレス」欄には以下の値を入力します
<FortiGate のアドレスまたは FQDN>:<FortiGateの待受けポート>
- 「証明書」では FortiGate のサーバ証明書を指定します
エンティティID、アサーションコンシューマサービスURL、シングルログアウトサービスURLは「アドレス」の設定に基づいて自動で設定されます。ただし「エンティティID」のみ後で手動で修正します。
以上設定できたら「次へ」をクリックします。
次の画面が表示されるため設定します。

- 「タイプ」では「カスタム」をクリックします
- エンティティID、アサーションコンシューマサービスURL、シングルログアウトサービスURL には Azure AD から取得した URL を入力します
- エンティティID
- Azure AD の Microsoft Entra 識別子の URL を入力します
- アサーションコンシューマサービスURL
- Azure AD のログイン URL の URL を入力します
- シングルログアウトサービスURL
- Azure AD のログアウト URL の URL を入力します
- エンティティID
「証明書」では Azure AD からダウンロードした証明書をアップロードして指定します。

- ユーザを識別するために使用される属性
- 「username」と入力します
- グループを識別するために使用する属性
- 「group」と入力します

以上設定ができたら「サブミット」をクリックします。
シングルサインオンが追加されたことを確認します。

SPエンティティIDを修正しますが GUI では設定変更できないので CLI で行います。
CLI にログインしてshow user saml
を実行します。
FortiGate-60F # show user saml
config user saml
edit "AzureAD"
set cert "Fortinet_Factory"
set entity-id "http://192.168.179.21:8443/remote/saml/metadata/"
set single-sign-on-url "https://192.168.179.21:8443/remote/saml/login"
set single-logout-url "https://192.168.179.21:8443/remote/saml/logout"
set idp-entity-id "https://sts.windows.net/c22a2448-1ab3-46f5-ac14-e40c692d3474/"
set idp-single-sign-on-url "https://login.microsoftonline.com/c22a2448-1ab3-46f5-ac14-e40c692d3474/saml2"
set idp-single-logout-url "https://login.microsoftonline.com/c22a2448-1ab3-46f5-ac14-e40c692d3474/saml2"
set idp-cert "REMOTE_Cert_1"
set user-name "username"
set group-name "group"
set digest-method sha1
next
end
これが今設定したシングルサインオンの設定に該当します。
この設定の内set entity-id
の値を修正します。現状では「http://」であることと末尾に「/」が付いていますがこれを「https://」にし末尾の「/」を削除するため以下のコマンドで設定修正します。
config user saml
edit "AzureAD"
set entity-id "https://192.168.179.21:8443/remote/saml/metadata"
next
end
設定値は自分が設定中の FortiGate の設定値に合わせた値にしてください。
設定修正の結果以下の設定になります。
config user saml
edit "AzureAD"
set cert "Fortinet_Factory"
set entity-id "https://192.168.179.21:8443/remote/saml/metadata"
set single-sign-on-url "https://192.168.179.21:8443/remote/saml/login"
set single-logout-url "https://192.168.179.21:8443/remote/saml/logout"
set idp-entity-id "https://sts.windows.net/c22a2448-1ab3-46f5-ac14-e40c692d3474/"
set idp-single-sign-on-url "https://login.microsoftonline.com/c22a2448-1ab3-46f5-ac14-e40c692d3474/saml2"
set idp-single-logout-url "https://login.microsoftonline.com/c22a2448-1ab3-46f5-ac14-e40c692d3474/saml2"
set idp-cert "REMOTE_Cert_1"
set user-name "username"
set group-name "group"
set digest-method sha1
next
end
以上でシングルサインオンの設定は完了です。
ユーザグループの作成
SSL-VPN 設定で使用するユーザグループを作成します。
GUI の左側のメニューから「ユーザ&認証 > ユーザグループ」をクリックします。

ユーザグループ画面の「新規作成」をクリックします。

ユーザグループの設定を行います。

- 「名前」には任意のグループ名を入力します
- タイプは「ファイアウォール」を選択します
- リモートグループ欄の「追加」をクリックし、次の画面で設定を行います

- 「リモートサーバ」では先ほど作成したシングルサインオンを指定します
- グループでは「いずれか」または「指定」を選択します
- 「いずれか」を選択した場合は、Azure AD のエンタープライズアプリケーション「FortiGate SSL VPN」の設定にてユーザとして追加されているユーザのすべてが SSL-VPN 接続可能になります
- 「指定」を選択した場合は、表示された枠に Azure AD で作成した SSL-VPN 用のセキュリティグループのオブジェクト ID を入力します。この場合、エンタープライズアプリケーション「FortiGate SSL VPN」の設定にてユーザとして追加されている、かつ指定したセキュリティグループに所属しているユーザのみが SSL-VPN 接続可能になります
設定ができたら「OK」をクリックします。

リモートグループの追加ができたら「OK」をクリックします。
以上でユーザグループの設定は完了です。
クライアント用 IP アドレスプールの設定
クライアントが SSL-VPN 接続するとクライアントの仮想アダプタに対して IP アドレスが割り当てられます。
デフォルトでも特定の IP 範囲からアドレスが割り当てられますが、IP アドレスの枯渇や組織の内部セグメントと重複する恐れもあるのでここでは手動で IP アドレスプールを設定します。
IP アドレスプールは IP 範囲タイプのアドレスオブジェクトとして設定します。
ここでは例としてアドレスオブジェクトを以下のように設定します。

- 「インターフェース」は「any」とします
- 「タイプ」は「IP範囲」とします
SSL-VPN ポータルの作成
SSL-VPN ポータルは、クライアントの SSL-VPN 接続時の動作を定義するプロファイルです。上で設定したユーザグループと紐づけて使用します。
デフォルトでいくつかの SSL-VPN ポータルが存在しますが、ここでは要件に合わせて手動で新規作成します。
作成手順は以下の通りです。
GUI にログインし左側のメニューから「VPN > SSL-VPNポータル」をクリックします。

SSL-VPN ポータル画面で「新規作成」をクリックします。

SSL-VPN ポータル設定画面が表示されるため各項目を設定します。

- 「名前」には任意のポータル名を入力します
- 基本的にデフォルトの OFF のままにします
- 「トンネルモード」を有効にします
- スプリットトンネリングでは基本的にはデフォルトの「ポリシーの宛先に基づいて有効」とします
- この設定にすることで、クライアントでは SSL-VPN 接続中は組織の内部ネットワーク宛の通信のみ SSL-VPN トンネルを通して通信を行する動作になります
- 基本的には設定変更の必要はありません
- 「送信元IPプール」ではクライアント用IPアドレスプールとしてあらかじめ作成しておいたアドレスオブジェクトを指定します
- ここで指定したアドレス範囲からクライアントにアドレスが割り当てられます
続きの項目も設定していきます。

- 「トンネルモードクライアントオプション」ではクライアントの権限等の設定です。要件がある場合は有効化します
- 「ホストチェック」ではクライアントにてアンチウィルスソフトが動作している場合のみ接続を許可する等の設定ができます。要件がある場合は有効化します
- 「特定のOSバージョンに制限」ではクライアントの Windows や MAC OS のバージョンごとに接続の許可・拒否を設定できます。要件がある場合は有効化します
- 「FortiClientダウンロード」が有効な場合、クライアントは FortiGate から FortiClient インストーラをダウンロードできます。デフォルトで有効ですが必要に応じて無効化します
- 「FortiClientダウンロード」は Web モードに関する設定で、Tunnel モードには関係ありません。Web モードはデフォルトで無効になっています
以上の設定ができたら「OK」をクリックします。
SSL-VPN ポータル画面にて設定が追加されたことを確認します。

以上で SSL-VPN ポータルの設定は完了です。
SSL-VPN 設定
ここまでで本題の SSL-VPN 機能を設定するための材料がそろったため SSL-VPN 設定を行います。
設定手順は以下の通りです。
GUI にログインし左側のメニューから「VPN > SSL-VPN設定」をクリックします。

SSL-VPN 設定画面にて各項目を設定していきます。
「SSL-VPN status」を「有効」にします。※デフォルトで有効です

続きの項目も設定していきます。

- 「リッスンするインターフェース」ではクライアントからの SSL-VPN 接続要求を着信するインターフェースを指定します
- 「リッスンするポート」ではクライアントからの SSL-VPN 接続要求を受け付けるポートを指定します。デフォルトでは 443 となっているため、別のポートに変更します。例では 8443 としています
- 「サーバ証明書」では使用するサーバ証明書を選択します。例ではデフォルトの証明書である「Fortinet_Factory」を使用します
- リダイレクト設定はデフォルトの無効とします
- 「アクセスを制限」では送信元IPによって接続制限ができます。必要な場合は有効化します
- 「アイドルログアウト」はデフォルトで有効になっています。必要な場合は設定変更します
- 「クライアント証明書を要求」はクライアント証明書のチェックを行う場合は有効にします
続いてトンネルモードクライアントの設定を行います。

- 「アドレス範囲」はデフォルトでは自動割り当てになっていますがここでは「カスタムIP範囲を指定」を選択し、「IP範囲」ではクライアント用 IP アドレスプールとしてあらかじめ作成しておいたアドレスオブジェクトを指定します
- DNSサーバとWINSサーバはデフォルト設定のままとします
次の「認証/ポータルマッピング」欄では「新規作成」をクリックします。

以下の画面が表示されるため「ユーザ/グループ」にはあらかじめ作成しておいたユーザグループを指定し、「ポータル」にはあらかじめ作成しておいた SSL-VPN ポータルを指定します。

続いて「すべてのその他のユーザ/グループ」をクリックして選択状態にし「編集」をクリックします。

先ほどと同じように「ポータル」にはあらかじめ作成しておいた SSL-VPN ポータルを指定します。

以上の設定ができたら画面下部の「適用」をクリックします。

以上で SSL-VPN 機能の設定は完了です。
ファイアウォールポリシーの設定
最後に、SSL-VPN クライアントから組織の内部ネットワークへの通信を許可するファイアウォールポリシーを設定します。
ポリシーの設定内容は以下のようにします。

- 「着信インターフェース」には「SSL-VPN tunnel interface (ssl.root)」を指定します
- 「送信元」には SSL-VPN クライアント用の IP アドレスプールと、SSL-VPN 用のユーザグループの2つを指定します
- その他の項目については通常のファイアウォールポリシー設定と同様に設定します
上画像の設定例ではサービスを ALL にしていますが、必要な場合は通信要件に合わせてサービスを限定してください。
FortiClient VPN での接続方法
Azure AD 認証とする場合は FortiClient VPN では以下のように接続の設定を行います。

- リモートGW には FortiGate のアドレスを入力
- ポートの編集にチェックを入れ、FortiGate のリッスンポートを入力
- 「VPNトンネルのシングルサインイン(SSO)を有効化」にチェックを入れる
- 「SAMLユーザ認証のユーザエージェントとして外部ブラウザを使用する」にチェックを入れる
接続プロファイルを作成後「接続」をクリックします。

するとブラウザで以下の画面が表示されます。Azure AD のユーザのアドレスを入力します

ユーザのパスワードを入力します。

サインインに成功すると以下の画面になるため任意に選択します。

VPN 接続に成功すると以下の画面になります。

FortiClient VPN の画面はタスクトレイ内に最小化されますが、再表示すると以下の画面になります。

以上で SSL-VPN 接続は完了です。
以上です。
【おすすめ】FortiGate の設計構築中なら以下の記事も役立つかもです
- 基礎知識
- HA (冗長構成) 設定
- FortiGate HA モードの Active-Passive と Active-Active の違いを解説します
- FortiGate HA(冗長構成)の概要と設定ガイド【詳しく解説】※note記事
- FortiGate HA 構成時のコンフィグ同期の仕様について解説します
- FortiGate HA 構成時の NTP,Syslog,SNMP 等の送信元インターフェースを解説 [ha-direct 設定]
- FortiGate HA 構成時の仮想 MAC アドレスについて解説します
- FortiGate HA ハートビート送信間隔と障害判定しきい値の設定ガイド
- FortiGate HA 構成時のバックアップ及びリストア実施ガイド
- FortiGate HA 構成でのモニタインターフェースダウン時の通信断時間について解説
- FortiGate HA 構成に関するQ&A 【良くありそうな疑問集】
- VDOM (バーチャルドメイン) 設定
- トランスペアレントモード設定
- システム系設定
- 管理者アカウント設定
- 時刻・NTP 設定
- ロギング・Syslog 送信設定
- SNMP 設定
- DHCP サーバ機能設定
- Proxy サーバ機能設定
- アラートメール送信
- ネットワーク系設定
- インターフェース設定
- ルーティング設定
- DNS 設定
- NAT 及び NAPT 設定
- ファイアウォール系設定
- アドレス設定
- サービス設定
- ファイアウォールポリシー設定
- ゾーンを使用したポリシー設定
- VPN 系設定
- Tips
Amazon アフィリエイトリンク
以下は Amazon アフィリエイトリンクです。インフラエンジニアにそこそこおすすめなアイテムです。
note メンバーシップへの参加もお待ちしています!

【アフィリエイト】おすすめ WordPress テーマ【SWELL】
当サイトでは WordPress テーマとして SWELL を使用しています。以前は無料・高機能テーマとして知られる Cocoon を使用していて Cocoon も使いやすかったのですが、SWELL を使い始めてからは SWELL のほうが圧倒的に使いやすいなと思いました。そして何より読み込み速度が速い。SWELL を使い始めてから、過去の Cocoon のブログを見直したときに「あれ、こんなに表示遅かったっけ?」という感覚になりました。
また SWELL はデフォルトでもオシャレなデザインですが柔軟にカスタマイズすることもでき個性のあるサイトを作成できます。さらにブログパーツや広告タグといった再利用可能なブログの「部品」も作成することができ、ブログ作成効率も高いです。
技術ブログやアフィリエイト等での収益化を見据えたブログの作成に SWELL は最適です。初見では価格が高いなと思うと思いますが、私としては SWELL を採用して良かったしそれ以上の価値があると感じています。
ブログの新設やテーマ変更を考えている人は一度 SWELL を検討してみてください。
以下の画像リンクから詳細な情報を確認できます。
レンタルサーバーを探している人には安定性に定評のあるエックスサーバーをお勧めします。
当サイトもエックスサーバーを使用しています。WordPress のインストールも簡単にできます。
コメント