AWS Client VPNを使ってプライベートなEC2インスタンス(Windows Server)にRDPしてみた

VPCの機能であるクライアントVPNを使用し、プライベートなEC2(Windows Server)に対して直接RDPしてみましたので、その手順を記していきます。
2019.06.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、大前です。

プライベートなEC2にアクセスする時、踏み台サーバー経由でアクセスする事が多いのではないでしょうか。

直近、プライベートなWindows Serverに対してリモートデスクトップ(以下RDP)する必要があった為、VPCの機能である AWS Client VPN を使用したRDPをやってみました。

ちなみに、クライアントVPNエンドポイントを使ってsshする方法は既に素晴らしいブログがありますが、せっかくなのでブログに残していきます。

[AWS]踏み台をワンチャンなくせる!?VPC接続にClient VPNを使ってみよう

上記記事と公式ページを参考に実施していきます。

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

やりたいこと

プライベートサブネットに存在するEC2(Windows Server)に対して、クライアントVPNを使用してローカルPCからRDPします。

やってみた

サーバーおよびクライアント証明書とキーの生成

今回は「相互認証」というものを使用するため、証明書とキーの生成が必要となります。

このページ を参考にそれぞれ生成していきます。

# リポジトリからクローン
git clone https://github.com/OpenVPN/easy-rsa.git

# ディレクトリ移動
cd easy-rsa/easyrsa3

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

# CAの構築
./easyrsa build-ca nopass

## Common Nameを聞かれるので適当に入力
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:oomae-work

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

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

# ディレクトリを作成し、生成された証明書等をコピーし、該当ディレクトリに移動
mkdir tmp
cp pki/ca.crt tmp/
cp pki/issued/server.crt tmp
cp pki/private/server.key tmp
cp pki/issued/client1.domain.tld.crt tmp
cp pki/private/client1.domain.tld.key tmp
cd tmp

# サーバー証明書とキーをACMにアップロード
aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt
## 成功するとARNが返却される
{
 "CertificateArn": "arn:aws:acm:ap-northeast-1:0123456789:certificate/hogehoge-hoge-hoge-hoge-hogehoge"
}

# クライアント証明書とキーをACMにアップロード
aws acm import-certificate --certificate file://client1.domain.tld.crt --private-key file://client1.domain.tld.key --certificate-chain file://ca.crt
## 成功するとARNが返却される
{
 "CertificateArn": "arn:aws:acm:ap-northeast-1:0123456789:certificate/hogehoge-hoge-hoge-hoge-hogehoge"
}

コンソール上でも証明書がインポートされている事が確認出来ます。

クライアントVPNエンドポイントを作成する

コンソール上でクライアントVPNエンドポイントを作っていきます。

VPCのサイドメニューからクライアントVPNエンドポイントを選択し、クライアントVPNエンドポイントの作成を押下します。

以下の様に設定し、作成します。

  • 名前タグ ... クライアントVPNエンドポイントの名前
  • クライアント IPv4 CIDR ... 作成するエンドポイントに設定されるCIDR 既存のVPCと被らない様に注意
  • サーバー証明書ARN ... 上記で作ったサーバー証明書
  • 認証オプション ... 相互認証の使用
  • クライアント証明書ARN ... 上記で作ったクライアント証明書
  • 接続ログ記録やDNS設定等は今回ナシ

サブネットをクライアントVPNエンドポイントに紐付ける

今回アクセスしたいサブネットをVPNエンドポイントに紐付けます。

作成したエンドポイントを選んだ状態で、「関連付け」→「Associate」

今回アクセスしたいVPC、サブネットをそれぞれ選択して作成します。

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

承認ルールを設定して、クライアントからのアクセスを許可する必要があります。

作成したエンドポイントを選んだ状態で、「認証」→「Authorize Ingress」

今回は公式ページに則り、全てのユーザーにアクセスを許可する様な設定にします。

  • アクセスを有効にする送信先ネット ... アクセスしたいVPCを指定
  • アクセスを付与する対象 ... すべてのユーザーのアクセスを許可する

クライアント設定のダウンロード

ここまで設定出来たら、クライアント設定のダウンロード を押下します。

ダウンロードした設定ファイルの末尾に以下を追記します。パスは適宜修正してください。

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

こうして出来上がった設定ファイルを使って、VPN接続を行うことが出来ます。

具体的な接続手順は このページ を参考ください。

接続してみる

準備が整ったのでいよいよRDPしてみます。使用するのは Parallels Client です。

対象インスタンスのローカルIPを指定します。セキュリティグループの設定は事前に確認しておきましょう。

そしてOKを押下すると・・・

接続できました!

あとがき

クライアントVPNを使ってプライベートなEC2(Windows Server)にRDPしてみました。

今までは 踏み台にRDP → 踏み台からさらにRDP といったかなりめんどくさい作業をしていた事もあった為、直接RDPできるのはめちゃくちゃ嬉しいですね・・・!

手順も複雑という訳ではないので、プライベートなEC2にアクセスする手段として今後の選択肢の一つとなるのではないでしょうか。

以上、コンサルティング部の大前でした!