1
0

リモート環境からソフトウェアVPN接続

Last updated at Posted at 2024-03-30

内容

・はじめに
・趣旨内容
・参考サイト
・参考事項
・使用できるサービス
・ハンズオン
・リソースの削除
・さいごに

はじめに

結果が先にきてしまいますが、このハンズオン結構やっかいでした( ;∀;)ハンズオン動画や、webサイトを漁りましたが、なっっかなかVPNが構築することができませんでした。理由は、SSLサーバー自己証明書のドメイン名をACMが読み込まない現象に苦しみましたw通常の手順で進められる環境の方向けにも記載していますので、参考にされてください。同じ現象の方は是非参考にされてください!

趣旨内容

リモート環境からソフトウェアVPN接続について基礎を理解する!

参考サイト

参考事項

そもそもSSLについて理解を深める。
【SSLサーバー証明書の3つの種類】

  1. EV認証型(EV:Extended Validation)
    最も高い信頼性とセキュリティレベルを提供
    ショッピングサイトや金融機関で使用される。
  2. 企業認証型(OV:Organization Validation)
    中間レベルのセキュリティと信頼性を提供
    中小企業のサイトで利用
  3. ドメイン認証型(DV:Domain Validation)
    基本的なセキュリティレベルを提供
    個人のブログなど。

使用できるサービス

EC2,ACM,クライアント VPN エンドポイント

ハンズオン

目指す構成
リージョンは東京です。
image.png

VPC,EC2,セキュリティグループの作成

VPC作成

「VPC CIDR 198.19.0.0/16」
image.png
image.png

「シングルAZ」
「Privateサブネットを2つ」
・198.19.1.0/24
pri,1a
・198.19.255.0/24
pri,1a

image.png
image.png
「新しいサブネットを追加」から続けてサブネットを作成
image.png
image.png

セキュリティグループを作成(ハンズオン動画から逸れます。)

image.png
任意の名前、VPCは先程作成したものを指定
image.png

  1. Pingを行うので、ICMPを開けておきます。
  2. Teratermで後で接続できるか試したいのでSSHも解放します。
  3. クライアントVPNは、UDPプロトコルで、ポートは443を使用するので解放しておきます。

image.png
アウトバウンドはデフォルトでいきます。
作成。

EC2作成

image.png
image.png
image.png
image.png
先程作成したセキュリティグループを設定します。
image.png
image.png
これでインスタンスを起動します。

CloudWatchの設定

ロググループの作成
「/aws/cvpn」
image.png
image.png

ログストリームを作成
これはロググループ内のリソースから発生するログやイベントデータをリアルタイムで監視し、解析するもの。エンドポイントに設置する。
image.png
image.png

ACMの設定(AWSが示す手順です。)

もしこの手順でサーバー証明書ができない場合は、次の項目以降を実行してください。

EC2をプライベートに置いている現状や、また、新たにCloud9でEC2を立てて環境を作成するにしても、パッケージが存在しなかったりなど、設定が面倒です。ご自身のPCがwindowsである場合なども、Cloudshellを活用することが最短です。
次のコマンドを実行して、OpenSSLパッケージをインストールします。

使用するツール。
・OpenVPN easy-rsa
・AWSCLI

CloudShellを立ち上げます。次のコマンドを順番に実行。
ネットワーク接続を暗号化するためのオープンソースツールキットをインストール。

CloudShell
sudo yum -y install openssl

クライアント認証を行います。
次のサイトでコマンドなどを参照します。
公式サイト:
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/mutual.html
gitクローンを行います。

CloudShell
git clone https://github.com/OpenVPN/easy-rsa.git

クローンで作成されたディレクトリがあるか確認します。
CloudShell上に格納されていて妙な気分になりますね|д゚)

CloudShell
cd easy-rsa/easyrsa3

Easy-RSAのinit-pkiコマンドによる初期化によって公開鍵インフラ(PKI)のセットアップのためのディレクトリとファイル構造を作成する。
つまり、公開鍵を使う前の構成のみ作成する工程。

CloudShell
./easyrsa init-pki

image.png
認証局をセットアップするため、CAの秘密鍵(ca.key)と自己署名された証明書(ca.crt)がpkiディレクトリ内に生成されるコマンド。
途中でパスを求められるが、そのままEnterを押下し、未設定で進める。

CloudShell
./easyrsa build-ca nopass

サーバー証明書とキーを生成します。
ここで発行を継続するか確認されるので「yes」で進めます。

CloudShell
./easyrsa build-server-full server nopass

続いてクライアント証明書とキーを作成し、VPN接続に備えます。
再び手続きを進めるか問いかけられますので、「yes」を入力してEnterを押下します。

CloudShell
./easyrsa build-client-full client1.domain.tld nopass

これから証明書や鍵をわかりやすいディレクトリにコピーさせます。

CloudShell
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/

image.png

