AWS Client VPN でのクライアント証明書認証

 

新型肺炎による緊急事態宣言がようやく解除され今後だんだんと通常出勤が可能になっていく世の流れではありますが、パンデミックの第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 接続をするという構成です。絵で示すと以下のような感じでシンプルなれど、証明書のない端末からのアクセスを排除する構成です。

AWS Client VPN検証構成図

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

  • AWS Client VPN エンドポイント (東京リージョン)
    ※ VPN エンドポイントの作成方法については、本コラムでは証明書に関するところ以外は省きます。
  • Windows 10 バージョン 1909 / OpenVPN GUI for Windows 11.15.0.0/2.4.9
  • iPhone7 Plus / iOS 13.4.1 / OpenVPN Connect 3.1.2 (3096)


テスト用証明書の発行と ACM へのインポート

Gléas でサーバ証明書を発行してファイルダウンロードし、openssl pkcs12 コマンドなどでサーバ証明書・秘密鍵・ルート証明書を取り出します。
その後、AWS 管理コンソールで Amazon Certificate Management (ACM) を開き、[証明書のインポート]ボタンからサーバ証明書テキストデータを [証明書本文] に、秘密鍵テキストデータを [証明書のプライベートキー] に、ルート証明書テキストデータを [証明書チェーン] に貼り付けます。

AWS Client VPN

以下のようにインポートされたことがわかります。

AWS Client VPN


VPC エンドポイントの設定

AWS 管理コンソールを VPC のサービス管理画面に移動して、[仮想プライベートネットワーク (VPN) ] > [クライアント VPC エンドポイント] と進み、仮想 VPN サーバの作成をします。

  • [サーバ証明書 ARN ]に、ACM にインポートしたサーバ証明書のリソースネーム (ARN) を選択します。
  • [認証オプション] では、”相互認証の使用” にチェックをします。”ユーザーベースの認証を使用” もチェックすると証明書とパスワード認証(Active Directory や SAML) の併用も可能なようですが、今回は試していません。
  • [クライアント証明書 ARN ]に、ACM にインポートしたサーバ証明書 ARN を選択します。

AWS Client VPN

エンドポイントの作成後に、画面上部の [アクション] ボタンより [クライアント証明書CRLのインポート] をクリックし、失効リスト (PEM フォーマット) のテキストデータをペーストしてインポートします。

AWS Client VPN

失効リストのアップロードは以下の 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 ファイル) をダウンロードしておきます。

AWS Client VPN


Windows クライアントの設定

Gléas からクライアント証明書をインポートしておきます。こんな感じです。
インポートできたら証明書ストア (certmgr.msc) を見て、インポートした証明書の拇印を確認します。

AWS Client VPN

ダウンロードした ovpn ファイルをテキストエディタで開いてその拇印の情報を追加します。

cryptoapicert "THUMB:拇印"

※なお本コラム執筆時点では cryptoapicert ディレクティブは AWS さんが配布する専用の VPN クライアントアプリでは使えません。

その設定ファイルを OpenVPN GUI クライアントにインポートし接続を試すとすんなりと VPN セッションを張ることができました。

AWS Client VPN

コンソールの [接続] タブを見ると、ログインに成功していることがわかります。

AWS Client VPN


iOS クライアントの設定

あらかじめ Gléas からクライアント証明書ファイル (.p12 ファイル) をダウンロードしておき、macOS に付属する Apple Configurator 2 を使って、OpenVPN 用の接続プロファイルを新規作成します。
最初に、[資格情報] でダウンロードした .p12 ファイルを指定します。
次に、[VPN] で以下をおこないます。

  • [接続のタイプ] は、”カスタム VPN” を選択
  • [識別子] には、”net.openvpn.connect.app” を入力
  • [サーバ]は、”DEFAULT” を入力
  • 実際の接続情報は、カスタムデータを使って設定します。AWS からダウンロードした.ovpnファイルをテキストエディタで開いて同様に設定していきます。
    (接続先のサーバ名は、OpenVPN Connect がランダムホストネームに非対応のようだったので “*.” を追記しています)
    キー: 値 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
  • [ユーザ認証] は、”証明書” を選択
  • [認証情報]は、資格情報で設定した証明書を選択

AWS Client VPN

その後、.mobileconfig ファイルを作成し、iPhoneにメールで送ってそのプロファイルをインポートします。

AWS Client VPN

取り込んだ後に OpenVPN Connect アプリを起動すると、VPN 接続設定ができておりそのまま VPN 接続することが可能です。

AWS Client VPN

ユーザログインの制御

クライアント証明書を失効し、その失効情報を含む失効リストが AWS VPN エンドポイントにアップロードされたときに VPN ログインができなくなることを確認しました。