fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

AWS Client VPNを試してみる

AWS Client VPNってもっと注目されても良いですよね?(唐突) と思って本記事を書きました。

テレワークが一般的になるなか、AWSのVDIサービスであるWorkSpacesが注目されていますが、AWSVPC環境へプライベート接続ができるClient VPNもテレワーク時代に活用できると思います。 既にClient VPNも注目されているかもしれませんが、私自身試したことがなかったため、接続までの手順を本記事にまとめてみます。

Client VPNの何が嬉しいのか

ネットワーク機器の設定が不要で、より簡単にVPN接続ができる点がClient VPNの利点かと思います。

Client VPNが登場するまでは、AWSVPN接続をする場合はAWS Site-to-Site VPNを使用する必要がありました。これを使用する場合、接続元にルーター(ソフトウェアでもOK)を用意して接続設定をする必要がありました。設定サンプルはAWSからダウンロードできますが、ルーター設定って、ネットワークの設定をしたことが無い人にとってはちょっとハードルが高いですよね?ルーター機器の購入費、保守費もかかります。 (私個人の印象です)

じゃあClient VPNはどこまで簡単なのか、とうことで試していきたいと思います。

結論からいうと、AWS Site-to-Site VPNよりは簡単ですが、それなりに作業量はありました。ただ接続元のPCとAWS環境さえあれば気軽に試せる点は良いですね。

VPN接続を試してみる

公式ドキュメントの手順を参考に進めていきます。

0.事前準備

以下を用意しておきます。

  • 接続元のクライアントPC

 私の場合(本記事)はWindows10のPCを使用します。

  • 接続先のVPC

 以下のようなプライベートサブネットのみのVPCを用意します。VPCのCIDRは10.10.0.0/16で作成しています。

 f:id:fu3ak1:20200812121102p:plain

クライアントPCからプライベートサブネット内のEC2にSSH接続ができるというところをゴールにします。

1.証明書の作成

VPN接続の認証は Active Directoryによるアカウント管理, サーバ証明書・クライアント証明書による相互認証、その両方の3種から選択できますが、今回は証明書による相互認証で試していきます。

認証に必要な証明書を作成します。今回はAWS上のCloud9(Linuxサーバ)で作成していきます。

# Open VPNソースのダウンロード、ディレクトリ移動
$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3

# PKI環境の初期化
$ ./easyrsa init-pki

# 認証機関 (CA) を構築
# Common Nameは任意の名前を入力します。
$ ./easyrsa build-ca nopass

# サーバー証明書とキーを生成
$ ./easyrsa build-server-full server nopass

# クライアント証明書とキーを生成
$ ./easyrsa build-client-full client1.domain.tld nopass

# サーバー証明書とキー、およびクライアント証明書とキーをcert_folderフォルダにコピーして移動
$ mkdir ~/cert_folder/
$ cp pki/ca.crt ~/cert_folder/
$ cp pki/issued/server.crt ~/cert_folder/
$ cp pki/private/server.key ~/cert_folder/
$ cp pki/issued/client1.domain.tld.crt ~/cert_folder
$ cp pki/private/client1.domain.tld.key ~/cert_folder/
$ cd ~/cert_folder/

これでサーバー証明書とクライアント証明書のペアが出来ました。この時点でちょっと面倒くさい感がありますが、基本的にはコマンドをそのまま実行すればOKです。

2.証明書をACMへインポート

作成した証明書をACMAWS Certificate Manager)へインポートする必要があります。 AWS CLIでインポートする場合は以下のコマンドで実行できます。今回はCloud9からそのままインポートを実行します。 マネジメントコンソールからインポートも可能です。

# サーバー証明書とキーをインポート
$ aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1
# クライアント証明書とキーをインポート
$ aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region ap-northeast-1

ACMの画面で見ると以下のようにインポートされているのがわかります。 f:id:fu3ak1:20200812115101p:plain

3.クライアント VPN エンドポイントの作成

VPCの画面からクライアントVPNエンドポイントを作成していきます。

f:id:fu3ak1:20200812115839p:plain

以下のように入力していきます。

  • 名前タグ:任意の名前を入力します。無しでも大丈夫です。
  • クライアント IPv4 CIDR:PCが所属するネットワークのCIDRを指定します。VPCのCIDRとは別です。
  • サーバー証明書 ARN:ACMにインポートしたサーバ証明書を指定します。
  • 認証オプション:相互認証の使用を選択します。
  • クライアント証明書 ARN:ACMにインポートしたクライアント証明書を指定します。

f:id:fu3ak1:20200812151607p:plain

以降の設定は全てデフォルトのままエンドポイントを作成します。

