Help us understand the problem. What is going on with this article?

AWSとのClient VPNの張り方(忘備)

AWSとのClient VPNの張り方(忘備)

環境

  • デバイス(クライアント)
    • OS: iOS 13.1.3
  • 認証局、証明書作成環境
    • OS: Ubuntu 18.04.2 LTS (Bionic Beaver)

作業イメージ

image.png

作業① サーバ証明書、クライアント証明書作成、インポート

  • ローカルコンピュータに OpenVPN Easy-RSA レポジトリのクローンを作成します。
miamo@ubuntu:~$ git clone https://github.com/OpenVPN/easy-rsa.git
Cloning into 'easy-rsa'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 1568 (delta 4), reused 10 (delta 3), pack-reused 1554
Receiving objects: 100% (1568/1568), 5.63 MiB | 2.15 MiB/s, done.
Resolving deltas: 100% (730/730), done.
miamo@ubuntu:~$ cd easy-rsa/easyrsa3
miamo@ubuntu::~/easy-rsa/easyrsa3$
  • 初期化します。
miamo@ubuntu:~/easy-rsa/easyrsa3$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/miamo/easy-rsa/easyrsa3/pki
miamo@ubuntu:~/easy-rsa/easyrsa3$
  • 新しい PKI 環境を初期化し、新しい認証機関 (CA) を構築します。パスフレーズは不要なのでnopassオプションを指定します。
miamo@ubuntu::~/easy-rsa/easyrsa3$ ./easyrsa build-ca nopass
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating RSA private key, 2048 bit long modulus (2 primes)
.....+++++
................+++++
e is 65537 (0x010001)
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]:openvpn #任意
 
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/miamo/easy-rsa/easyrsa3/pki/ca.crt
 
miamo@ubuntu::~/easy-rsa/easyrsa3$
  • 秘密鍵の作成から証明書の署名までまとめて行うので、build-server-fullを実行して、サーバー証明書とキーを生成します。パスフレーズは不要なのでnopassオプションを指定します。
miamo@ubuntu::~/easy-rsa/easyrsa3$ ./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating a RSA private key
................................................................................................+++++
...........+++++
writing new private key to '/home/miamo/easy-rsa/easyrsa3/pki/easy-rsa-313.nNPqog/tmp.KctDJX'
 -----
Using configuration from /home/miamo/easy-rsa/easyrsa3/pki/easy-rsa-313.nNPqog/tmp.R1SYTG
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 Mar  7 07:50:41 2022 GMT (825 days)
 
Write out database with 1 new entries
Data Base Updated
 
miamo@ubuntu::~/easy-rsa/easyrsa3$
  • 秘密鍵の作成から証明書の署名までまとめて行うので、build-client-fullを実行して、クライアント証明書とキーを生成します。パスフレーズは不要なのでnopassオプションを指定します。
miamo@ubuntu::~/easy-rsa/easyrsa3$ ./easyrsa build-client-full client nopass
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating a RSA private key
......................+++++
..................+++++
writing new private key to '/home/miamo/easy-rsa/easyrsa3/pki/easy-rsa-1249.5x3I8d/tmp.6vgYCl'
 -----
Using configuration from /home/miamo/easy-rsa/easyrsa3/pki/easy-rsa-1249.5x3I8d/tmp.8e1zDA
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client'
Certificate is to be certified until Mar  8 01:47:32 2022 GMT (825 days)
 
Write out database with 1 new entries
Data Base Updated
 
miamo@ubuntu::~/easy-rsa/easyrsa3$ 
  • ルート証明書(pki/ca.crt)、サーバ証明書(pki/issued/server.crt)、サーバ秘密鍵(pki/private/server.key)をACM登録用のフォルダへコピー
miamo@ubuntu:~/easy-rsa/easyrsa3$ mkdir ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ cp pki/ca.crt ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ cp pki/issued/server.crt ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ cp pki/private/server.key ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ cp pki/issued/client.crt ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ cp pki/private/client.key ./acm
miamo@ubuntu:~/easy-rsa/easyrsa3$ ls -l ./acm/
total 16
 -rw------- 1 miamo miamo 1188 Dec  4 17:12 ca.crt
 -rw------- 1 miamo miamo 4472 Dec  4 17:13 client.crt
 -rw------- 1 miamo miamo 1708 Dec  4 17:13 client.key
 -rw------- 1 miamo miamo 4588 Dec  4 17:12 server.crt
 -rw------- 1 miamo miamo 1704 Dec  4 17:13 server.key
  • ルート証明書(pki/ca.crt)、サーバ証明書(pki/issued/server.crt)、サーバ秘密鍵(pki/private/server.key)を ACM にアップロードして、登録します。
miamo@ubuntu:~/easy-rsa/easyrsa3$ cd acm
miamo@ubuntu:~/easy-rsa/easyrsa3/acm$ aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt --region ap-northeast-1
{
    "CertificateArn": "arn:aws:acm:ap-northeast-1:************:certificate/d9939cb4-b36a-4b9e-87a9-f63981d3ddc0"
}
miamo@ubuntu:~/easy-rsa/easyrsa3/acm$



  • ACM を確認します。 image.png

作業② クライアントVPNエンドポイント作成、設定

