FortiGateでのクライアント証明書認証

【2021年3月追記】

その後FortiGateの実機で検証をおこない、その内容をホワイトペーパーにしたので以下リンクからご参照ください。
技術資料:FortiGate SSL-VPNでのクライアント証明書認証

以下のコラムは旧版となります。


新型コロナウィルスによるテレワークの推進にともない、「Gléas で発行したクライアント証明書を、FortiGate の SSL-VPN での認証に利用する場合の情報はないか?」とのお問い合わせを複数件いただきました。
これまで触れたことがなかったのですが、Fortinet 社さまのサポートサイトで FortiGate の評価用仮想イメージを配布されていたので、少し試してみました。

どうも評価版での制約があるようで FortiGate に対し RSA 512 ビットよりも大きい鍵長のルート証明書をインポートしようとすると CUI/GUI ともにエラーになってしまうため、すでに RSA 512 ビット鍵をサポートしない Gléas では対応ができず、筆者のほうでCAを作成し試したので Gléas としての技術情報にはなりませんが、製品版ではこの制約はないものと思いますので、手順などお役に立てばと思いコラムとして掲載することにしました。
(動作の確実性を保証するものではないので、あくまでもご参考情報としてお読みください)


構成

検索すると同様の内容を解説しているWebサイトがいくつか見つかるので、あまり見かけなかった “LDAP-integrated certificate authentication” という認証時にクライアント証明書の情報と、Active Directory のユーザプリンシパル名(ユーザログオン名)との一致をチェックし、その上でパスワードを求める二要素認証の構成にしました。

FortiGate検証構成図

環境構築にあたっては、以下のページを参考にさせていただきました。
https://docs.fortinet.com/document/fortigate/6.4.0/administration-guide/751987/ssl-vpn-with-ldap-integrated-certificate-authentication

今回利用したものは以下の通りです。

  • FortiGate VM64 ファームウェアv6.4.0 build1579 (GA)
    ※ SSL-VPN(パスワード認証)の設定方法については、すでに済んでいるものとし本コラムでは触れません
  • Windows Server 2012 R2 バージョン 6.3/ Active Directory Domain Service (AD DS)
  • Windows 10 バージョン 1909 / FortiClient VPN 6.2.6.0951
  • iPhone7 Plus / iOS 13.4.1 / FortiClient 6.2.4.0340


テスト用証明書の発行

  • サーバ証明書は、 Gléas から RSA 2048 ビット鍵で発行しています。
  • クライアント証明書は、RSA 512 ビット鍵でCAを作成し、そのCAからサブジェクト代替名(Subject Alternative Name)にユーザプリンシパル名(AD の userPrincipalName 属性値)を入れて、RSA 2048 ビット鍵で作成しています。
  • 上記の通り、本コラムの内容ではサーバ証明書とクライアント証明書の発行CAが異なりますが、それによる動作への影響は一般的にはありません。

FortiGate の設定

サーバ証明書をインストールします。Gléasで発行したRSA 2048ビット鍵長のものでCLIからインストールする分には問題はありませんでした。手順を以下に簡単に記します。

  • Gléas でサーバ証明書を発行のうえダウンロードし、openssl pkcs12 コマンドなどで証明書と秘密鍵を抽出します。
  • FortiGate の CLI にアクセス(SSHなど)し、config vpn certificate local コマンドで秘密鍵と証明書をインポートします。
    ※ Fortinet 社の Knowledge Base Document ID: FD35291 を当方では参考にしました
  • 成功していれば、Web 管理画面の[システム] > [証明書]で、ローカル証明書としてインポートした証明書が表示されます。

    Fortigate VPN

  • [VPN] > [SSL-VPN設定]の、[サーバ証明書]をインポートした証明書に変更。その下の、[クライアント証明書を要求]もあとで変更が必要になるのでオンにしておきます。

    Fortigate VPN

次に、ルート証明書(クライアント証明書の発行CA)をインストールします。今回の動作検証用に RSA 512 ビット鍵でルート CA を手元で作成し、管理画面より[CA証明書]としてアップロードします。

Fortigate VPN

失効リスト(CRL)もあらかじめ作成して他のWebサーバにそのファイルを配置し、そのURLを管理画面から指定することで取得可能でした。
※自動更新については試していません。

Fortigate VPN

次に、UPNのチェックをおこなうADの設定をします。
管理画面の[User & Authentication] > [LDAPサーバ]で、Active Directory に LDAPS アクセスできるように設定します。

Fortigate VPN

次に、PKIユーザを作成します。LDAP-integrated certificate authentication で認証をおこなうユーザを作成する場合は、常にCLIで設定する必要があるようです。

config user peer edit testuser4 set ca CA_Cert_1 set ldap-server "js3-test12.local" set ldap-mode principal-name end

その後、Web管理画面より[User & AUthentication] > [PKI]より、追加したユーザが見えるようになっているので内容を編集します。

  • [サブジェクト]に、クライアント証明書のサブジェクトCNの値を入力します。
  • [二要素認証]をオンにして、[パスワード]を入力します。

    Fortigate VPN

  • 作成したPKIユーザを、SSL-VPN利用可能なユーザグループに参加させます。

FortiGate の設定は以上です。

クライアント (Windows PC)

ルート証明書(サーバ証明書のトラストアンカ)と、クライアント証明書をPCにインポートしてから、FortiClientの設定をします。
設定画面で、インポートした証明書を選び、また各VPN設定をしていきます。

パスワードを入力して接続します。

問題なく接続できています。

管理画面より[ログ & レポート] > [Events]で VPN イベントを見ると、”SSL new SSL certificate verification success”というメッセージのログエントリが表示されます。

クライアント (iOS)

ルート証明書(サーバ証明書のトラストアンカ)をiPhoneに追加し、証明書信頼設定([設定]アプリから、[一般] > [情報] > [証明書信頼設定])をおこなっておきます。
また、PKCS#12 フォーマットのクライアント証明書ファイルの拡張子を “fctp12” に変更し iPhone にメール添付で送ります。
iPhone 上で受信したファイルの処理の選択肢から “FortiClientにコピー” を選ぶとアプリ内にインポートされます。

Fortigate VPN

Fortigate VPN

FortiClient のVPN接続設定でクライアント証明書の設定が可能となります。

Fortigate VPN

iPhone からも接続がおこなえました。

Fortigate VPN

ユーザログインの制御

以下をおこなうことにより、ログインできなくなることを確認しました。

  • クライアント証明書を失効し、その失効情報が FortiGate に伝搬されたとき
  • AD で該当ユーザアカウントを無効にしたとき