Client VPNで相互認証とAD認証(AD Connector経由)を使ってアクセスしてみた

2020.11.30

こんにちは、コンサル部の鈴木(純)です。

Client VPNを利用する機会があったので試していこうと思います。

概要

Client VPNではクライアントの認証に以下3つの認証方法を利用することができます。

  • Active Directory 認証 (ユーザーベース)
  • 相互認証 (証明書ベース)
  • シングルサインオン (SAML ベースのフェデレーション認証) (ユーザーベース)

また以下の組み合わせでも認証を利用できるようになっています。

  • 相互認証とフェデレーション認証
  • 相互認証と Active Directory 認証

今回は「相互認証と Active Directory 認証」の組み合わせを使ってClient VPN接続ができるかを試していきます。

やってみた

お試しするために以下のような環境を用意しました。

AD ConnectorとClient VPNの部分はAD構築後じゃないとできないので、VPCやSubnet、セキュリティグループなんかの前提部分は作成済の前提でやっていきたいと思います。

今回AD Connector を経由したADの認証を行っているため、以下の前提条件を満たしている前提ということに注意してください。

ADを構成する

今回は以下のエントリを参考にWindows Server2016上にADを作成しています。

ドメイン名は「cm-clientvpn.local」にとしました。

一度ドメインコントローラーとしての初期設定のため再起動した後、ドメインへのユーザーを追加してみます。

「Active Directory ユーザーとコンピューター」を開いてユーザーが追加できます。

ここではClient VPNをテストするためのユーザー「cm-test」を作成しました。

さらに、今回はAD Connectorを利用するので以下の事前準備も行っておきましょう。

証明書を作成する

相互認証に利用する証明書を作成していきます。今回はADを作成しているEC2上で以下の手順通りに作成しました。

最初にOpenVPNをインストールする必要がありますが、インストール前にローカルハードドライブにインストールするように設定を変更するのを忘れないようにしましょう。

手順通りに進めると、サーバー証明書とクライアント証明書のファイルが取得できます。

サーバー証明書はACMにインポートする必要があるので、EC2からCLIでインストールしてもいいですし、コンソールから行っても大丈夫です。

今回はドキュメントにあった以下のコマンドでEC2からCLIでインポートしました。

aws acm import-certificate --certificate fileb://"C:\Program Files\OpenVPN\easy-rsa\keys\server.crt" --private-key fileb://"C:\Program Files\OpenVPN\easy-rsa\keys\server.key" --certificate-chain fileb://"C:\Program Files\OpenVPN\easy-rsa\keys\ca.crt" --region ap-northeast-1

クライアント証明書は接続元のPCから使う必要があるので、EC2から以下2ファイルを取得しておきましょう。

  • client1.domain.tld.crt
  • client1.domain.tld.key

AD Connector作成

マネコンからDirectory Serviceへいき、AD Connector を選択して次へ。

今回はスモールを選択して次へ

事前に作成しておいた、VPCとプライベートサブネットを二つ選択します。

以下の画面では、EC2のADに設定した情報を入力していきます。今回はADとDNSを同じEC2上にインストールしているため、DNS IPアドレスはEC2のプライベートIPを指定しています。

サービスアカウントのユーザーは、先ほど紹介した以下エントリで作成したユーザーです。

そのままディレクトリの作成まで進めましょう。

以下の画面でステータスがアクティブになるのを確認できればAD Connectorの作成は完了です。

Client VPNエンドポイント作成

Client VPNエンドポイントの作成は以下のような感じで設定しました。

認証オプションは「相互認証の使用」、「ユーザーベースの認証を使用」を選択し、ユーザーベース認証には「Active Directory認証」を選びます。

クライアント証明書の選択部分については、公式ドキュメントには以下のような記載があったためサーバー証明書と同じArnを指定して作成しています。

クライアント証明書を ACM にアップロードする必要があるのは、クライアント証明書の CA がサーバー証明書の CA と異なる場合だけです。

関連付けはプライベートサブネット2つを指定して作成。認証はVPCのCidrを指定しています。

クライアント設定ファイルに追記する

さっそくClient VPNへ接続したいところですが、相互認証を使う場合にはクライアント証明書が必要なため、ちょっとだけ準備が必要です。「クライアント設定のダウンロード」から接続に必要なファイルを取得します。

ダウンロードしたファイルをテキストエディタなどで開いて、以下のようにクライアント証明書のパスを追記しましょう。certkeyの後にクライアントキーと証明書のフルパスを書き込んで保存します。

client
dev tun
proto udp
remote cvpn-endpoint-0f5fe47b538d89635.prod.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
~
~
~
-----END CERTIFICATE-----

</ca>
auth-user-pass

reneg-sec 0

cert /Users/suzuki.jun/client1.domain.tld.crt # crtファイルの格納場所フルパス
key /Users/suzuki.jun/client1.domain.tld.key # keyファイルの格納場所フルパス

接続してみる

それでは実際に接続してみましょう。

OpenVPNクライアントに先ほど編集した設定ファイルをインポートして接続してみると、ユーザーメイトパスワードが聞かれます。ADに作成したユーザーの認証情報を入力しましょう。私は「cm-test」で作成した認証情報を使用しています。(AD Connectorで使用するユーザーではない方)

無事Client VPNを使って相互認証とAD認証を使った接続ができました!

まとめ

Client VPNの相互認証とAD認証の組み合わせを試してみました。

このご時世ではリモート環境が求められることも多いかと思いますので、是非Client VPNをセキュアに利用してみてください。