AWS

[OpenVPN]AWS上にVPNサーバーを構築してみる

投稿日:

概要

作成したもの

  • プライベートネットワークに接続できるVPNサーバ

使用した技術・ライブラリ

  • AWS
  • OpenVPN

動機

AWSを使ったシステム構成において、多数の拠点に設置されたクライアントからAWS上のサーバに接続するが、その通信はセキュアに行いたい、という要件が求められる場合があります。
今回はその要件を実現する方法の一つとして、Amazon EC2にOpenVPNサーバを構築し、WindowsクライアントからSSL-VPN接続を行いたいと思います。

アーキテクチャ概要

外部に公開されたネットワークにVPNサーバを構築し、このサーバ経由することで外部からでもプライベートネットワークへ接続させます。

構築手順

サーバ構築

上記の図に合わせてAWS上にVPNを作成し、プライベートとパブリックのサブネットを作成します。
それぞれのサブネットにEC2インスタンス(AmazonLinux)を作成し、パブリック側にはグローバルIPを付与しておきます。
ちなみにVPNサーバに使うインスタンスはt2.microで充分です。
今回はOpenVPNの構築がメインなので詳しい構築手順は割愛させていただきます。

OpenVPNの設定

パブリックに構築したEC2インスタンスにSSHでアクセスし、サーバーを設定していきます。

openvpnをインストール

$ sudo yum -y install openvpn
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                              | 2.1 kB  00:00:00     
amzn-updates                                                                           | 2.5 kB  00:00:00     
(1/5): amzn-main/latest/group_gz                                                       | 4.4 kB  00:00:00     
(2/5): amzn-updates/latest/group_gz                                                    | 4.4 kB  00:00:00     
:
Complete!

EasyRSAをgitからダウンロード

$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
--2018-03-09 00:53:56--  https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
Resolving github.com (github.com)... 192.30.255.112, 192.30.255.113
:
2018-03-09 00:53:58 (102 KB/s) - ‘EasyRSA-3.0.4.tgz’ saved [37721/37721]

EasyRSAを解凍

$ tar xfvz EasyRSA-3.0.4.tgz 
EasyRSA-3.0.4/
EasyRSA-3.0.4/easyrsa
:

OpenVPNを設定

$ sudo mv EasyRSA-3.0.4 /usr/local/EasyRSA
$ cd /usr/local/EasyRSA/
$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/local/EasyRSA/pki

$ ./easyrsa build-ca
Generating a 2048 bit RSA private key
..........................................................................................................................................................................+++
................................+++
writing new private key to '/usr/local/EasyRSA/pki/private/ca.key.GwTcINrb4P'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/local/EasyRSA/pki/ca.crt

$ ./easyrsa gen-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.........................................+.........................+...................................................................................................................................................................................+...................................................................................................+................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................+........................................................+..........................+...................................+..............................................................................+......................................................................................................................................................................+.....+............................................................................................+....................................................................................................................................................................................................+.......+..........................................+...........................+........................................................................................................................................................................................+........................................................................................................................................................................................................................................................+...................+.........................+............+...................................................................+........................................................................+.........................................................................................................+................................................+..............................................................................................................................................+..............................................................................................................................+.........................+....+............................+........................+..................................................................+.....+.......................................+..+.........................................................................................................................+..............................................................+...............................+.......................................................................+.....................................................................................+........................................................+............................................................+..........................................................................................................................................................................................................................................................................................................+................................................................+...............................................................................................+.......................+..............................+..............................................................................................................+.................................+.........+.....................................................................................................................................................+.....................................................................................................++*++*

DH parameters of size 2048 created at /usr/local/EasyRSA/pki/dh.pem

ユーザ作成。VPNを利用するユーザの数だけ実行します。

[ec2-user@ip-172-31-64-187 EasyRSA]$ ./easyrsa gen-dh
[ec2-user@ip-172-31-64-187 EasyRSA]$./easyrsa build-server-full server nopass
Generating a 2048 bit RSA private key
.............+++
................+++
writing new private key to '/usr/local/EasyRSA/pki/private/server.key.s2vqc9pq2Z'
:
Write out database with 1 new entries
Data Base Updated
$ ./easyrsa build-client-full client1 nopass
Generating a 2048 bit RSA private key
....+++
...+++
writing new private key to '/usr/local/EasyRSA/pki/private/client1.key.MNksnrvo58'
:
Write out database with 1 new entries
Data Base Updated