ここで簡単に理解
ca.crt 認証局の証明書(CA自身の身元証明)
client1.domein.tld.crt クライアント用の証明書(相互認証が必要な際使用)
client1.domein.tld.key クライアント用の秘密鍵(相互認証が必要な際使用)
server.crt サーバー用の証明書(サーバー身元証明、SSL/TLS暗号化通信を確立)
server.key サーバー用の秘密鍵(サーバー側で保存、暗号化・復号に使用)

サーバー証明書、秘密鍵をACMにインポートして管理していきます。リージョンは東京を例に記載しています。

CloudShell
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1

次にクライアント証明書と秘密鍵をACMにインポートします。リージョンは東京を例に記載しています。

CloudShell
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

これらがACMにインポートされているか確認を行う。
image.png

ここでご自身の環境で、サーバー証明書がインポートできるかどうか判断できます。もしこの時点で、「ドメイン欄が - 」となっている場合は残念ながらハンズオン通りに実行できない環境なので、インポートした証明書を整理して、次の手順に飛んでください。

ここまで問題ない方は、このまま進めます。
自らが管理すべきクライアント証明書と秘密鍵をダウンロードして手元にも置いておきます。
ClouShellからダウンロードが可能です。
画像のとおりに操作し、先に証明書をダウンロードします。
image.png
image.png
ダウンロードのディレクトリ指定例
「~」でユーザーのホームディレクトリを端折っていますが、通常のように「pwd」コマンドで指定しても問題ありません。

ダウンロード入力欄
~/custom_folder/client1.domain.tld.crt

次にクライアント秘密鍵をダウンロードします。
画像のとおり操作しダウンロードします。
image.png

ダウンロード入力欄
~/custom_folder/client1.domain.tld.key

これでローカルのダウンロード先フォルダにダウンロードできています。

サーバー証明書が問題なく作成できた方は、次の項目を飛ばしてください。本線復帰は改めて注記します。サーバー証明書をハンズオン通りに実行できなかった方はここから手順に沿ってやってみてください!

困り果てたそこのあなた。自分のPC内で証明書を作るのですw気合でwツールが必要なので、次のツールをダウンロードします。
vpnux PKI Manager
これをダウンロードして、exeを実行していきます。

次のzipがダウンロードされます。
image.png
このexeを実行します。
image.png
赤枠をクリック。
image.png
windows+rでボックスで「appwiz.cpl」を検索。
image.png
赤枠から.NETが有効か確認していきます。
image.png
「.NET」にチェックが入っていればOK!
image.png
プライベートCAの構築
vpnuxPKI.exeを再び実行してCA作成
image.png
image.png
image.png
現在のリージョンに合わせてデフォルトでいきます。
image.png
image.png
image.png
サーバー証明書を作成します。
image.png
※絶対に固有のネーミングにしてください。(コツは文字数が多いとACMが認識してくれますw)。
image.png
image.png
image.png
それぞれACMへインポートする。以下、全文をコピペしていきます。

  1. サーバー証明書
  2. サーバー証明書のキー
  3. 証明書チェーン(ca.crt)

image.png
VSCode(エディター)で開き、入力欄にコピペしていく。
image.png
image.png
ここでドメイン名が入っているか確認します。もし、ここで入っていなければ、共通名(ドメイン名)もっと文字数を増やして再アップロードする必要があります。。問題なければ、インポートを実行します。

ACMでも確認
image.png

クライアント証明書を作成します。なお、同じCAである場合、サーバー証明書のみで対応できます。あえて、クライアント証明書もアップロードしていきます。
image.png
必ずデフォルトではなく編集してください。
image.png
image.png
image.png

同じ手順で全文コピペしていきます。

  1. クライアント証明書
  2. クライアント証明書のキー
  3. 証明書チェーン(ca.crt)
    インポートを実行します。

image.png

ここから両者、本線に復帰です。

VPNエンドポイントの作成

ここで注意したいのは、「スプリットトンネルを有効に設定する」ことをお忘れなくです。
ハンズオン中にネットに接続できなくなります。

クライアントVPNエンドポイントを作成します。
image.png
クライアントとエンドポイントを繋ぐアドレスが※「100.64.0.0/22」となっている。これは自分のPCのアドレス、VPCのアドレスとの重複を回避しなければならないということ。
image.png

先程インポートしたサーバー証明書の指定、VPN接続のため相互認証を選択して、クライアント証明書も選択します。ここでAD認証を使う際は、ユーザーベースを選択します。今回は、相互認証を使います。
image.png
ログは、先にCloudWatchで作成したロググループとログストリーム名を指定します。
image.png

ここ重要です。