f:id:fu3ak1:20200812122940p:plain

4.サブネットの関連付け

作成したVPNエンドポイントをVPCのサブネットに関連付けしていきます。 エンドポイント一覧から作成したエンドポイントを選択し、関連付けをクリックします。

f:id:fu3ak1:20200812123428p:plain

関連付けするVPCとサブネットを選択します。

f:id:fu3ak1:20200812123448p:plain

しばらくすると関連付けが完了して使用可能な状態になります。

f:id:fu3ak1:20200812125421p:plain

5.クライアントのネットワークへのアクセスを承認する

サブネットが存在する VPC へのアクセスをクライアントに承認するために、承認ルールを作成します。

f:id:fu3ak1:20200812125908p:plain

アクセスを有効にする送信先ネットに接続するVPC全体のCIDRを指定して、「すべてのユーザーにアクセスを許可する」を選択します。

f:id:fu3ak1:20200812130044p:plain

ここまでで、VPC側のVPNエンドポイントを設定できました。

f:id:fu3ak1:20200812140900p:plain

6.クライアント VPN エンドポイントの設定ファイルをダウンロードする

ここからはクライアントPC側の設定です。

エンドポイントの画面から設定ファイルをダウンロードします。

f:id:fu3ak1:20200812132711p:plain

ダウンロードしたファイルをテキストエディタで開き、以下の通り編集します。

6-1. クライアント証明書とキーの追記

末尾に以下の通り追記します。

<cert>
※最初に作成したclient1.domain.tld.crt(-----BEGIN CERTIFICATE-----~-----END CERTIFICATE-----)の内容※
</cert>

<key>
※最初に作成したclient1.domain.tld.key(-----BEGIN PRIVATE KEY-----~-----END PRIVATE KEY-----)の内容※
</key>

6-2. VPN エンドポイントの DNS 名の先頭にランダムな文字列を追加

例. (AWS公式ドキュメント内容)

cvpn-endpoint-0102bc4c2eEXAMPLE.prod.clientvpn.us-west-2.amazonaws.com

asdfa.cvpn-endpoint-0102bc4c2eEXAMPLE.prod.clientvpn.us-west-2.amazonaws.com

7. クライアントアプリケーションの入手、設定

OpenVPN ベースのクライアントアプリケーションであれば何でも良いのですが、AWS公式のクライアントアプリケーションがあるためそれを使用します。

こちらからダウンロードしてインストールします。 ダウンロードしたファイルをクリックして手順に従えば簡単にインストールできます。

aws.amazon.com

アプリケーションを起動して、先ほどの設定ファイルをプロファイルとして登録していきます。

f:id:fu3ak1:20200812134420p:plain

f:id:fu3ak1:20200812134645p:plain

f:id:fu3ak1:20200812134807p:plain

f:id:fu3ak1:20200812134855p:plain

接続準備完了となったので、接続してみます。

f:id:fu3ak1:20200812135137p:plain

接続済みとなればOKです。

f:id:fu3ak1:20200812135424p:plain

PCのIPアドレスを確認してみると、「クライアント IPv4 CIDR」に設定したネットワークのIPアドレス「10.20.1.2」が設定されていることがわかります。

f:id:fu3ak1:20200812155315p:plain

8. サーバー(EC2)接続

プライベートサブネットにEC2を作成し、クライアントPCからEC2のプライベートIPでSSH接続してみます。 ※EC2の作成手順は本記事では割愛します。

f:id:fu3ak1:20200812141723p:plain

EC2のプライベートIPは、「10.10.11.188」なのでここにSSH接続します。

f:id:fu3ak1:20200812141829p:plain

EC2のセキュリティグループは、VPC内からSSHを許可しておきます。 VPNエンドポイントが所属するサブネットから許可してあればOKです。(エンドポイント用のENIがVPC内にできる)

f:id:fu3ak1:20200812142911p:plain

クライアントPCのTeratermで接続します。

f:id:fu3ak1:20200812142458p:plain

Amazon Linuxのため、ユーザーにec2-userを指定し、EC2用に作成したキーペアを指定します。

f:id:fu3ak1:20200812142523p:plain

接続できました!

f:id:fu3ak1:20200812142536p:plain

まとめ、感想

いかがでしたでしょうか?最初から設定していくと多少手間はかかりますね。ネットワーク機器の設定ほどの手間は無いので、Site-to-Site VPN用のネットワーク環境整備が難しい場合や、限られた端末がアクセスする場合(本番接続端末など)に活用できるかなと思います。

VPN接続の場合、接続していない時のPCのセキュリティをどう守るかも観点になるので、そういった観点も踏まえて、より簡単にセキュアなネットワーク環境ができると良いですね。