Client VPN の相互認証 (クライアント証明書ベース) をローカル管理者権限なしで使いたい

クライアント証明書を使った AWS Client VPN の相互認証で、利用者にローカル管理者権限を与えなくても VPN 接続することができたので、設定手順をまとめてみました。
2020.06.23

みなさま Xin chao !

 

テレワーク開始と共に、AWS Client VPN (以下 Client VPN) をお使いになっている環境も多いと思います。

AWS 公式ドキュメントをはじめとした各種ドキュメントが充実しているので、OpenVPN の知識やクライアント証明書の知識があまりなくても、Client VPN 環境を容易に構築・利用開始することができます (もしよろしければ弊社ブログも参考にしてください)。

クライアント VPN の開始方法 - AWS VPN 管理者ガイド

AWS Client VPN - Developers.IO

気になること

各種ドキュメントを読んでいると、特にクライアント証明書を使った相互認証においては、Client VPN の接続元 PC をローカル管理者権限を持ったユーザーで使用することが、明示的あるいは暗黙的な前提になっている気がします。

組織によっては、OS 等の設定変更や許可されていないアプリケーションのインストールを抑止するために、接続元 PC を使用する一般のユーザーに対しローカル管理者権限を与えていない場合もあると思います。

やりたいこと

そこで今回は、以下を試してみました。

  • Client VPN の接続元 PC を利用するユーザーは、管理者権限のないユーザー権限で Client VPN を利用する
  • Client VPN に必要なセットアップは、IT 管理者が事前に行う

前提

今回試した環境は、以下の通りです。

接続元 PC の OS Windows 10 Pro バージョン 1909 (検証環境の都合により、スクリーンショットは EC2 で動作する Windows Server 2019 で取得していますが、最終的な動作は Windows 10 で確認しています)
VPN クライアントアプリケーション OpenVPN クライアント 2.4.9
認証方式 相互認証 (=クライアント証明書)
証明書生成環境 OpenVPN EasyRSA をインストールした WSL
クライアント証明書の保存先 接続元 PC の証明書ストア
接続元 PC の利用者 ローカル管理者権限なし (=ローカルの Users グループに所属)
IT 管理者 ローカル管理者権限あり (=ローカルの Administrators グループに所属)

やってみた

主に接続元 PC の設定について書いていますので、クライアント証明書の生成や Client VPN エンドポイントの作成については、それぞれのリンク先をご参照ください。

Client VPN 用証明書の作成 (IT 管理者による 証明書生成環境 での作業)

AWS のドキュメントをもとに、Client VPN で使用する以下の証明書を生成します。 今回は Windows 10 の WSL 環境で行いました。

クライアント認証と認可 - 相互認証 - AWS VPN 管理者ガイド

  • ca.crt ・・・ CA ルート証明書
  • server.masawo-cvpn.test.crt ・・・ サーバー証明書
  • server.masawo-cvpn.test.key ・・・ サーバー秘密キー
  • client01.masawo-cvpn.test.crt ・・・ クライアント証明書
  • client01.masawo-cvpn.test.key ・・・ クライアント秘密キー

 

生成されたクライアント証明書 (.crt) を右クリック → [開く] → [詳細] タブより、"サブジェクト" または "拇印" の値を記録しておきます。 "サブジェクト" または "拇印" の値は、後の手順で Client VPN クライアント設定ファイル (.ovpn) に記載します。

 

後の手順で接続元 PC の証明書ストアにインポートするために、生成したクライアント証明書を PKCS #12 形式 (.pfx) に変換します。 パスワードを設定することを求められますが、パスワードは後の手順で使うので忘れないようにします。

openssl pkcs12 -export -out ./client01.masawo-cvpn.test.pfx -inkey ./client01.masawo-cvpn.test.key -in ./client01.mawsawo-cvpn.test.crt

Client VPN エンドポイントの作成 (IT 管理者による IT 管理者 PC での作業)

Client VPN エンドポイントの作成前に、あらかじめサーバー証明書を ACM にインポートしておきます。 インポートにはサーバー証明書, サーバー秘密キー, CA ルート証明書が必要です。 AWS のドキュメント通りに証明書を生成した場合、クライアント証明書を ACM にインポートする必要はありません。

Client VPN エンドポイントは、AWS のドキュメントをもとに、相互認証を使用するように作成します。

クライアント VPN エンドポイント - AWS VPN 管理者ガイド

 

作成後、Client VPN クライアント設定ファイル (.ovpn) を、IT 管理者用 PC にダウンロードしておきます。

Client VPN クライアント設定ファイルの編集 (IT 管理者 による IT 管理者 PC での作業)

ダウンロードしておいた Client VPN クライアント設定ファイル (.ovpn) の内容を編集します。 クライアント証明書に紐づいた内容になるため、クライアント証明書ごとに Client VPN クライアント設定ファイルの内容が異なることになります (=クライアント証明書と Client VPN クライアント設定ファイルが 1 対 1 になります)。

まず、AWS のドキュメントをもとに、Client VPN エンドポイントの DNS 名を変更します。

ステップ 6: クライアント VPN エンドポイントの設定ファイルをダウンロードする - クライアント VPN の開始方法

