AWS Client VPNの環境作ってみた
【概要】
AWS EC2にサーバを立てて、easy-RSAの証明書を管理する環境
クライアント証明書を発行して、PCに証明書データをインポートすることで、固定のグローバルIPアドレスで、外部にアクセスできるようになった
下記に行った内容を記載していきます。
1.VPCの作成
AWS VPCのコンソールから、VPCを作成します。「お使いのVPC」 ⇒ 「VPC作成」をクリック。
任意の値などで設定し「VPCを作成」をクリックしてください。
IPアドレスの値に関しては、注意する点があります。今回は検証用環境の為どんなCIDRブロックでも問題ありませんが、実際のシステムの場合は他システムとの間でプライベートIPで通信するなどの要件が出てくる可能性があるので、他ネットワークと重複しない値を利用することをおすすめします。
CIDR値のレンジ調査ツール https://www.ipaddressguide.com/cidr
2.パブリックサブネットの作成
VPN用のパブリックサブネットを作成します。 「サブネット」 ⇒ 「サブネットを作成」 をクリックします。
「VPC ID」は上記1.で作成したVPCを選択します。「サブネット名」は、任意ですが【パブリック】等と記載しておくと分かりやすいです。
※このあと【プライベートサブネット】も作成しますが、同じサブネットメニューに一覧表示される為、分かりやすいnameにしておくと良いです
アベイラビリティーゾーンは任意の場所を指定してください。
既にAWS環境下でサブネットが複数作成されている場合は、既存のサブネットと重複しないレンジの「IPv4 CIDR ブロック」を指定しましょう。 設定入力が完了したら「サブネットを作成」をクリックします。
3.NATゲートウェイの作成
「NATゲートウェイ」 ⇒ 「NATゲートウェイを作成」 をクリックします。
「名前」は任意の入力となります。
「サブネット」は、上記2. で作成した【パブリックサブネット】を選択します。
「Elastic IP」は、【Elastic IPを割り当て】をクリックすると、任意のIPが自動で割り振られます。ここで設定するIPアドレスが、VPN接続時に利用される固定のグローバルIPアドレスとなります。 既にElastic IPで作成済みのIPアドレスを指定することも可能ですので、状況に合わせて設定してください。
「タグ」は、任意で設定してください。 設定入力が完了したら「NATゲートウェイを作成」をクリックします。
4.ルートテーブルの作成
「ルートテーブル」 ⇒ 「ルートテーブルを作成」をクリックします
「名前」は任意の入力となります。
「VPC」は上記1.で作成したVPCを選択します。
「タグ」は任意で設定して「ルートテーブルを作成」をクリックします。
ルートテーブルのメニューに戻ると、作成したルートテーブルが表示されてますのでクリック選択します。
下にスクロールし「ルート」タブ ⇒ 「ルートを編集」 をクリックします。
「ルートを追加」をクリックして、送信先の値「0.0.0.0/0」を入力します。
ターゲットは、上記 3. で設定した【NAT ゲートウェイ ID】を指定します。
「変更を保存」をクリックします。
送信先の値については、例として「0.0.0.0/0」を入力しておりますが、意味合いとしては、すべての IPv4 アドレスを表しております。 ネットワーク環境などによってCIDRの範囲を任意で指定して設定することも可能なので、環境に合わせて設定してみてください。
5.プライベートサブネットの作成
「サブネット」 ⇒ 「サブネットを作成」 をクリックします。
「VPC ID」は上記1.で作成したVPCを選択します。「サブネット名」は、任意ですが【プライベート】等と記載しておくと分かりやすいです。※既に【パブリックサブネット】を作成していますが、同じサブネットメニューに一覧表示される為、分かりやすいnameにしておくと良いです
アベイラビリティーゾーンは上記 2. で作成した「パブリックサブネット」と同じアベイラビリティーゾーンを指定してください。
上記 2. 等で作成済みの、既存のサブネットと重複しないレンジの「IPv4 CIDR ブロック」を指定しましょう。 設定入力が完了したら「サブネットを作成」をクリックします。
サブネットのメニューに戻ると、作成したプライベートサブネットが表示されてますのでクリック選択します。
下にスクロールし「ルートテーブル」タブ ⇒ 「ルートテーブルの関連付けを編集」 をクリックします。
「ルートテーブルID」で、上記 4. で作成したルートテーブルを指定して「保存」をクリックします。
6.ACM の設定(証明書・キーの生成)
6-1.AWS(EC2)上で、証明書や認証機関(CA)・キーの生成や管理を行う場合
①EC2の構築(AMIはOS:Ubuntu を例に記載します)
インスタンスの起動
「インスタンス」 ⇒ 「インスタンスを起動」 をクリックします。
名前とタグ
任意の入力となりますが、「キー:Name」「値:Ubuntu」などとしておくと、設定内容が探しやすくなります。
AMI(Amazonマシンイメージ)
例としてUbuntu(Linux)を選択しています。
インスタンスタイプ
デフォルトの無料枠だと「t2.micro」になっておりますが、スペックが足らず重たい動作になっていたので、有償の「t2.medium」を指定しています。
キーペア
EC2にアクセスする際、必要になります。既に作成済みのキーでも良いですし、新規でキーを作成頂いても良いです。状況に合わせて設定してください。
キーペアのタイプ:RSA を選択しました。 キーペア名:任意のものを入力する
必ず【キーペアのダウンロード】を行ってください。EC2にアクセスする際、必要となりますので。
pemファイルは、安全な場所に保管してください。
ファイアウォール(セキュリティグループ)
EC2へのアクセスを、IPアドレス等で制御する設定になります。デフォルトは、どこから誰でも接続可能な「0.0.0.0/0」になっておりますが、セキュリティの観点から制御することをおススメします。
ストレージを設定
任意となりますで、必要に応じて指定してください。私は一旦、デフォルトのまま設定を行いました。あとから変更可能なので。
設定に問題ないことを確認して【インスタンスの作成】をクリックします。その後、インスタンスを起動してください。
②SSHでEC2にアクセスする際
作成したインスタンスを開き「接続」をクリックすると、ユーザーを作成していない、初回は
【ユーザー名】に記載の名前
ダウンロードした秘密鍵
上記1.2.で、SSH接続する。
③作ったUbuntu Serverにリモートデスクトップ接続できるようする
SSH接続で、EC2(Ubuntu Server)にアクセスし、コマンド入力/送信します。
# アップデートの適用
> sudo apt update
# パッケージの更新適用
> sudo apt upgrade
# リモートデスクトップ用にユーザーを作成(〇〇のところに、任意のユーザー名を入力)
> sudo adduser 〇〇
# 作成したユーザーをsudoグループに参加させる
> sudo gpasswd -a 〇〇 sudo
# デスクトップ環境のパッケージを検索
> apt search ubuntu-desktop
# ubuntu-desktopをインストール
> sudo apt install ubuntu-desktop
# オープンソース Remote Desktop Protocol のサーバソフトウェア(xrdp)のパッケージを検索
> apt search xrdp
# xrdpをインストール
> sudo apt install xrdp
# バージョンの確認
> xrdp -v
# new_cursorsを無効化する
> ls -la /etc/xrdp/ | grep xrdp
> sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
# xrdpサービスを再起動
> sudo systemctl restart xrdp
# xrdpサービスを有効化する
> sudo systemctl enable xrdp.service
> sudo systemctl enable xrdp-sesman.service
> systemctl list-unit-files -t service | grep xrdp
# 作成したユーザーに切り替える
> su 〇〇
> cd ~
> pwd
> /home/〇〇
# 環境変数を設定する
> DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
# .xsessionファイルを作成する
> cat <<EOF > ~/.xsessionrc
# Authentication Requiredダイアログを回避できるように設定する
> cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
AWS EC2のセキュリティグループを設定する(リモートデスクトップ接続する為)
タイプ : RDP
ルール : TCP
ポート : 3389
ソース : EC2にアクセスするパブリックIPアドレス(xxx.xxx.xxx.xxx/32)
ソースの部分で、インバウンド(アクセス可能)なIPを指定できる(IP制御が可能)
補足となりますが、リモートデスクトップ接続経由でアクセスした際、キーボードの日本語入力(Japanese (Mozc)や、データ保管場所をGUIで確認したいという要望がある際は、下記を参考に確認や設定をしてみると、解決するかもしれません。
キーボード日本語入力の方法(Japanese (Mozc)の選択が出来ない場合)
https://www.hiroom2.com/2018/04/29/ubuntu-1804-ibus-mozc-ja/エディタGEDITのインストールや起動コマンド等(データ保管場所をGUIで確認)https://www.aise.ics.saitama-u.ac.jp/~gotoh/GeditInUbuntuonWSL.html
6-2.サーバ証明書や認証機関(CA)・キーの生成やクライアント証明書の発行
①サーバー証明書の発行・秘密鍵生成など※RSAのインストール手順込み(例は、easy-rsaとなります)
EC2(Ubuntu)の「端末(term)」を開き、下記のコマンド入力/送信を行います。
> sudo apt update
> sudo apt install openvpn easy-rsa
> mkdir ~/easy-rsa
> ln -s /usr/share/easy-rsa/* ~/easy-rsa/
# 〇〇は、EC2(Ubuntu)にログインしたユーザー名で良いかと思います。
# 権限の設定なので、サーバー証明書の発行や秘密鍵生成を実施したいユーザー名を指定してください。
> sudo chown 〇〇 ~/easy-rsa
> chmod 700 ~/easy-rsa
> cd ~/easy-rsa
> nano vars
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "tokyo"
# 〇〇には、任意の地域(ご自身の住んでいる市区町村など)を入力。例として沖ノ島(okinoshima)
set_var EASYRSA_REQ_CITY "okinoshima"
# 任意の組織名を入力(例として DigitalOcean にしています)
set_var EASYRSA_REQ_ORG "DigitalOcean"
# 〇〇には、任意のメールアドレスを入力
set_var EASYRSA_REQ_EMAIL "〇〇"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_DIGEST "sha512"
> ./easyrsa init-pki
補足:下記画像、赤枠内のファイルやフォルダが<$HOME/easy-rsa>配下のディレクトリに保存されていないと、pki は生成されませんのでご注意ください。
x509-types(フォルダ)
中身:①COMMON ②ca ③client ④code-signing ⑤server ⑥serverClient
easyrsa(ファイル)
openssl-easyrsa(ファイル)
vars(ファイル)
vars.example(ファイル)
<$HOME/easy-rsa>のディレクトリ内で、コマンド入力/送信を行います。
# 認証機関の構築(CA)(ca.crtファイルの作成)
> ./easyrsa build-ca nopass
# csrフォルダの作成
> cd ~/easy-rsa
> mkdir csr
# csrのディレクトリにアクセスして、秘密鍵の発行($HOME/easy-rsa/csr)
# 〇〇は、任意で発行する鍵の名前を指定してください。
> openssl genrsa -out 〇〇.key
# CSR作成。subjectも併せて
> openssl req -new -key 〇〇.key -out 〇〇.req -subj \
> /C=JP/ST=tokyo/L=okinoshima/O=DigitalOcean/CN=server.test
# 〇〇.key 〇〇.req が保存されているか、確認
> ls
〇〇.key 〇〇.req
# CSRのインポート
> cd $HOME/easy-rsa
> ./easyrsa import-req csr/〇〇.req firefly
# インポートが成功すると、下記のようなメッセージが出力されます
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020
The request has been successfully imported with a short name of: firefly
You may now use this name to perform signing operations on this request.
# インポートしたCSRの署名
> cd $HOME/easy-rsa
> ./easyrsa sign-req server firefly
# yes で回答しないと、エラーになる。
> Confirm request details: yes
# CSRの発行が完成したので、中身を確認します。
> openssl x509 -in pki/issued/firefly.crt -text | head -15
# 下記のようなメッセージ出力されれば、問題ありません。
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
# 数字とアルファベットの羅列
Signature Algorithm: sha512WithRSAEncryption
Issuer: CN = 〇〇
Validity
Not Before: Nov 10 03:52:09 2021 GMT
Not After : Nov 10 03:52:09 2022 GMT
Subject: C = JP, ST = tokyo, L = okinoshima, O = DigitalOcean, CN = server.test
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
サーバー証明書の格納場所
証明書本文 ~/easy-rsa/easyrsa3/pki/issued/firefly.crt
証明書のプライベートキー ~/easy-rsa/easyrsa3/csr/〇〇※任意CNのネーム.key
証明書チェーン ~/easy-rsa/easyrsa3/pki/ca.crt
②クライアント証明書の発行・鍵生成など
EC2(Ubuntu)の「端末(term)」を開き、下記のコマンド入力/送信を行います。
# nopass はOpenVPNでクライアント証明書をインポートする際に、パスフレーズを求められないようにする場合は、記述する。
> cd $HOME/easy-rsa
> ./easyrsa build-client-full client.test nopass
# パスフレーズを求めてほしい場合
> cd $HOME/easy-rsa
> ./easyrsa build-client-full client.test
# 下記メッセージが出力されたら、任意のパスワードを設定する。
# 証明書を利用するユーザーは、パスワードの入力を求められるので、パスワード情報も一緒に共有して、利用してもらう必要があります。
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
クライアント証明書 (client.test)の格納場所
証明書本文 ~/easy-rsa/easyrsa3/pki/issued/client.test.crt
証明書のプライベートキー ~/easy-rsa/easyrsa3/pki/private/client.test.key
証明書チェーン ~/easy-rsa/easyrsa3/pki/ca.crt
補足
証明書と秘密鍵の情報が同じペアか確認するコマンド
SSL証明書:ハッシュ値の確認コマンド
> openssl x509 -in firefly.crt -modulus -noout | openssl md5
2.秘密鍵:ハッシュ値の確認コマンド
openssl rsa -in server.test.key -modulus -noout | openssl md5
1.2.のstdinの値が同じなら、ペアで問題なし。
6-3.ACMに証明書(サーバとクライアント)をインポート
ACM(AWS Certificate Manager) にアクセスして、インポート をクリックします。
サーバー証明書/クライアント証明書に格納されている情報を貼り付けて「次へ」をクリックして、インポートする。
サーバー証明書/クライアント証明書を各種分ける形で、それぞれ貼り付けてください。
7.Client VPN エンドポイントの作成
VPC コンソールから「クライアントVPNエンドポイント」を作成します。
VPC > クライアントVPNエンドポイント > クライアントVPNエンドポイントを作成 をクリックします。
クライアント IPv4 CIDR:接続先のVPCのCIDRと被らない任意のアドレス で設定します。
サーバ証明書:ACMに登録したサーバ証明書を選択
認証オプション:相互認証の使用 にチェックを入れる
クライアント証明書:ACMに登録したクライアント証明書を選択
サーバ証明書 を選択すると、クライアント証明書の設定が行えます
DNS サーバー 1 IP アドレス:VPC CIDRの範囲のIPアドレス を設定する
こちらを設定しないと、VPN接続時、インターネットに接続できませんので、ご注意ください。
設定の具体例:VPC CIDRが「141.56.0.0/16(141.56.0.0~141.56.255.255)」で設定されているとしたら【DNS サーバー 1 IP アドレス】に【141.56.0.2】といったCIDR範囲内の値を設定します。
その他は、任意で設定頂き「クライアントVPNエンドポイントを作成」をクリックします。
8.NAT ゲートウェイへの関連付け
作成したエンドポイントを選択します
ターゲットネットワークの関連付け タブを選択して、「ターゲットネットワークを関連付ける」をクリックします
VPC を選択します
作成した、関連付けたいプライベートサブネット を選択します
「ターゲットネットワークを関連付ける」をクリックします
9.ルートテーブルの追加
作成したエンドポイントを選択します
「ルートテーブル」 タブ を選択し「ルートを作成」をクリックします
ルート送信先:0.0.0.0/0
~サブネットID:VPN 用に作成したプライベートサブネット を選択
IDで表示されますので、事前にプライベートサブネットのIDをメモしておくと良いかもしれません。
「ルートを作成」をクリックします
10.認証ルールの追加
作成したエンドポイントを選択します
「承認ルール」タブ を選択し「認証ルールを追加」をクリックします
アクセスを有効にする送信先ネットワーク:0.0.0.0/0
アクセス権を以下に付与する:アクセス権をすべてのユーザーに許可する にチェックを入れる(任意なので、状況に併せて設定してください)
「認証ルールを追加」をクリックします
11.設定ファイルのダウンロード
エンドポイント から「クライアント設定をダウンロード」をクリックして、設定ファイルをダウンロードします
ダウンロードした設定ファイルを、テキストエディタ 等で開き、下記コマンドを追記します
# クライアント証明書本文 ~/easy-rsa/easyrsa3/pki/issued/client.test.crt
に記述している内容を <cert> </cert> の間にコピペする
<cert>
-----BEGIN CERTIFICATE-----
文字や数字の羅列
-----END CERTIFICATE-----
</cert>
# クライアント証明書のプライベートキー ~/easy-rsa/easyrsa3/pki/private/client.test.key
に記述している内容を <key> </key> の間にコピペする
<key>
-----BEGIN PRIVATE KEY-----
文字や数字の羅列
-----END PRIVATE KEY-----
</key>
nobindの配下辺りに
key [INLINE]
persist-key
persist-tun を追記する
client
dev tun
proto udp
remote cvpn-em〇〇 ndpoint-m.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
# ここから
key [INLINE]
persist-key
persist-tun
# ここまで
remote-cert-tls server
cipher AES-256-GCM
verb 3
以上で環境構築/設定は、完了となります。
OpenVPN(Windows)や、Tunnelblick(Mac)のアプリケーションを活用して、設定したプロファイル(ovpnファイル)をインポートすれば、VPN経由でインターネットにアクセスすることができます。
【おまけ】クライアント証明書のrevork(失効)について
企業で退職者が出た際、不正にクライアント証明書を持ち出した場合、そのまま引き続きVPNへのアクセスが可能となってしまうので、クライアント証明書をrevorkする運用が発生します。
EC2(Ubuntuのサーバ)にアクセスし、「端末(term)」を開き、下記のコマンド入力/送信を行います。
> Cd $HOME/easy-rsa
> ./easyrsa revoke 〇〇クライアント証明書名
# クライアント証明書が保存されているフォルダから、証明書が削除され【revorked】フォルダに対象の証明書が保管される。
# 証明書失効リスト(CRL)の更新
> Cd $HOME/easy-rsa
> ./easyrsa gen-crl
# crl.pem というファイルが生成される
クライアント証明書ごとに.pem生成が必要な為、1証明書をrevorkしたら、AWS側のCRLインポートを行い、完了したら改めて1証明書をrevorkしていく。
CRLインポート前に1証明書をrevorkしてしまうと【crl.pem】ファイルは上書きされてしまうので、注意してください。
エンドポイント > アクション > クライアント証明書CRLをインポート をクリックします
先ほど生成した【crl.pem】に記述されている内容を「証明書失効リスト」に入力して、クライアント証明書CRLをインポート をクリックします
【クライアント証明書CRLのエクスポート】を選択して、エクスポートするとインポートしたcrl.pemの情報が確認できます
長々と記載してきましたが、以上がAWS Client VPN環境の構築となります。細かいところは、運用するにあたり様々変わってくるかと思いますので、ご利用される際は、ご注意ください。
又、不足な部分も多いかもしれませんが、温かい目で見て頂けますと助かります。
ここはもっとこうした方が良いなどありましたら、ご意見頂けますと幸いです!