TEL 050-3821-2195
営業時間:平日9:00-17:30
株式会社JCCH・セキュリティ・ソリューション・システムズ
〒116-0014 東京都荒川区東日暮里5-52-2 神谷ビル7F
新型肺炎による緊急事態宣言がようやく解除され今後だんだんと通常出勤が可能になっていく世の流れではありますが、パンデミックの第2波、第3波に備えて「不要不急の外出自粛」で脚光を浴びたテレワーク環境を整備する企業が増えてきているのを近ごろの業務の中でヒシヒシと感じています。
クラウドの最先端をいく Amazon Web Service (AWS) さんからリモートアクセス SSL-VPN の仮想化サービスが提供されていまして、今回はその AWS Client VPN でのクライアント証明書認証 (デバイス認証) を検証してみます。
※本記事は動作の確実性を保証するものではないので、あくまでもご参考情報としてお読みください
※AWS Client VPN は、OpenVPN をベースにしているので、本稿に記載するクライアント設定内容は OpenVPN 環境にも応用可能です
今回の検証では、Gléas で発行したクライアント証明書を OS の証明書格納領域にインポートすることで秘密鍵の保護レベルを高めることを目的としています。
VPN クライアントの接続設定ファイルは、AWS Client VPN が配布するものをテキスト編集して Windows PC に適用したり、macOS の Apple Configurator 2 アプリを使って iOS 用の構成プロファイルを作成したりしています。
これらの設定ファイルを Gléas で動的生成して、クライアント PC に配布できるようにする機能も開発可能だと思います。お客様皆様の貴重なご意見によって機能実装が進むのが当社の伝統なので、ひとつ叱咤激励のほどよろしくお願いいたします(笑)。
AWS Client VPN のエンドポイント (仮想 VPN サーバ) を作成し、そこにテスト用 Virtual Private Cloud (VPC) を紐づけます。
クライアント端末には、OpenVPN アプリを入れてクライアント証明書認証 (証明書による相互認証) で SSL-VPN 接続をするという構成です。絵で示すと以下のような感じでシンプルなれど、証明書のない端末からのアクセスを排除する構成です。
今回利用したものは以下の通りです。
Gléas でサーバ証明書を発行してファイルダウンロードし、openssl pkcs12 コマンドなどでサーバ証明書・秘密鍵・ルート証明書を取り出します。
その後、AWS 管理コンソールで Amazon Certificate Management (ACM) を開き、[証明書のインポート]ボタンからサーバ証明書テキストデータを [証明書本文] に、秘密鍵テキストデータを [証明書のプライベートキー] に、ルート証明書テキストデータを [証明書チェーン] に貼り付けます。
以下のようにインポートされたことがわかります。
AWS 管理コンソールを VPC のサービス管理画面に移動して、[仮想プライベートネットワーク (VPN) ] > [クライアント VPC エンドポイント] と進み、仮想 VPN サーバの作成をします。
エンドポイントの作成後に、画面上部の [アクション] ボタンより [クライアント証明書CRLのインポート] をクリックし、失効リスト (PEM フォーマット) のテキストデータをペーストしてインポートします。
失効リストのアップロードは以下の aws コマンドでもできるので、実運用時には失効リストを Gléas より定期的にダウンロードして、AWS にアップロードする中継用マシンを配置する構成になると思われます。
aws ec2 import-client-vpn-client-certificate-revocation-list \
--certificate-revocation-list file:///directory/crl_ia1.pem \
--client-vpn-endpoint-id cvpn-endpoint-xxxxxxxxxxxxxxxxx \
--region ap-northeast-1
証明書認証の準備は以上です。VPC とサブネットを VPN エンドポイントに関連づけて、その VPC へのアクセス許可ルールを作れば SSL-VPN 接続が可能な状態になります。
[クライアント設定のダウンロード] をクリックして、設定ファイル (.ovpn ファイル) をダウンロードしておきます。
Gléas からクライアント証明書をインポートしておきます。こんな感じです。
インポートできたら証明書ストア (certmgr.msc) を見て、インポートした証明書の拇印を確認します。
ダウンロードした ovpn ファイルをテキストエディタで開いてその拇印の情報を追加します。
cryptoapicert "THUMB:拇印"
※なお本コラム執筆時点では cryptoapicert ディレクティブは AWS さんが配布する専用の VPN クライアントアプリでは使えません。
その設定ファイルを OpenVPN GUI クライアントにインポートし接続を試すとすんなりと VPN セッションを張ることができました。
コンソールの [接続] タブを見ると、ログインに成功していることがわかります。
あらかじめ Gléas からクライアント証明書ファイル (.p12 ファイル) をダウンロードしておき、macOS に付属する Apple Configurator 2 を使って、OpenVPN 用の接続プロファイルを新規作成します。
最初に、[資格情報] でダウンロードした .p12 ファイルを指定します。
次に、[VPN] で以下をおこないます。
キー: 値 client: NOARGS dev: tun proto: udp remote: *.cvpn-endpoint-xxxxxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443 remote-tls-server: server cipher: AES-256-GCM vpn-on-demand: 0
その後、.mobileconfig ファイルを作成し、iPhoneにメールで送ってそのプロファイルをインポートします。
取り込んだ後に OpenVPN Connect アプリを起動すると、VPN 接続設定ができておりそのまま VPN 接続することが可能です。
クライアント証明書を失効し、その失効情報を含む失効リストが AWS VPN エンドポイントにアップロードされたときに VPN ログインができなくなることを確認しました。