内容
・はじめに
・趣旨内容
・参考サイト
・参考事項
・使用できるサービス
・ハンズオン
・リソースの削除
・さいごに
はじめに
結果が先にきてしまいますが、このハンズオン結構やっかいでした( ;∀;)ハンズオン動画や、webサイトを漁りましたが、なっっかなかVPNが構築することができませんでした。理由は、SSLサーバー自己証明書のドメイン名をACMが読み込まない現象に苦しみましたw通常の手順で進められる環境の方向けにも記載していますので、参考にされてください。同じ現象の方は是非参考にされてください!
趣旨内容
リモート環境からソフトウェアVPN接続について基礎を理解する!
参考サイト
参考事項
そもそもSSLについて理解を深める。
【SSLサーバー証明書の3つの種類】
- EV認証型(EV:Extended Validation)
最も高い信頼性とセキュリティレベルを提供
ショッピングサイトや金融機関で使用される。 - 企業認証型(OV:Organization Validation)
中間レベルのセキュリティと信頼性を提供
中小企業のサイトで利用 - ドメイン認証型(DV:Domain Validation)
基本的なセキュリティレベルを提供
個人のブログなど。
使用できるサービス
EC2,ACM,クライアント VPN エンドポイント
ハンズオン
VPC,EC2,セキュリティグループの作成
VPC作成
「シングルAZ」
「Privateサブネットを2つ」
・198.19.1.0/24
pri,1a
・198.19.255.0/24
pri,1a
セキュリティグループを作成(ハンズオン動画から逸れます。)
- Pingを行うので、ICMPを開けておきます。
- Teratermで後で接続できるか試したいのでSSHも解放します。
- クライアントVPNは、UDPプロトコルで、ポートは443を使用するので解放しておきます。
EC2作成
先程作成したセキュリティグループを設定します。
これでインスタンスを起動します。
CloudWatchの設定
ログストリームを作成
これはロググループ内のリソースから発生するログやイベントデータをリアルタイムで監視し、解析するもの。エンドポイントに設置する。
ACMの設定(AWSが示す手順です。)
もしこの手順でサーバー証明書ができない場合は、次の項目以降を実行してください。
EC2をプライベートに置いている現状や、また、新たにCloud9でEC2を立てて環境を作成するにしても、パッケージが存在しなかったりなど、設定が面倒です。ご自身のPCがwindowsである場合なども、Cloudshellを活用することが最短です。
次のコマンドを実行して、OpenSSLパッケージをインストールします。
使用するツール。
・OpenVPN easy-rsa
・AWSCLI
CloudShellを立ち上げます。次のコマンドを順番に実行。
ネットワーク接続を暗号化するためのオープンソースツールキットをインストール。
sudo yum -y install openssl
クライアント認証を行います。
次のサイトでコマンドなどを参照します。
公式サイト:
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/mutual.html
gitクローンを行います。
git clone https://github.com/OpenVPN/easy-rsa.git
クローンで作成されたディレクトリがあるか確認します。
CloudShell上に格納されていて妙な気分になりますね|д゚)
cd easy-rsa/easyrsa3
Easy-RSAのinit-pkiコマンドによる初期化によって公開鍵インフラ(PKI)のセットアップのためのディレクトリとファイル構造を作成する。
つまり、公開鍵を使う前の構成のみ作成する工程。
./easyrsa init-pki
認証局をセットアップするため、CAの秘密鍵(ca.key)と自己署名された証明書(ca.crt)がpkiディレクトリ内に生成されるコマンド。
途中でパスを求められるが、そのままEnterを押下し、未設定で進める。
./easyrsa build-ca nopass
サーバー証明書とキーを生成します。
ここで発行を継続するか確認されるので「yes」で進めます。
./easyrsa build-server-full server nopass
続いてクライアント証明書とキーを作成し、VPN接続に備えます。
再び手続きを進めるか問いかけられますので、「yes」を入力してEnterを押下します。
./easyrsa build-client-full client1.domain.tld nopass
これから証明書や鍵をわかりやすいディレクトリにコピーさせます。
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/server.crt ~/custom_folder/
cp pki/private/server.key ~/custom_folder/
cp pki/issued/client1.domain.tld.crt ~/custom_folder
cp pki/private/client1.domain.tld.key ~/custom_folder/
cd ~/custom_folder/
ここで簡単に理解
ca.crt 認証局の証明書(CA自身の身元証明)
client1.domein.tld.crt クライアント用の証明書(相互認証が必要な際使用)
client1.domein.tld.key クライアント用の秘密鍵(相互認証が必要な際使用)
server.crt サーバー用の証明書(サーバー身元証明、SSL/TLS暗号化通信を確立)
server.key サーバー用の秘密鍵(サーバー側で保存、暗号化・復号に使用)
サーバー証明書、秘密鍵をACMにインポートして管理していきます。リージョンは東京を例に記載しています。
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1
次にクライアント証明書と秘密鍵をACMにインポートします。リージョンは東京を例に記載しています。
aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region ap-northeast-1
ここでご自身の環境で、サーバー証明書がインポートできるかどうか判断できます。もしこの時点で、「ドメイン欄が - 」となっている場合は残念ながらハンズオン通りに実行できない環境なので、インポートした証明書を整理して、次の手順に飛んでください。
ここまで問題ない方は、このまま進めます。
自らが管理すべきクライアント証明書と秘密鍵をダウンロードして手元にも置いておきます。
ClouShellからダウンロードが可能です。
画像のとおりに操作し、先に証明書をダウンロードします。
ダウンロードのディレクトリ指定例
「~」でユーザーのホームディレクトリを端折っていますが、通常のように「pwd」コマンドで指定しても問題ありません。
~/custom_folder/client1.domain.tld.crt
次にクライアント秘密鍵をダウンロードします。
画像のとおり操作しダウンロードします。
~/custom_folder/client1.domain.tld.key
これでローカルのダウンロード先フォルダにダウンロードできています。
サーバー証明書が問題なく作成できた方は、次の項目を飛ばしてください。本線復帰は改めて注記します。サーバー証明書をハンズオン通りに実行できなかった方はここから手順に沿ってやってみてください!
困り果てたそこのあなた。自分のPC内で証明書を作るのですw気合でwツールが必要なので、次のツールをダウンロードします。
vpnux PKI Manager
これをダウンロードして、exeを実行していきます。
次のzipがダウンロードされます。
このexeを実行します。
赤枠をクリック。
windows+rでボックスで「appwiz.cpl」を検索。
赤枠から.NETが有効か確認していきます。
「.NET」にチェックが入っていればOK!
プライベートCAの構築
vpnuxPKI.exeを再び実行してCA作成
現在のリージョンに合わせてデフォルトでいきます。
サーバー証明書を作成します。
※絶対に固有のネーミングにしてください。(コツは文字数が多いとACMが認識してくれますw)。
それぞれACMへインポートする。以下、全文をコピペしていきます。
- サーバー証明書
- サーバー証明書のキー
- 証明書チェーン(ca.crt)
VSCode(エディター)で開き、入力欄にコピペしていく。
ここでドメイン名が入っているか確認します。もし、ここで入っていなければ、共通名(ドメイン名)もっと文字数を増やして再アップロードする必要があります。。問題なければ、インポートを実行します。
クライアント証明書を作成します。なお、同じCAである場合、サーバー証明書のみで対応できます。あえて、クライアント証明書もアップロードしていきます。
必ずデフォルトではなく編集してください。
同じ手順で全文コピペしていきます。
- クライアント証明書
- クライアント証明書のキー
- 証明書チェーン(ca.crt)
インポートを実行します。
ここから両者、本線に復帰です。
VPNエンドポイントの作成
ここで注意したいのは、「スプリットトンネルを有効に設定する」ことをお忘れなくです。
ハンズオン中にネットに接続できなくなります。
クライアントVPNエンドポイントを作成します。
クライアントとエンドポイントを繋ぐアドレスが※「100.64.0.0/22」となっている。これは自分のPCのアドレス、VPCのアドレスとの重複を回避しなければならないということ。
先程インポートしたサーバー証明書の指定、VPN接続のため相互認証を選択して、クライアント証明書も選択します。ここでAD認証を使う際は、ユーザーベースを選択します。今回は、相互認証を使います。
ログは、先にCloudWatchで作成したロググループとログストリーム名を指定します。
ここ重要です。
スプリットトンネルを「有効」にしましょう。
理由は、全ての通信をVPNを通過するように設定するとネットに接続できなくなるためです。
その他は触らず作成を実行します。
10分ほどかかります。この間に次の設定を行います。
-
作成したサブネットをVPNエンドポイントに関連付けします。
作成したプライベートサブネットのうち、何も配置していない方「198.19.255.0/24」を選択します。
私の場合公式さんが示すサブネット名と違うので、次の図を参考にEC2が配置されているサブネットではない方にターゲットを向けます。
サブネットの画面からサブネットの状態を確認しましょう。
では設定していきます。
関連付けるをクリック。 -
次に認証ルールを追加します。
赤枠に従いクライアントに対する承認ルールを付与します。
接続先(今回はデフォルトルート)を指定します。なお、ADでのグループを指定することも可能。
これで追加します。
VPN接続の設定ファイルをダウンロードする。
自身のPCにVPNツールをインストール
先にソフトをダウンロードする。
https://aws.amazon.com/jp/vpn/client-vpn-download/
自身のPCに合わせてインストーラーをダウンロードする。
ダウンロード先フォルダのインストーラを実行する。
インストール。
終了。
デスクトップにツールがあります。
別にVPN接続を行っているとエラーが起きるとのことです。
EC2のプライベートアドレスをコピーしてきます。
続いて、VPNエンドポイントの状態を確認
以前ダウンロードしたVPNセットアップ用のファイル、クライアント用の証明書とキーを準備しておきます。
テキストエディタで一気にファイルを開きます。
VPN設定ファイルから編集していきます。
最終行にclient.client-vpn-hanson-2024.crtの内容から次の設定を追加する。
※ちょっとでもスペースなどが混入したら機能しません!
<cert>
-----BEGIN CERTIFICATE-----
省略
-----END CERTIFICATE-----
</cert>
ここからに続けて、キーの情報を貼り付けていきます。
※ここも無駄なスペースがあると機能しません!
<key>
省略
</key>
ここまでで設定ファイルの編集は終了です。
VPNソフトウェアの設定を行います。
自身のデスクトップからVPNツールを起動します。
プロファイルの管理から、先程編集したプロファイルを追加します。名前は任意です。
図のようにプロファイルが適用できています。まだ接続しません。
接続タブから、接続の詳細をクリックし、やっと接続ボタンをクリックします。
EC2にping疎通確認を致し申し上げます。どうかお願いします(切実w)
powershellで「ping 0.0.0.0(プライベートアドレス)」コマンドを実行します。
疎通できていますね。
Teratermで接続してみます。
プライベートアドレスを設定し、接続を行います。
接続できますね。
VPNエンドポイント(踏み台)からEC2に接続することができました。
マネジメントコンソールから接続確認
クライアントVPNエンドポイントの画面から「接続」タブを選択します。
接続できていますね。
CloudWatchを確認
「ロググループ」から、該当のログを選択します。
「ログストリーム」を選択します。
ログが問題なく通信成功を表示していますね!
内容はかなり詳細に表示されるのですね。
リソースの削除
- クライアントVPNエンドポイントから削除します。
ターゲットネットワークの関連付けを解除します。その後、クライアントVPNエンドポイントを「削除」します。
- ACMの証明書関連を削除します。
該当の証明書を選択し削除します。 - CloudWatchを削除します。
ロググループから、ログストリームに移動して削除します。その後、ロググループを削除。 - EC2を終了します。
- VPCを削除します。
これでサブネットも削除されます。 - CloudShellの作成したディレクトリを削除します。
ユーザーのホームディレクトリに帰ります。
cd
該当のディレクトリがあるか確認します。
ls
「ls」コマンドの結果、この二つのディレクトリがあれば削除します。
次のコマンドのディレクトリ名のところにそれぞれディレクトリ名を入れて実行します。
rm -r ディレクトリ名
ディレクトリによっては、本当に削除しますか?といった警告が出ますが「y」を入力して削除を許可しましょう。
二つのディレクトリを削除したら、次のコマンドで消えたことを確認します。
ls
番外編(ログ確認)
windowsのトラブルシューティング。
次の公式サイトにもあるようにログをローカルで確認することができる。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows-troubleshooting.html
- OpenVPN ログ
C:\Program Files\Amazon\AWS VPN Client\WinServiceLogs\username - アプリケーションログ
C:\Users\User\AppData\Roaming\AWSVPNClient\logs
どうしてもACMで自己証明書を作りたい場合のコマンド。
インポートできない理由はただ一つ、証明書の名前が短いこと。
なので、次のコマンドで長いネーミングで証明書を作ってしまえば良いのです。
秘密鍵 (server.key) とCSR (server.csr) を生成
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/CN=server-client.client.vpn-keiji-2024"
認証局(CA)に証明書の発行を依頼
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
ACMにインポートします。
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1
ポリシー
EC2~ACM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "acm:ImportCertificate",
"Resource": "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/*"
}
]
}
さいごに
このハンズオンは結構きつかったですね(^^;しかしその分勉強になりました。ネットワーク系でこんなに挫くとは。。どんどん勉強していきますよ!
では!