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

PSA（Partner Solutions Architect）の相澤です。
本記事は、2019年度に選出された「Japan APN Ambassador 2019」 の方々に、AWS JAPAN APN ブログ にて技術情報をお届けいただく【APN Ambassadors ブログシリーズ】の第一弾となります。今回は、APN Ambassador である株式会社BeeX 那須 隆 様より、寄稿いただきました。

本記事は、2020年4月28日時点の内容となります。最新の情報につきましては、AWS公式ドキュメントを参照ください。

======================================================================================
BeeX の那須と申します。

いろんな会社が在宅勤務を開始した旨のニュースを最近よくみますね。弊社も同じく原則在宅勤務になっており、私もほとんど家から出ることなく仕事をしています。弊社のお客様でも同様の状況となっている方が多いです。

在宅勤務になることで問題となるのが、PC を使った業務で利用するシステムへのアクセスですね。普段はオフィスからアクセスできていたものを、家や外出先からリモートアクセスできるようになっていないと仕事になりません。そういった場合に、AWS のサービスを活用すると 、そのような仕組みは比較的簡単に作成できます。例をあげると、AWS Client VPN、Amazon WorkSpaces、Amazon AppStream 2.0（以下、AppStream 2.0）などがあります。以下のようなAWS ドキュメントを参考に構築するだけで簡単に環境が作成できますね。

クライアント VPN の使用開始

Amazon WorkSpaces 高速セットアップを開始する

Amazon AppStream 2.0 の使用開始: サンプルアプリケーションのセットアップ

ドキュメントに記載のある内容に対して追加で作業を実施して、解決した内容がありましたので、本記事ではそのことについてお伝えしたいと思います。

リモートアクセスの仕組みを決めた過程

あるお客様からリモートアクセス環境を新規導入したいとのご要望をいただいた時のお話です。事前のヒアリングで確認できた主な要件は以下の通りです。

家から AWS 上で稼働している業務システムにアクセスしたい

ユーザの PC（Windows 10）に入っているクライアントソフトやデータをそのまま使いたい

認証は複数要素で行いたい

1 秒でも早くリモートアクセスできる環境を整えたい

上記要件から、Amazon WorkSpaces も候補にあったのですが、ユーザ様の操作が大きく変わってヘルプデスクにかかる負荷を大きくすることは避けたい思いがありました。また、SSL-VPN であれば過去にご利用された経験がある方が多いと思い、導入のハードルも高くないと考えました。ですので、今回は AWS Client VPN をご提案することにしました。アーキテクチャーの概要図は以下の通りです。

AWS Client VPN の導入にあたり困ったこと

AWS Client VPN の環境を作成するのは、簡単です。こちらの AWS ドキュメントを参考に作業を進めるだけで、SSL-VPN の仕組みが完成します。

簡単ですが、以下に環境作成のステップについて、上記ドキュメントの抜粋を記載します。

ステップ 1 ：サーバーおよびクライアント証明書とキーを生成する

ステップ 2 ：クライアント VPN エンドポイントを作成する

ステップ 3 ：クライアントの VPN 接続を有効にする

ステップ 4 ：クライアントのネットワークへのアクセスを承認する

ステップ 5 ：(オプション) 追加のネットワークへのアクセスを有効にする

ステップ 6 ：クライアント VPN エンドポイントの設定ファイルをダウンロードし内容を調整する

ステップ 7 ：クライアント VPN エンドポイントに接続する

しかし、ステップ 6 の中にある 、クライアント証明書を利用する場合の接続設定ファイルの調整だけ注意が必要です。

多くのお客様で IT の運用の姿を見ると、クライアント証明書は Windows PC の証明書ストアに入っていることがほとんどです。私が経験してきた環境がたまたまそうだっただけ、という可能性もありますが、皆様の環境ではいかがでしょうか？ 証明書ストアにクライアント証明書を入れて運用している場合、このドキュメントに書かれている内容では運用することができません。クライアント証明書が OS ファイルとしてどこかに置かれ、それを VPN 接続設定が読み込む前提だからです。この方法だと、以下のような課題があります。

せっかく証明書ストア内のクライアント証明書で運用しているのにそれが活かされない

クライアント証明書が別の PC にコピーされることによって業務で指定された PC 以外から接続できてしまう

クライアント証明書が OS ファイルとして置かれている以上、誤操作等で漏洩する可能性がある

証明書ストア内にあるクライアント証明書を利用して認証できないか？ そう思って 1 日かけて探してみました。

解決までの道のり

まず、AWS Client VPN のドキュメントをすみずみまで何度も読みましたが、答えは出ませんでした。AWS Client VPN は OpenVPN ベースのクライアントを使って接続できることから、OpenVPN と様々なキーワードで検索しました。それでも答えは出ませんでした。そもそも日本語でそれらしき情報が見当たりません。