スプリットトンネルを「有効」にしましょう。
image.png
理由は、全ての通信をVPNを通過するように設定するとネットに接続できなくなるためです。
その他は触らず作成を実行します。
image.png
10分ほどかかります。この間に次の設定を行います。

  1. 作成したサブネットをVPNエンドポイントに関連付けします。
    image.png
    作成したプライベートサブネットのうち、何も配置していない方「198.19.255.0/24」を選択します。
    私の場合公式さんが示すサブネット名と違うので、次の図を参考にEC2が配置されているサブネットではない方にターゲットを向けます。
    image.png
    サブネットの画面からサブネットの状態を確認しましょう。
    image.png
    image.png
    では設定していきます。
    image.png
    関連付けるをクリック。

  2. 次に認証ルールを追加します。
    赤枠に従いクライアントに対する承認ルールを付与します。
    image.png
    接続先(今回はデフォルトルート)を指定します。なお、ADでのグループを指定することも可能。
    image.png
    これで追加します。

  3. EC2にも適用したセキュリティグループを適用します。
    セキュリティグループタブから、次のように設定します。
    image.png

VPN接続の設定ファイルをダウンロードする。

赤枠をクリックします。
image.png

自身のPCにVPNツールをインストール

先にソフトをダウンロードする。
https://aws.amazon.com/jp/vpn/client-vpn-download/
自身のPCに合わせてインストーラーをダウンロードする。
image.png
ダウンロード先フォルダのインストーラを実行する。
image.png
インストール。
image.png
終了。
image.png
デスクトップにツールがあります。
image.png
別にVPN接続を行っているとエラーが起きるとのことです。

EC2のプライベートアドレスをコピーしてきます。
image.png
続いて、VPNエンドポイントの状態を確認
image.png

以前ダウンロードしたVPNセットアップ用のファイル、クライアント用の証明書とキーを準備しておきます。

image.png
テキストエディタで一気にファイルを開きます。
VPN設定ファイルから編集していきます。
最終行にclient.client-vpn-hanson-2024.crtの内容から次の設定を追加する。
※ちょっとでもスペースなどが混入したら機能しません!

クライアントcrtファイル
<cert>
-----BEGIN CERTIFICATE-----

省略

-----END CERTIFICATE-----
</cert>

ここからに続けて、キーの情報を貼り付けていきます。
※ここも無駄なスペースがあると機能しません!

クライアントkeyファイル
<key>

省略

</key>

ここまでで設定ファイルの編集は終了です。

VPNソフトウェアの設定を行います。

自身のデスクトップからVPNツールを起動します。
プロファイルの管理から、先程編集したプロファイルを追加します。名前は任意です。
image.png
image.png
image.png
図のようにプロファイルが適用できています。まだ接続しません。
image.png
接続タブから、接続の詳細をクリックし、やっと接続ボタンをクリックします。
image.png

接続完了!
image.png

EC2にping疎通確認を致し申し上げます。どうかお願いします(切実w)

powershellで「ping 0.0.0.0(プライベートアドレス)」コマンドを実行します。
image.png
疎通できていますね。

Teratermで接続してみます。

プライベートアドレスを設定し、接続を行います。
image.png
接続できますね。
VPNエンドポイント(踏み台)からEC2に接続することができました。

マネジメントコンソールから接続確認

クライアントVPNエンドポイントの画面から「接続」タブを選択します。
image.png
接続できていますね。

CloudWatchを確認

「ロググループ」から、該当のログを選択します。
image.png
「ログストリーム」を選択します。
image.png
image.png
image.png
ログが問題なく通信成功を表示していますね!
内容はかなり詳細に表示されるのですね。

リソースの削除

  1. クライアントVPNエンドポイントから削除します。
    ターゲットネットワークの関連付けを解除します。その後、クライアントVPNエンドポイントを「削除」します。
    image.png
  2. ACMの証明書関連を削除します。
    該当の証明書を選択し削除します。
  3. CloudWatchを削除します。
    ロググループから、ログストリームに移動して削除します。その後、ロググループを削除。
  4. EC2を終了します。
  5. VPCを削除します。
    これでサブネットも削除されます。
  6. CloudShellの作成したディレクトリを削除します。
    ユーザーのホームディレクトリに帰ります。
CloudShell
cd

該当のディレクトリがあるか確認します。

CloudShell
ls

「ls」コマンドの結果、この二つのディレクトリがあれば削除します。
image.png

次のコマンドのディレクトリ名のところにそれぞれディレクトリ名を入れて実行します。

CloudShell
rm -r ディレクトリ名

ディレクトリによっては、本当に削除しますか?といった警告が出ますが「y」を入力して削除を許可しましょう。
二つのディレクトリを削除したら、次のコマンドで消えたことを確認します。

CloudShell
ls

番外編(ログ確認)

windowsのトラブルシューティング。
次の公式サイトにもあるようにログをローカルで確認することができる。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows-troubleshooting.html

  1. OpenVPN ログ
    C:\Program Files\Amazon\AWS VPN Client\WinServiceLogs\username
  2. アプリケーションログ
    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/*"
        }
    ]
}

さいごに

このハンズオンは結構きつかったですね(^^;しかしその分勉強になりました。ネットワーク系でこんなに挫くとは。。どんどん勉強していきますよ!

では!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0