目次

ClientVPNEndpointを試してみた

同僚から、PrivatesubnetのEC2にリモート接続する方法を聞かれた際に
改めて調べたところClientVPNなる存在を知り試してみた。

どうやらオレオレ証明書を利用して、ClientVPC⇔クライアント間を相互認証するらしい。
(ActiveDirectory認証もできるようですが、今回は相互認証のみで試しています。)

とりあえず、下記の図の環境を作ってみた。
DNSサーバを置いた理由は、VPN張った時に名前解決どうなるの?といった疑問があったからです。
※DNSの検証は力尽きたので後日やる

オレオレ証明書の作成/登録

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html#mutual
Windows上で作成したらOpenVPNにパラメータが~と怒られたので、結局Linuxで実施しました。
WindowsでもLinuxで発行した証明書でも認証できました。どこか間違っていたのですねすみません。

オレオレ証明書の作成

①LinuxOSにログインして、下記コマンドを実施する。

#ec2-userログオンして実施した。
cd /home/ec2-user
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3

#PKI 環境を初期化します。
./easyrsa init-pki

#認証機関 (CA) を構築します。
./easyrsa build-ca nopass  #このコマンドの後に「Common Name (eg: your user, host, or server name) [Easy-RSA CA]:」とでるが何も入力しないでエンターでOK

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

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

#必要なファイルを集約します。
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/server.crt ~/custom_folder/
cp pki/private/server.key ~/custom_folder/
cp pki/issued/client1.domain.tld.crt ~/custom_folder
cp pki/private/client1.domain.tld.key ~/custom_folder/
cd ~/custom_folder/

②~/custom_folder/内を確認する。
下記の5つのファイルが存在するはずです。無ければどこか間違えています。
・ca.crt
・client1.domain.tld.crt
・client1.domain.tld.key
・server.crt
・server.key

ACM(Certificate Manager)にサーバー証明書とキー、クライアント証明書とキーを登録する

①AWSCLIを使用してACM(Certificate Manager)に登録します。
<ありがちなミス>
・EC2インスタンスからAWSCLIコマンドを実行したが、EC2にAWSCLIが入っていない。
・EC2にAWSCLIは入っているが、EC2にACMのロールがアタッチorIAMユーザのキーでプロファイルを作成していない。

#サーバー証明書とキー(regionは自身の環境に置き換えてください。)
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region region

#クライアント証明書とキー(regionは自身の環境に置き換えてください。)
aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region region

②ACMを確認して、下記のように登録されていれば、証明書の登録は完了です。

サーバー証明書とキー、クライアント証明書とキーをクライアントPCに格納する

※後々クライアントPCのセットアップで使用するので、以下のファイルをSCP等でクライアントPCに格納しておいてください。
・client1.domain.tld.crt
・client1.domain.tld.key

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

最低限赤枠の設定をします。

・名前タグ:好きな名前で
・クライアントIPv4 CIDR:AWS内(VPC)で使用していないアドレス帯を指定する。サブネットマスクは/22以上で無いと作成できない。

■認証情報
・サーバー証明書 ARN:ACMに登録した「Server」の証明書
・認証オプション:相互認証の使用を選択
・クライアント証明書 ARN:ACMに登録した「client1.domain.tld」の証明書

■その他のオプションパラメータ
・VPC ID:接続したいEC2が置いてあるVPCを選択
・セキュリティグループID:接続したいEC2が置いてあるsubnetを選択
・セキュリティグループを選択:接続したいEC2が置いてあるsubnetのDefaultセキュリティグループを選択
 ※ここはまだ検証していないがDefaultセキュリティグループは以下の設定になっている。
  インバウンドルール→タイプ:全てのトラフィック、プロトコル:すべて、ポート範囲:すべて、ソース:選択したセキュリティグループID
  アウトバウンドルール→タイプ:すべてのトラフィック、プロトコル:すべて、ポート範囲:すべて、ソース:0.0.0.0/0

②設定したら[クライアントVPNエンドポイントの作成]をクリックする。

ClientVPN設定画面

③ClientVPN作成後のイメージ

クライアントVPNエンドポイントの追加設定

※この章の追加設定しないと待てど暮らせど設定が終わりません。

関連付けの設定

①[関連付け]タブの[関連付け]をクリックします。

②以下のように設定し[関連付け]をクリックします。
・VPC:接続したいEC2の置いてあるVPC
・関連付けるサブネットの選択:接続したいEC2の置いてあるサブネット

関連付けの設定

①[認証]タブの[受信の承諾]をクリックします。

③以下のように設定し[認証ルールの追加]をクリックします。
・アクセスを有効にする送信先ネット:接続したいEC2の置いてあるVPCのCIDR
・アクセスを付与する対象:すべてのユーザにアクセスを許可する

④しばらくするとClientVPNの状態が[使用可能]になります。※この待ち時間でクライアント側の設定をします。

クライアントPCの設定

Windows端末前提で記載します

OpenVPNのインストール

こちらのページのWindows版の手順を参照して、OpenVPNのインストールのみ実施します。

クライアント設定ファイルの作成

①クライアントVPNエンドポイントの画面から、作成したClientVPNを選択し[クライアント設定のダウンロード]をクリックします。

②クライアント設定ファイルを以下の通り編集します。
クライアントPCに格納の格納先が「C:\custom_folder」の前提で記載します。

③クライアント設定ファイルをエディタで開きます。
④設定ファイルの末尾に、以下の記述を追記して保存します。※\←バックスラッシュは2つずつ書く

cert C:\\custom_folder\\client1.domain.tld.crt
key C:\\custom_folder\\client1.domain.tld.key

<設定ファイルの完成イメージ>

クライアント設定ファイルのインポート

①タスクバーにOpenVPNのアイコンがあるので、右クリック→[Inport file]から、編集したクライアント設定ファイルを選択します。

②再度、タスクバーにOpenVPNのアイコンを、右クリック→[接続]をクリックすると以下の画面が表示されVPN接続完了となります。

動作確認

構成図のEC2(10.0.2.67)に無事SSH接続できました。

今回はとりあえず繋げてみたお試し設定でしたが、チューニングできそうな項目が色々ありましたね。
仕事で使うことになったら考えよう。※DNSの検証は・・・後日やる・・・ぞ