クライアントVPN 設定してみた
目次
こんにちは!スカイアーチHRソリューションズのKotaroです。
今回はクライアントVPN 設定をして接続する設定を行っていきます。
クライアントVPNは、リモートアクセスを可能にし、通信を暗号化することで安全なアクセスを提供します。またユーザー認証機能により不正アクセスを防ぐことが出来ます。EC2をパブリックサブネットに置きながらセキュリティグループで通信を制限して、VPN経由でサーバにアクセスすることでセキュリティを高めることが出来ます。
(本来プライベートサブネットにサーバを置くことがベストだとは思いますが、外部への通信に関わるリソースやサーバ内にアクセスするためのリソース作成(踏み台サーバやSession Manager、エンドポイント等)や、費用等の観点からパブリックサブネットに配置したとします。)
※前提として以下の構成が出来ている状態で進めていきます。
- VPC(10.0.0.0/16), Public subnet(10.0.0.0/20)
- Windows Server 2022(ami-0962657fe505b0123)
- EC2にアタッチするセキュリティグループにRDP接続の許可
サーバーとクライアントの証明書作成
Microsoft Edge を開き、https://github.com/OpenVPN/easy-rsa/releases にアクセスし、Windows のバージョン用の ZIP ファイルをダウンロードします。
※2024/4/4時点で最新の以下画像のものをダウンロードします。
ダウンロードしたZIPファイルを解凍し、Desktopに移動します。コマンドプロンプトで該当のフォルダまで移動し、以下のコマンドを実行して、EasyRSA 3 シェルを開きます。
C:\Users\Administrator\Desktop\EasyRSA-3.1.7
> .\EasyRSA-Start.bat
新しい PKI 環境を初期化します。
# ./easyrsa init-pki
新しい認証局 (CA) を構築するには、このコマンドを実行し、プロンプトに従います。
# ./easyrsa build-ca nopass
途中で何か聞かれますがそのままEnterで問題ないです。
サーバー証明書とキーを生成します。
# ./easyrsa build-server-full server nopass
途中で以下の内容を聞かれますが「yes」と入力し次に進みます。
クライアント証明書とキーを生成します。
# ./easyrsa build-client-full client1.domain.tld nopass
途中で以下の内容を聞かれますが「yes」と入力し次に進みます。
EasyRSA 3 シェルを終了します。
# exit
Desktop\EasyRSA-3.1.7のフォルダに今後使うサーバーとクライアント証明書が格納されています。
pki\ca.crt ※証明書チェーン
pki\issued\server.crt ※サーバー証明書
pki\private\server.key ※サーバー証明書のキー
pki\issued\client1.domain.tld.crt ※クライアント証明書
pki\private\client1.domain.tld.key ※クライアント証明書のキー
※デフォルトだと証明書の有効期限が2年程度と短いため、長くする場合は以下URLが参考になります。
サーバ証明書のインポート
ACMのサービスに遷移し、左タブ「証明書をインポート」を選択し、先ほど作成した証明書を以下の項目に記載し、インポートします。
- 証明書本文➡「server.crt」 ※—–BEGIN CERTIFICATE—–から記載
- 証明書のプライベートキー➡「server.key」
- 証明書チェーン➡「ca.crt」
問題なければ、ステータスが発行済みに変わります。
CloudWatch ロググループの作成
クライアント接続の詳細ログをCloudWatch Logsに保存する場合は先にロググループを作成しておきます。
CloudWatchのサービスに遷移し、左タブ「ロググループ」を選択し、「ロググループを作成」を選択します。
ロググループが作成されていることを確認します。
クライアントVPNエンドポイントの作成
VPCのサービスに遷移し、左タブ「クライアント VPN エンドポイント」を選択し、「クライアント VPN エンドポイントを作成を選択します。
以下にポイントとなる設定事項について記載します。
- クライアント IPv4 CIDR: クライアントVPNのクライアントIPv4 CIDRは、VPCのサブネットと重複しないよう設定する必要があります。今回は10.1.0.0/16に設定します
- サーバー証明書 ARN: 先ほどインポートした証明書を選択します。
- クライアント証明書 ARN: 先ほどインポートした証明書を選択します。サーバー証明書と同じですが、認証局が同じ場合は問題ありません。以下、公式サイトより引用。
クライアント証明書を ACM にアップロードする必要はありません。サーバー証明書とクライアント証明書が同じ認証機関 (CA) によって発行されている場合、Client VPN エンドポイントを作成するときに、サーバーとクライアントの両方に対してサーバー証明書 ARN を使用することができます。上のステップで、同じ CA を使用して両方の証明書を作成しています。ただし、完全性を保証するために、クライアント証明書をアップロードするステップが含まれています。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/mutual.html - クライアント接続のログの詳細を有効化: 有効化にして先ほど作成したロググループを選択します。
- スプリットトンネル: どちらでもよいですが、有効にすることでVPNの接続速度が向上したり、VPNサーバの負荷が軽減されるといったメリットがあります。
- セキュリティグループ: 今回は、デフォルトのものをそのまま使用します。詳細は以下の記事が参考になります。
https://dev.classmethod.jp/articles/how-to-configure-security-groups-for-aws-client-vpn/
ターゲットネットワークの関連付け
作成したクライアントVPNの「ターゲットネットワークの関連付け」から「ターゲットネットワークを関連付ける」を選択し、今回作成したEC2のサブネットを関連付けます。
承認ルールの追加
作成したクライアントVPNの「承認ルール」から「認証ルールの追加」を選択し、今回はアクセスを有効にする送信先ネットワークをALL開放し(0.0.0.0/0)、作成します。※VPC 全体へのアクセスを許可するには、VPC の IPv4 CIDR ブロックを指定します。
インターネットへのアクセス
※必要な場合のみ実施
インターネットへのアクセスが必要な場合、ルートテーブルの追加が必要になります。(VPCへのアクセスはターゲットネットワークの関連付けの際に、クライアント VPN エンドポイントルートテーブルに自動的に追加されます。)
作成したクライアントVPNの「ルートテーブル」から「ルートを作成」を選択し、ルート送信先をALL開放し(0.0.0.0/0)、作成します。
クライアント VPN エンドポイント設定ファイルをダウンロード
作成したクライアントVPNの「クライアント設定のダウンロード」を選択します。
任意のテキストエディタを使用して、クライアント VPN エンドポイント設定ファイルを開きます。
<cert></cert>
および <key></key>
タグをファイルの末尾に追加します。
次のように、クライアント証明書の内容とプライベートキーの内容を、対応するタグ間に配置し保存します。
<cert> クライアント証明書 </cert>
<key> クライアント証明書のキー </key>
OpenVPN クライアントを使用して接続
OpenVPNがインストールされていない場合は以下のURLのOpenVPN GUIからダウンロードをします。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows.html
ダウンロードした後はWindows のタスクバーで、[表示/非表示アイコン] を選択して [OpenVPN GUI] を右クリックし、[Import file (ファイルのインポート)] を選択します。
[Open (開く)] ダイアログボックスでクライアント VPN 管理者から受け取った設定ファイルを選択し、[Open (開く)] を選択します。
Windows のタスクバーで、[表示/非表示アイコン] を選択して [OpenVPN GUI] を右クリックし、[Connect (接続)] を選択します。
設定ファイルに問題がなければアイコンが緑色になり、VPNの接続が完了します。
接続が完了したことを確認し、RDPでEC2のプライベートIPアドレス、ユーザー、パスワードを入力し、接続できることを確認します。(※EC2のセキュリティグループでRDPの接続を許可していることを確認します)
おわりに
かなり長くなってしまいましたが、一通り設定出来るとパブリックサブネットにあってもセキュリティを向上させることが出来るため、業務などでの使用頻度も高いのではと思いました。