ほぼ 1 日中、思いつく限りの英単語を使ってインターネットで検索し続けた結果、とあるコミュニティの QA ページが引っかかりました。そこには、CryptoAPI を使ってください、と書かれていました。

CryptoAPI を調べて見ると、OpenVPN のページが出てきました。どうやら Microsoft 社独自の API のようです。

コミュニティの QA ページと OpenVPN のページを参考にして実際に VPN 接続できたので、その内容をご紹介します。

Windows PC の証明書ストア内のクライアント証明書を使った認証の設定方法

こちらのドキュメントのステップ 6 だけを別の方法にするだけとなります。

ドキュメントの手順では、以下のようにクライアント証明書とプライベートキーを指定することになっています。

cert /path/client1.domain.tld.crt
key /path/client1.domain.tld.key

これを以下に置き換えます。サブジェクト名と拇印、どちらか 1 つだけで問題ありません。

cryptoapicert "SUBJ:クライアント証明書のサブジェクト名"
もしくは
cryptoapicert "THUMB:クライアント証明書の拇印の文字列"

クライアント証明書のサブジェクト名や拇印は、以下の手順で確認できます。

クライアント証明書がローカルコンピュータの証明書ストアに保存されている場合は certlm.msc を、ユーザの証明書ストアに保存されている場合は certmgr.msc を開きます。

個人の証明書の中にあるクライアント証明書を開きます。

クライアント証明書を開いたら、それぞれ「サブジェクト」「拇印」の値を確認し、設定ファイルに追加します。

一行追加するだけとはいえ、さすがに VPN の利用者全員に上記画像の内容を探してもらうのも権限等の問題で難しい場合が多いかと思います。その場合には、PowerShell 等で以下のように接続設定ファイルの末尾に自動で追加するようにしましょう。
以下の PowerShell スクリプト例では、クライアント証明書の発行者が TestIssuer のサブジェクト名を取得し、test.ovpn という接続設定ファイルに cryptoapicert の行を追加します。最後の Encoding 部分は、接続設定ファイルの文字コードに合わせてください。

$conf_path = Join-Path $env:USERPROFILE OpenVPN\config\test.ovpn
if( -not (Select-String $conf_path -Pattern "cryptoapicert" -Encoding UTF8 -Quiet)) {
cd Cert:\LocalMachine\My\
$addconf = "`ncryptoapicert `"SUBJ:" + ((Get-ChildItem | where { $_.Issuer -eq "CN=TestIssuer" }).Subject -replace("CN=","")) + "`""
echo $addconf | Add-Content $conf_path -Encoding UTF8
}

接続設定ファイルに cryptoapicert の行を追加できたら準備完了です。VPN 接続クライアントに接続設定ファイルをインポートして接続テストしてみてください。問題なく VPN 接続できると思います。

注意が必要なポイント

VPN 接続する PC には、AWS から提供されているクライアントではなく OpenVPN クライアントを利用してください。本記事執筆時点では、以下の 2 点のポイントに注意が必要です。

AWS から提供されているクライアントでは、cryptoapicert が接続設定ファイルの中に記載されていると設定を読み込めない

AWS Client VPN では公式にはデバイス認証に対応しておらず、AWS から提供されているクライアントでは Windows の証明書ストアに保存された情報を用いて認証できない

OpenVPN クライアントはこちらからダウンロード可能です。

また、OpenVPN クライアントは管理者権限で起動してください。一般ユーザ権限で起動すると、VPN 接続時に証明書ストア内のクライアント証明書を参照する部分で以下のようなエラーが OpenVPN クライアントのログに出力されます。

Fri Apr 10 12:21:23 2020 OpenSSL: error:C5066064:microsoft cryptoapi:CryptAcquireCertificatePrivateKey:キーセットがありません。
Fri Apr 10 12:21:23 2020 MANAGEMENT: Client disconnected
Fri Apr 10 12:21:23 2020 Cannot load certificate "SUBJ:client.test" from Microsoft Certificate Store
Fri Apr 10 12:21:23 2020 Exiting due to fatal error

まとめ

Windows PC の証明書ストア内にあるクライアント証明書を利用した認証による VPN 接続の流れをお伝えしました。これにより、新たな認証の仕組みを作ることなく家や外出先からでも安全に AWS 上の社内システムにアクセスして業務を行うことができるようになりました。同じ悩みを持たれた方の助けになれば幸いです。

======================================================================================

以上が、APN Ambassador である株式会社BeeX 那須 隆 様より、寄稿いただいた内容となります。那須様、ありがとうございました！第二弾もご期待いただければと思います。