openvpnに作成した鍵をコピー

$ sudo cp pki/ca.crt /etc/openvpn/
$ sudo cp pki/issued/server.crt /etc/openvpn/
$ sudo cp pki/private/server.key /etc/openvpn/
$ sudo cp pki/dh.pem /etc/openvpn/dh2048.pem

openvpnのConfigを設定する。push route のところは、OpenVPNを経由してアクセスを許可するプライベートネットワークを記載する。

$ sudo vi /etc/openvpn/server.conf

port 443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.0.0"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
verb 3

net.ipv4.ip_forward = 0 → net.ipv4.ip_forward = 1 に変更

$ sudo openvpn --genkey --secret /etc/openvpn/ta.key
$ sudo vi /etc/sysctl.conf 

$ sudo sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
$ sudo service openvpn start
$ sudo chkconfig openvpn on

AWS上の設定

OpenVPNのEC2インスタンスのSecurity Groupで、Inbound Rulesに「Protocol:TCP、Port Range:443、Source: 0.0.0.0/0」 を追加。

OpenVPNからPushするセグメントに設置されている各EC2インスタンス(例:Webサーバ)のSecurity Groupで、
Inboud RulesにOpenVPNのEC2インスタンスのSecurity GroupからのSSH、HTTP、HTTPSを追加。

これで、WebサーバにはOpenVPNを経由したアクセスのみ、許可されるようになる。

OpenVPNのEC2インスタンスのENI(仮想NIC)のIDを調べる。
EC2の画面から、Network Interfaceにアクセス。

この例だと、OpenVPNのEC2インスタンスのENIは"eni-3ff17467"。

OpenVPN経由でアクセスされるセグメント(この例だと、Web/AP用セグメント(10.0.2.0/24)と
DB用セグメント(10.0.3.0/24)のRoute Tablesに、以下のエントリを追加する。

Destination 暗号化通信用セグメント
Target OpenVPNのEC2インスタンスのENI ID

OpenVPNのSource/Dest Checkを無効化する。
OpenVPNのEC2インスタンスを右クリックし、Networking→Change Source/Dest Checkを選択。
Yes, Disableをクリック。

クライアント側の設定

今回接続元のクライアントはWindowsを想定しており、VPNUXhttps://www.plum-systems.co.jp/vpnux-client/を使用して接続していきます。

以下、VPN接続を行うクライアントPC上で作業を行う。
前準備として、OpenVPNのEC2インスタンスより、以下のファイルをクライアントPCに
ダウンロードしておくこと。以下は、ユーザ"client1"用に作成した各種認証用ファイル。

/usr/local/EasyRSA/pki/ca.crt
/usr/local/EasyRSA/pki/private/client1.key
/usr/local/EasyRSA/pki/issued/client1.crt
/etc/openvpn/ta.key

以下の様に入力

プロファイル名 <任意のプロファイル名>
VPNサーバー
ポート 443
プロトコル TCP

「LZO圧縮を有効にする」のチェックを外す
「証明書認証(PKI)を使用」にチェックをつける
「CA証明書」「証明書」「秘密鍵」に、OpenVPNのEC2インスタンスからダウンロードしたファイルを読み込み、設定を行う。

暗号アルゴリズムに「AES-256-CBC」を設定する
「TLS-Auth HMAC署名を使用」のチェックをつける
「共有鍵」に、OpenVPNのEC2インスタンスからダウンロードしたファイルを読み込み、設定を行う。

接続を確認する

結論・感想

OpenVPNを今回AWS上に構築しました。
新しい環境の構築が必要なたびに設定方法を忘れてしまうので、
検索し直し記憶をたどりながら構築していましたが、これでもう大丈夫。

-AWS

Copyright© AIなんて気合いダッ! , 2020 All Rights Reserved Powered by AFFINGER5.