(変更前の例)

remote cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443

(変更後の例)

remote asdfa.cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443

 

次に、クライアント証明書のサブジェクト名、または、拇印のどちらか 1 つを、Client VPN クライアント設定ファイル (.ovpn) の末尾に追記します。

(サブジェクト名の場合)

cryptoapicert "SUBJ:client01.masawo-cvpn.test"

(拇印の場合)

cryptoapicert "THUMB:902axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5487"

 

編集後の Client VPN クライアント設定ファイル (.ovpn) を保存しておきます。

証明書ストアへのインポート と 設定変更 (IT 管理者による 接続元 PC での作業)

PKCS #12 形式に変換したクライアント証明書のファイル (.pfx) を、証明書ストアにインポートします。

接続元 PC に IT 管理者ユーザーでログインし、クライアント証明書のファイル (.pfx) を接続元 PC にコピーします。

コピーしたクライアント証明書のファイル (.pfx) を右クリックし、[PFX のインストール] を行います。

 

証明書の保存場所として "ローカル コンピューター" を選択し [次へ]。

 

インポートする証明書ファイルはあらかじめ指定されているため、そのまま [次へ]。

 

PKCS #12 形式に変換した際に設定したパスワードを入力します。 また、"このキーをエクスポート可能にする" のチェックが外れている (=OFF になっている) ことを確認して [次へ]。

 

キーを保存する証明書ストアを自動選択することも可能ですが、今回は "個人" を明示的に指定しました。

 

設定内容を確認して [完了]。

 

certlm.msc を実行し [証明書 - ローカルコンピューター] を起動して、証明書が正しくインポートされたことを確認します。

 

このままでは、管理者権限のないユーザーは秘密キーを読むことができないため、読み取り権限を付与します。 インポートされた証明書を右クリック → [すべてのタスク] → [秘密キーの管理]。

 

接続元 PC 利用者のユーザー (ここでは user01) に対し、読み取り許可を付与します。

 

PKCS #12 形式に変換したクライアント証明書のファイル (.pfx) は、接続元 PC 上から削除するか、利用者のユーザーからは参照できないフォルダーに隔離しておきます。

参考

クライアント証明書への読み取り権限がない場合、Client VPN 接続を行うと以下のようなエラーで失敗します。

Xxx Mmm dd hh:nn:ss yyyy OpenSSL: error:C5066064:microsoft cryptoapi:CryptAcquireCertificatePrivateKey:キー セットがありません。
Xxx Mmm dd hh:nn:ss yyyy MANAGEMENT: Client disconnected
Xxx Mmm dd hh:nn:ss yyyy Cannot load certificate "SUBJ:client01.masawo-cvpn.test" from Microsoft Certificate Store
Xxx Mmm dd hh:nn:ss yyyy Exiting due to fatal error

OpenVPN クライアントのインストール と 設定 (IT 管理者 による 接続元 PC での作業)

OpenVPN クライアントアプリケーションは、OpenVPN 日本語サイトよりダウンロードすることができます。今回は Windows インストーラ (Windows 10 用) を使用しています。

接続元 PC に管理者ユーザーでログインし、OpenVPN クライアントアプリケーションのインストーラを実行します。今回インストールオプションは、すべてデフォルトのままとしました。

次に、編集済みの Client VPN クライアント設定ファイル (.ovpn) を、接続元 PC の以下のフォルダー直下、または、以下のフォルダーにサブフォルダーを作成してサブフォルダー内にコピーします。 OpenVPN クライアントアプリケーションのインストール先をデフォルトから変更した場合には、変更に合わせてフォルダを置き換えてください。

C:\Program Files\OpenVPN\config

 

必要に応じて、Client VPN の接続テストを行います。

ここまでで、IT 管理者が管理者権限で行う作業は完了です。

Client VPN エンドポイントに VPN 接続 (利用者による 接続元 PC での作業)

接続元 PC に、ローカル管理者権限がない利用者ユーザーでログインし、タスクトレイの OpenVPN GUI アイコンを右クリック → [接続]。

 

Client VPN エンドポイントに接続できました。

 

切断は、タスクトレイの OpenVPN GUI アイコンを右クリック → [切断] で可能です。

 

ローカル管理者権限がないユーザーで、クライアント証明書を使った相互認証による Client VPN の接続・切断ができました。

さいごに

ある日、社内 Slack で流れてきた以下の情報が、今回のブログのきっかけとなっています。

【APN Ambassadors ブログシリーズ第一弾】AWS Client VPN の認証で Windows PC の証明書ストアにあるクライアント証明書を使いたい - AWS JAPAN APN ブログ

クライアント証明書ファイルの管理の観点から、証明書ストアに保存したクライアント証明書が使えれば... と漠然と思っていたところ、これだ! という情報でした。 この情報を参考に実際に試しているうちに、もしかしたら Client VPN 利用者に管理者権限を与えなくても使えるかも、と試行錯誤を始めたところ、うまくいきました。

このブログ執筆時点では、証明書ストア内のクライアント証明書を参照することができない AWS 製の Client VPN クライアントアプリケーションでは、今回の使い方はできません。 将来のバージョンアップに期待しています!