AWS Client VPNを試してみる

##はじめに

2018/12/18に発表になったAWS Client VPNを試してみます。

https://aws.amazon.com/jp/about-aws/whats-new/2018/12/introducing-aws-client-vpn-to-securely-access-aws-and-on-premises-resources/

認証は、Active Directory連携とクライアント証明書による認証が可能です。今回は、Getting Startedにならってクライアント証明書を使用します。

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-getting-started.html

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/authentication-authrization.html#mutual

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/cd8ef54f-51aa-a018-8250-b7207c05f145.png)


LinuxサーバやMacでeasy-rsaツールを使って、ルート証明書やサーバ証明書、サーバ秘密鍵、クライアント証明書、クライアント秘密鍵を作成します。作成したRootCAやサーバ証明書、サーバ秘密鍵をACMに登録して、Clinet VPCエンドポイントに登録します。

ネットワーク構成は、以下になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/bffc80c8-828b-9e23-d94d-3c07e4d92976.png)

##手順
1. 接続テスト用のEC2インスタンスを作成して、Nginxを起動する
2. easy-rsaでルート証明書、サーバ証明書、サーバ秘密鍵、クライアント証明書、クライアント秘密鍵作成し、ACMに登録する
3. AWS Client VPNエンドポイントを作成する
4. 接続確認する

###ルート証明書、サーバ証明書、サーバ秘密鍵、クライアント証明書、クライアント秘密鍵作成、ACM登録

```
git clone https://github.com/OpenVPN/easy-rsa.git
Cloning into 'easy-rsa'...
remote: Enumerating objects: 1039, done.
remote: Total 1039 (delta 0), reused 0 (delta 0), pack-reused 1039
Receiving objects: 100% (1039/1039), 86
```

初期化します。

```
cd easy-rsa/easyrsa3
./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /easy-rsa/easyrsa3/pki
```

CA作成時に、Common Nameを入力します。

```
./easyrsa build-ca nopass

Using SSL: openssl OpenSSL 0.9.8zh 14 Jan 2016
Generating RSA private key, 2048 bit long modulus
...........+++
.............+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:sample

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/easy-rsa/easyrsa3/pki/ca.crt
```

サーバ証明書、秘密鍵を作成します。

```
./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 0.9.8zh 14 Jan 2016
Generating a 2048 bit RSA private key
.....+++
....................................+++
writing new private key to '/easy-rsa/easyrsa3/pki/private/server.key.To4RdoPhw4'
-----
Using configuration from /easy-rsa/easyrsa3/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Dec 22 05:18:37 2021 GMT (1080 days)

Write out database with 1 new entr
```

クライアント証明書、秘密鍵を作成する。

```
./easyrsa build-client-full client1 nopass

Using SSL: openssl OpenSSL 0.9.8zh 14 Jan 2016
Generating a 2048 bit RSA private key
.........+++
......................................................................................................................+++
writing new private key to '/easy-rsa/easyrsa3/pki/private/client1.key.daPAVRFGmP'
-----
Using configuration from /easy-rsa/easyrsa3/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1'
Certificate is to be certified until Dec 22 05:19:31 2021 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated
```

ACMに登録するためにルート証明書、サーバ証明書、サーバ秘密鍵を任意のディレクトリをコピーする。

```
mkdir ./custom_folder
cp pki/ca.crt ./custom_folder
cp pki/issued/server.crt ./custom_folder
cp pki/private/server.key ./custom_folder
```

ACMにルート証明書、サーバ証明書、サーバ秘密鍵を登録する。

```
cd ./custom_folder
aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt --region us-east-1
{
    "CertificateArn": "arn:aws:acm:us-east-1:******:certificate/27ec60c0-8937-4224-9c05-d88243239fde"
}
```

###AWS Client VPNエンドポイント作成
VPC DashboardでClent VPN Endpointをクリックする。
Create Client VPN Endpointをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/24866535-e016-9aa2-8317-e3c584c1d6cb.png)

Client IPv4 CIDRは、/22以上/16以下で指定する。
Server certificate ARNとClient certificate ARNは、どちらもサーバ証明書を指定する。
easy-rsaで作成するとサーバ証明書とクライアント証明書のルート証明書が同じなので。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f6bc9032-3e91-1c20-3bd7-816ced9fada7.png)

ログ設定やその他パラメータは必要に応じて記入して、Create Client VPN Endpointをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b5445c86-8f49-865b-8273-4700d281871c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/acd99fcc-93b2-1f83-3acb-62a9043080e5.png)

StateがPending-associateになります。VPC(Subnet)を関連付けることにより、Availableになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/89b35051-2cb5-7cf9-f712-2f147673950b.png)

AssociationsタブをクリックしAssociateをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/0fd5281f-7a7d-7878-9ff6-101ff92aaca7.png)

VPCとSubnetをAssociateをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/2b780481-7983-f32c-a0b3-aa1ce1cba416.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b5ec366a-4da9-edec-f946-a82362aeea7b.png)

AuthorizationタブをクリックしAuthorize Ingressをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/07dc05c8-89ae-641c-dc0e-7151566c77b2.png)

接続先ネットワークのCidrを入力して、Add authorization ruleをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/c6bc01a2-9d6a-8c05-745d-04b5a9174d28.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b8719025-59ff-5825-7feb-917444b1ba48.png)

セキュリティグループ設定


ここまででClinet VPN設定は完了。

###接続確認
セキュリティグループの設定を実施する。
関連するセキュリティグループは２つあります。VPN Endpointに紐付けられたセキュリティグループとテスト対象のEC2インスタンスに紐付けられたセキュリティグループです。
お試しなのでsource 0.0.0.0/0で設定します。

VPN Endpointに紐付けられたセキュリティグループ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/09aec8ca-b509-4bf3-6e5a-1fa80b16a994.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/cf314f0b-10d9-7dac-bcfe-3de8cc6b718d.png)

テスト対象のEC2インスタンスに紐付けられたセキュリティグループ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f4d7010f-8b6d-4025-f09d-7e43c5f71f1b.png)

OpenVPNクライアントのインストール。以下からdmgファイルをダウンロードして、インストールします。
https://tunnelblick.net/downloads.html

VPN EndpointからClient Configurationをダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/4eac6197-2ba3-be99-d3d5-99a230312408.png)

ダウンロードしたディレクトリに最初に作成した、クライアント証明書とクライアント秘密鍵をコピーします。

```
$ pwd
/easy-rsa/easyrsa
$ cp pki/private/client1.key /Downloads/
$ cp pki/issued/client1.crt /Downloads/
```

ダウンロードしたClient Configurationに以下を追記する。

```
cert client1.crt
key client1.key
```

接続確認する。ブラウザにEC2インスタンスのPrivate IPアドレスを入力する。
接続できないことを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/01677bba-3a57-dbed-fb4f-3c0de7002706.png)

###VPN接続を行う。
左のペインにconfigurationファイルをドラッグしてConnectをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/da3fa2db-da10-4ed4-881d-56fb8612f0cc.png)

緑色になればOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f8a26b01-fdb4-ab6a-5bbe-7bac7117dcc5.png)

ブラウザにEC2インスタンスのPrivate IPアドレスを入力する。
Welcomeページが表示されることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/45d5abee-615f-f4ff-cebf-642521419252.png)


##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。