AWS Client VPN構築・設定（相互認証、プライベートDNS）

# はじめに
AWSのClientVPNを利用したクライアントVPN構築・設定の行った際のメモ。
再度構築設定する際に参考にするために記録する。

# 前提
- 認証方式は、相互認証
- Route53プライベートDNSの利用
- サーバ証明とクライアント証明書は同一環境（EC2）で作成

# 各種証明書作成
## 1. OpenVPN easy-rsaをダウンロード
```
$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
$ tar zxfv EasyRSA-3.0.7.tgz
$ cd EasyRSA-3.0.7
```
## 2. PKI環境を初期化
※サーバ証明書の有効期限を延長させる場合は事前に下記のように設定する
（EASYRSA_CERT_EXPIREは、日数）

```
$ cp vars.example vars
$ vi vars
set_var EASYRSA_CERT_EXPIRE    365
$ ./easyrsa init-pki
```
## 3. 認証機関 (CA) を構築

```
$ ./easyrsa build-ca nopass
common nameは指定なしで進む（デフォルト）
```
CAのルート証明書が作成される　（デフォルトで有効期限は10年）

pki/ca.crt

下記コマンドで内容を確認

```
$ openssl x509 -text -noout -in pki/ca.crt 
```
Validityに有効期限がひょうじされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/32ce6834-6923-11a5-0839-b5364f50d9ec.png)


## 4. サーバーとクライアント向けに証明書とキーを生成

### サーバー向け
```
$ ./easyrsa build-server-full server nopass
```
### クライアント向け
```
$ ./easyrsa build-client-full {クライアント識別名} nopass
```
接続元クライアントごとに作成する。

## 5. 主要ファイルを別フォルダにコピーしておく
サーバー証明書とキー、およびクライアント証明書とキーを別フォルダへコピー

```
$ mkdir ~/vpn_key/
$ cp pki/ca.crt ~/vpn_key/
$ cp pki/issued/server.crt ~/vpn_key/
$ cp pki/private/server.key ~/vpn_key/
$ cp pki/issued/{クライアント識別名}.crt ~/vpn_key/
$ cp pki/private/{クライアント識別名}.key ~/vpn_key/
$ cd ~/vpn_key/
```

## 6. ACMに証明書をインポート
「クライアント証明書の認証機関 (発行者) がサーバー証明書の認証機関 (発行者) と異なる場合にのみ、クライアント証明書を ACM にアップロードする必要があります。」
今回は、クライアント証明書とサーバー証明書で同じ認証機関を利用しているため、サーバー証明書だけをACMに登録します。

```
$ aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region {リージョン}
```
※ACMにアクセスできるようにEC2（サーバ）のIAMロールに対し「AWSCertificateManagerFullAccess 」ポリシーを一時的に付与しておく必要あり。

インポートした証明書が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/7e600564-7a2b-2621-b40e-f7fed8521fdc.png)

インターネットアクセスや他のVPN接続を許可していない環境のEC2である場合、SSMセッションマネージャで接続することになる。この場合、作成した証明書をダウンロードするには一度S3にアップロードして、ダウンロードする方法で対応した。

事前にEC2のIAMロールにS3のアクセス権（一時的であれば「AmazonS3FullAccess」ポリシー）を付与しておく。
S3にバケットも用意しておく。必要に応じてバケットポリシーも設定しておくと良い。

S3へコピー

```
$ aws s3 cp ./{クライアント識別名}.crt s3://{バケット名}
$ aws s3 cp ./{クライアント識別名}.key s3://{バケット名}
```

# クライアントVPNエンドポイントの作成
### クライアント IPv4 CIDR
CIDRは、VPCと重複しないように指定する。
今回は「192.168.0.0/16」とした。
### サーバー証明書 ARN
先程登録したACMのサーバ証明書を選択
### 認証オプション
「相互認証の使用」を選択
### クライアント接続の詳細を記録しますか?
必要であれば「はい」にして、予め用意したCloudWatchロググループを選択

### クライアント接続ハンドラを有効化しますか?
接続元IPによるアクセス制御を行いたい場合など有効にし、制御ロジックを実装したLambdaファンクションを作成して選択。

### DNS サーバー 1 IP アドレス
Route53によるプライベートDNSを利用する場合、VPCのCIDRに合わせてAmazon-provided DNSのIPを指定する。
VPCのCIDRが「10.0.0.0/16」の場合は、「10.0.0.2」を指定する。

### トランスポートプロトコル
「UDP」を選択

### スプリットトンネルを有効にする
Route53によるプライベートDNSを利用する場合は、無効にする必要がある。

### VPC ID
接続先VPCを選択

### VPN ポート
「443」を選択
必要に応じて変更

### セルフサービスポータルを有効にする
相互認証の場合は利用できないため無効にしておく。

## エンドポイント作成後
「関連付」でVPN接続で接続可能にするサブネットを設定する。
「認証」で接続先の許可CIDRを設定

# VPN接続設定ファイル
「クライアント設定のダウンロード」ボタンを選択し、「downloaded-client-config.ovpn」をダウンロード
ダウンロードした設定ファイルをテキストエディタで開き、下記の通り<cert>と<key>情報を追記する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/f93ad713-c0b6-2575-c128-4087b3cae4b9.png)

※クライアント証明書と秘密鍵を別途ファイルで管理する場合は、パスを指定する方法でも良いが、モバイル端末（iosやAndroid）の場合は、設定ファイルに含めた方法で配布すること。

# VPNクライアントをインストール
## AWS公式のクライアントアプリの場合
AWS Clinet VPNアプリをダウンロード
https://aws.amazon.com/jp/vpn/client-vpn-download/

インストールが完了後、起動してプロファイルの登録を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/b6feebb0-6281-5fa0-2c41-f0dc2cec350f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/cc32a51a-6dff-e4b4-9f68-898ddd673fc2.png)
設定ファイル「xxxxx-client-config.ovpn」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/d83ef876-a388-7c08-2f7d-de3926f4a790.png)
接続ボタンを選択して接続できれば完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/fb6572a1-53f0-82e8-086a-418871ab3333.png)

## OpenVPNクライアントアプリの場合
下記より、インストーラをダウンロード
https://www.openvpn.jp/download/

下記手順でインストール
https://www.openvpn.jp/document/install-windows/

Windowsの場合は、スタートメニューから「OpenVPN GUI」を選択
画面右下のアイコンにOpenVPNのアイコンが表示されたら、右クリックで「Import file」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/3806184d-8cc1-550f-eec5-b44dae1deedb.png)
VPN接続設定ファイル「xxxxx-client-config.ovpn」を選択。
OpenVPNのアイコンを右クリックでインポートしたファイル名を選択して「接続」を選択します。