FortiClientをクライアント証明書有りで接続してみた

はじめまして！
これから業務上で得た知識で検証など行って少しずつ投稿していければと思います。

Fortigateを購入すると、無償でFortiClientというSSL-VPN用のソフトウェアが使えます。
正確には、ライセンス追加購入がなくてもIPSEC-VPN、SSL-VPN機能であれば利用可能で、中小企業をはじめ意外とお世話になる機会は多いです。

※ライセンスについては以下記事が参考になるので、気になる方は目を通してみて下さい。
https://licensecounter.jp/engineervoice/blog/articles/20191107_forticlient_62_update.html）

ただ最近は通常のユーザID/パスワード認証だけでは不正端末からの接続も許可する事になってしまうので、発行されたクライアント証明書がインストールされた端末からでないと接続できないという要件はよく耳にしますのでFortiClientで検証してみました。

# 検証概要
CA、RADIUS環境ですが今回はソリトンシステムズのNetAttest for SMBを利用してみました。
（openssl,freeradiusなど何でも可能かと思いますが、ここがメイン内容ではないので省略します。）

接続の概要図は以下の通りです。
<img width="581" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/ef404dac-ff4c-9f2d-d7e0-7bc56844e30e.png">

一連動作の流れ
１．クライアントがFortiClientを起動してFortigateへ接続する。
FortiClientでのユーザー名、パスワードはNetAttestで登録しているユーザー、IDを使用する。
クラシアント証明書はNetAttestで発行したクライアント証明書を選択する。

２．FortigateはFortiClientからの接続を検知するとクライアントから提示されたユーザー名＆パスワードをRADIUSサーバに問い合わせる。RADIUSサーバで登録されているユーザー名＆パスワードに該当している場合、認証を許可する。
提示されたクライアント証明書に関してFortigateは、証明書が「CAに署名されているか」「失効していないか」を確認する。（※）
証明書に関してはNetAttestを参照せず、Fortigateにて失効状況を確認できる必要があるため、Fortigate側でCRL参照を行い、NetAttest側から証明書失効リストを参照する必要がある。

※クライアント証明書は、ユーザー名に合致した証明書でなくても認証できる。（例えば、User-01で発行した証明書は、User-02でも使用できる。）クライアント毎に１つのユーザーを作成しそのユーザーのクライアント証明書を発行することが、今後の失効運用を考えると望ましい。


# 設定手順（NetAttest）

１．初期設定はLAN２（管理インターフェース）から行う。
　　初期IPは「192.168.2.1/24」のため「http\://192.168.2.1:2181/」にアクセスして設定開始する。

２．システム初期設定ウィザードを開始する。
　　ホスト名、IPアドレスなどは何でもよいが、NTP（時刻）だけはクライアントと大きくずれていると認証に失敗することがあるので注意。

３．サービス初期設定ウィザードを開始する。
　　TLSを認証方式に組み込む事と、RADIUSクライアントの登録でFortigateを指定する事。
　　【RADIUSサーバの基本設定】
　　　１TLS
　　　２PEAP

　　【NAS/RADIUSクライアント設定】
　　　NAS/RADIUSクライアント名：Fortigate
　　　IPアドレス：任意（NetAttestと通信できるもので）
　　　シークレット：任意（RADIUSサーバとクライアント間の認証パスワードみたいなもの）
　　　
４．最後にユーザー一覧からテストユーザーを作成して、証明書を発行しておきます。
　　ここでは、User-01,User-02を作成しました。

# 設定手順（Fortigate）

 １．【ユーザー＆デバイス】-【RADIUSサーバ】を選択して新規作成
　　　NetAttestのサービスIPを指定し、シークレットキー（上記３で設定）を入力する。
　　　<img width="909" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/30d2a500-bdcb-4fa0-e00e-bedf0f1911ba.png">

２．【ユーザー＆デバイス】-【ユーザグループ】を選択し、NetAttest用のグループを作成
<img width="908" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/57768865-ebe6-d722-bc32-21415962eec6.png">

３．【システム】-【表示機能設定】で証明書を有効化

４．【システム】-【証明書】でCA証明書（※１）をインポートする。
　　【生成】でサーバ証明要求を作成し、NetAttestでサーバ証明書（※２）を発行し、インポートする。

※１　CA証明書は、NetAttest（http\://192.168.1.2/certsrva）にアクセスしてダウンロードする。
※２　サーバ証明要求は、NetAttest（http\://192.168.1.2/certsrva）にアクセスして行う。

５．同じ証明書画面で【インポート】-【CRL】より参照先をNetAttest（http\://\12.168.1.2/ca/nacacrl.crl）に指定する。
　　CLI設定の場合
　　　config vpn certificate crl
  　　　edit {name}
    　　　set http-url "上記URL" 

<img width="604" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/48f43c32-5378-5976-0ac1-583c62047e01.png">

６．【VPN】-【SSL VPNポータル】より新規ポータルを定義する。
【トンネルモード】：ON
【スプリットトンネルを有効】：任意
【送信元IPプール】：任意
【Webモード有効】：任意

<img width="909" alt="キャプチャ.4PNG.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/d99b2ba1-7ef6-f939-1ab7-ccb3b4ea206e.png">

７．【VPN】-【SSL VPN設定】より設定を定義する。

【接続設定】
リッスンするインターフェース：任意
リッスンするポート：任意
アクセス制限：任意
サーバ証明書：インポートしたサーバ証明書を選択する
クライアント証明書を要求：有効

【トンネルモードクライアント設定】
アドレス範囲：クライアントに割り当てるIPアドレス範囲
DNSサーバ：クライアントに割り当てるDNSアドレス

認証/ポータルマッピング
作成したグループとポータルをマッピング

８．IPv4ポリシーを作成する。

送信IF：SSL-VPNトンネルインターフェース
送信元：IPプールのオブジェクトとグループ名を指定

その他は任意

<img width="909" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580607/9b59227e-0462-0a28-20a2-70d8023c070f.png">


# 設定手順（FortiClient）
クライアントにFortiClientとクライアント証明書をインストールし、SSL-VPN設定を行う。
クライアント証明書の欄ではインストールしたクライアント証明書を選択する。

これで無事接続できるようになります！

# さいごに

万が一端末を紛失した場合なども、該当端末のクライアント証明書をNetAttestで失効しれやればいいだけなので、運用が楽です。
大規模向けではないですが、小規模環境で手軽に利用したい場合は検討してみてください。