マネジメントコンソールの場合

  • VPC ダッシュボードからクライアント VPN エンドポイントを選択し、クライアントVPNエンドポイントの作成をクリックします。 image.png
  • Client IPv4 CIDRは、/22以上/16以下で指定し、VPNのCIDRと被らないようにしておく、Server certificate ARNとClient certificate ARNはクライアント側もサーバ証明書を指定する。
  • ※CloudwatchLogStreamは事前に作成しておく。 image.png
  • 作成できたことを確認 image.png
  • 関連付けタブを選択し、関連付けを選択 image.png
  • 作成したクライアントVPNエンドポイントに通信対象のサブネットを関連付ける。※紐づけたサブネット単位で0.15USD/時間(東京リージョンの場合)かかる。 image.png
  • 紐づいたことを確認します。 image.png
  • 認証タブを選択肢、受信の承認をクリックします。 image.png
  • 通信を許可するCIDRを入力して、承認ルールの追加をクリックします。 image.png
  • 追加されたことを確認 image.png
  • ルートテーブルタブを選択して、ルート作成をクリックします。 image.png
  • インターネットへのルーティングテーブルを追加します。 image.png
  • 作成されたことを確認します。 image.png

AWS CLIから設定する場合

  • 『aws ec2 create-client-vpn-endpoint』を実行してクライアントVPNエンドポイントを作成 ※CloudwatchLogStreamは事前に作成しておく。
miamo@ubuntu:~$ aws ec2 create-client-vpn-endpoint \
>    --client-cidr-block "172.16.16.0/22" \
>    --server-certificate-arn "arn:aws:acm:ap-northeast-1:************:certificate/bfd08d0b-83c0-4b0b-bed1-42b7f17685b2" \
>    --authentication-options "[{\"Type\":\"certificate-authentication\",\"MutualAuthentication\":{\"ClientRootCertificateChainArn\":\"arn:aws:acm:ap-northeast-1:************:certificate/bfd08d0b-83c0-4b0b-bed1-42b7f17685b2\"}}]" \
>    --connection-log-options "{\"Enabled\":true,\"CloudwatchLogGroup\":\"aws_ansible_conf_flowlogs_role\",\"CloudwatchLogStream\":\"OpenVPN\"}" \
>    --description "OpenVPN" \
>    --transport-protocol "udp" \
>    --no-split-tunnel \
>    --tag-specifications "[{\"ResourceType\":\"client-vpn-endpoint\",\"Tags\":[{\"Key\":\"Name\",\"Value\":\"OpenVPN\"}]}]" \
>    --region ap-northeast-1
    {
        "ClientVpnEndpointId": "cvpn-endpoint-09cecb24e2693f2e8",
        "Status": {
            "Code": "pending-associate"
        },
        "DnsName": "cvpn-endpoint-09cecb24e2693f2e8.prod.clientvpn.ap-northeast-1.amazonaws.com"
    }
  • 『aws ec2 associate-client-vpn-target-network』を実行してクライアントVPNエンドポイントにサブネットを紐づけ。※CloudwatchLogStreamは事前に作成しておく。
miamo@ubuntu:~$ aws ec2 associate-client-vpn-target-network \
>    --client-vpn-endpoint-id cvpn-endpoint-09cecb24e2693f2e8 \
>    --subnet-id subnet-0e23779a71da80fec
{
    "AssociationId": "cvpn-assoc-00e0542f29d674770",
    "Status": {
        "Code": "associating"
    }
}
  • 『aws ec2 authorize-client-vpn-ingress』を実行して、許可する通信先を設定します。
miamo@ubuntu:~$ aws ec2 authorize-client-vpn-ingress \
>    --client-vpn-endpoint-id cvpn-endpoint-09cecb24e2693f2e8 \
>    --target-network-cidr "172.16.0.0/20" \
>    --authorize-all-groups
{
    "Status": {
        "Code": "authorizing"
    }
}
  • 『aws ec2 create-client-vpn-route』を実行して、インターネットへのルーティングテーブルを追加します。
miamo@ubuntu:~$ aws ec2 create-client-vpn-route \
>    --client-vpn-endpoint-id cvpn-endpoint-09cecb24e2693f2e8 \
>    --destination-cidr-block 0.0.0.0/0 \
>    --target-vpc-subnet-id subnet-0e23779a71da80fec
{
    "Status": {
        "Code": "creating"
    }
}

作業③ デバイスに証明書登録

OpenVPN設定用ファイル作成

マネジメントコンソールからクライアント設定ファイルを作成する場合

  • クライアント設定用のファイルをダウンロードします。 image.png
  • ダウンロードしたファイルにクライアント証明書とキーを追記するとファイルが完成します。 image.png
AWS CLIからのクライアント設定ファイルを作成する場合
  • 『export-client-vpn-client-configuration』を実行してクライアント設定用のファイルをダウンロードした後、クライアント証明書と鍵をマージするとファイルが完成します。
miamo@ubuntu:~/easy-rsa/easyrsa3$ aws ec2 export-client-vpn-client-configuration \
>    --client-vpn-endpoint-id cvpn-endpoint-003fc8dedffd7e2ec \
>    --output text > client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ echo "<cert>" >> client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ cat acm/client.crt | grep -v Certificate: | grep -v "  " >> client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ echo "</cert>" >> client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ echo "<key>" >> client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ cat acm/client.key >> client.ovpn
miamo@ubuntu:~/easy-rsa/easyrsa3$ echo "</key>" >> client.ovpn

OpenVPN設定用ファイルをiphoneへ登録

  • 以下の画像通り作成したファイルをメール等で送信して証明書を登録して、設定画面のVPNで接続します。(左から右へ)
  • ※モバイル端末に設定ファイルを登録する際は、リモートのエンドポイントにfooとかつけないと名前解決できずに接続できない。 image.png

参考

AWS Client VPNを試してみる

AWS Clinet VPNを分かりやすく解説してみる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away