1. ホーム
  2. 記事一覧
  3. AWS環境に安全にリモート接続するためのAWS Client VPNの設定ハンズオン

2024.05.26

AWS環境に安全にリモート接続するためのAWS Client VPNの設定ハンズオン

1. はじめに

目的

この記事では、前回作成したACM証明書を使用してAWS Client VPNを設定し、セキュアなリモートアクセス環境を構築する手順を説明します。これにより、ユーザーが安全にAWSリソースにアクセスできるようになります。前回の記事がまだ完了して居ない方はこちらをご参照になり、ACM証明書の作成までを行なってください。

https://envader.plus/article/387

前提条件

  • 前回の記事で作成したACM証明書があること
  • 基本的なAWSの知識(VPC、サブネット、セキュリティグループ)
  • AWS CLIが設定されていること

実際の利用シーン

  • リモートワーク環境のセキュアなアクセス リモートワーカーが安全に社内ネットワークやAWSリソースにアクセスできるようにします。

  • インフラ管理のセキュリティ強化 インフラ管理者がセキュアな接続を通じてAWSリソースを管理・監視できるようにします。

2. AWS Client VPNの設定

VPCの準備

既存VPCの確認または新規作成

  1. VPCの確認 このコマンドを実行すると、AWSアカウントに存在するすべてのVPCの情報が表示されます。再利用可能なVPCがある場合は、そちらを使用します。

    aws ec2 describe-vpcs
  2. 新規VPCの作成 AWS CLIコマンドで、必要に応じて新しいVPCを作成します。今回のハンズオンは新しいVPCを想定しています。

    vpc_id=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 --query 'Vpc.VpcId' --output text)
    aws ec2 create-tags --resources $vpc_id --tags Key=Name,Value=MyVPC

サブネットの準備

サブネットの作成

  1. サブネットの確認 このコマンドを実行すると、AWSアカウントに存在するすべてのサブネットの情報が表示されます。再利用可能なサブネットがある場合は、そちらを使用します。

    aws ec2 describe-subnets
  2. 新規サブネットの作成 必要に応じて新しいサブネットを作成します。今回のハンズオンでは、新しくサブネットを作成します。

    subnet_id=$(aws ec2 create-subnet --vpc-id $vpc_id --cidr-block 10.0.1.0/24 --query 'Subnet.SubnetId' --output text)
    aws ec2 create-tags --resources $subnet_id --tags Key=Name,Value=MySubnet

セキュリティグループの設定

セキュリティグループは、AWSリソースに対するインバウンドおよびアウトバウンドトラフィックを制御する仮想ファイアウォールです。ここでは、VPN接続に必要なトラフィックを許可するために、特定のポートを開放します。

  1. セキュリティグループの作成

    sg_id=$(aws ec2 create-security-group --group-name MyVPNGroup --description "Security group for VPN" --vpc-id $vpc_id --query 'GroupId' --output text)
    aws ec2 create-tags --resources $sg_id --tags Key=Name,Value=MyVPNGroup
  2. セキュリティグループのルール設定

    aws ec2 authorize-security-group-ingress --group-id $sg_id --protocol udp --port 1194 --cidr 0.0.0.0/0
    aws ec2 authorize-security-group-ingress --group-id $sg_id --protocol tcp --port 443 --cidr 0.0.0.0/0
    • UDPポート1194の開放

    OpenVPNはデフォルトでUDPの1194ポートを使用します。このポートを開放することで、OpenVPNクライアントがサーバーに接続できるようになります。

    • TCPポート443の開放

    443ポートはHTTPSトラフィックで使用される一般的なポートです。多くのネットワーク環境で開放されているため、VPN接続が他のポートでブロックされた場合のフォールバックとしてTCPの443ポートも開放します。

3. Client VPNエンドポイントの作成

クライアント証明書をAWS ACMに登録

前回の記事では、クライアント証明書をACMに追加していません。AWS CLIを使用して、生成されたクライアント証明書とキーをAWS ACMにインポートします。

クライアント証明書のインポート

以下のコマンドを使用して、クライアント証明書をAWS ACMにインポートします。証明書やキーのパスは必要に応じて変更してください。

aws acm import-certificate --certificate fileb://pki/issued/client.crt --private-key fileb://pki/private/client.key --certificate-chain fileb://pki/ca.crt

このコマンドは、クライアント証明書、クライアントキー、CA証明書を指定します。

Client VPNエンドポイントの設定

以下のAWS CLIコマンドを使用して、AWS Client VPNエンドポイントを作成します。このコマンドでは、サーバー証明書のARNを使用し、その証明書チェーンに含まれるCA証明書をクライアント認証に使用します。この際指定する --client-cidr-blockの値は、VPCのCIDR(今回の場合10.0.0.0/16)と被ってはいけません。

vpn_endpoint_id=$(aws ec2 create-client-vpn-endpoint --client-cidr-block 10.1.0.0/16 --server-certificate-arn arn:aws:acm:<region>:<account-id>:certificate/<server-certificate-id> --authentication-options Type=certificate-authentication,MutualAuthentication={ClientRootCertificateChainArn=arn:aws:acm:<region>:<account-id>:certificate/<server-certificate-id>} --connection-log-options Enabled=false --vpc-id $vpc_id --split-tunnel --query 'ClientVpnEndpointId' --output text)

このコマンドを実行することで、指定されたサーバー証明書とその証明書チェーンに含まれるCA証明書を使用して、AWS Client VPNエンドポイントが作成されます。

サブネットとの関連付け

こちらのコマンドでサブネットと関連づけます。

association_id=$(aws ec2 associate-client-vpn-target-network --client-vpn-endpoint-id $vpn_endpoint_id --subnet-id $subnet_id --query 'AssociationId' --output text)

承認ルールの設定

承認ルールを設定することで、特定のクライアントCIDRブロックに対するアクセスを許可します。これを行わないと、クライアントはVPNに接続できません。

aws ec2 authorize-client-vpn-ingress --client-vpn-endpoint-id $vpn_endpoint_id --target-network-cidr 10.0.0.0/16 --authorize-all-groups --description "Allow access to VPC"

ルートの設定

次のコマンドで既存のルートを確認します。

aws ec2 describe-client-vpn-routes --client-vpn-endpoint-id $vpn_endpoint_id

既存のルートを確認し、存在しなかったなど、必要に応じて新しいルートを追加します。次のコマンドでルートの追加を行います(必要な場合のみ)。

aws ec2 create-client-vpn-route --client-vpn-endpoint-id $vpn_endpoint_id --destination-cidr-block 10.0.0.0/16 --target-vpc-subnet-id $subnet_id

4. クライアント設定のダウンロードと接続

クライアント設定のダウンロード

  1. AWS Management Consoleにログイン

  2. VPCダッシュボードに移動

    • サービスメニューから「VPC」を選択します。
  3. Client VPNエンドポイントの選択

    • 左側のナビゲーションペインで「Client VPNエンドポイント」をクリックします。
  4. エンドポイントの選択

    • 設定したClient VPNエンドポイントを一覧から選択します。
  5. クライアント設定のダウンロード

    • エンドポイントの詳細ページで「クライアント設定のダウンロード」をクリックし、.ovpnファイルをダウンロードします。このファイルには、VPN接続に必要な設定が含まれています。

クライアント証明書とクライアントキーの追加

  1. 前の記事で作成したクライアント証明書 (client.crt) とクライアントキー (client.key) のファイルパスを指定します。

  2. 次の内容でadd_cert_to_ovpn.shという名前のスクリプトファイルを作成し、クライアント証明書とクライアントキーをダウンロードした .ovpn ファイルに追加します。

    • ファイルの作成
    vi add_cert_to_ovpn.sh
    • add_cert_to_ovpn.shに次の内容を記述
    #!/bin/bash
    
    # クライアント証明書、クライアントキー、.ovpnファイルのパスを指定
    CLIENT_CERT_PATH="pki/issued/client.crt"
    CLIENT_KEY_PATH="pki/private/client.key"
    OVPN_FILE_PATH="/path/to/your.ovpn"
    
    # クライアント証明書とキーを.ovpnファイルに追加
    cat <<EOF >> $OVPN_FILE_PATH
    <cert>
    $(cat $CLIENT_CERT_PATH)
    </cert>
    <key>
    $(cat $CLIENT_KEY_PATH)
    </key>
    EOF
    • 作成したシェルスクリプトを実行
    sh add_cert_to_ovpn.sh

クライアントソフトウェアのインストール

OpenVPNクライアントをインストールして、ダウンロードした設定ファイルを使用します。2024年5月現在 Amazon Linux 2023では、OpenVPNクライアントをインストールすることができません。 対応してくれないと困りますね。

Windows用OpenVPNクライアントのインストール

  1. Windows用OpenVPNクライアントからインストーラをダウンロードします。
  2. ダウンロードしたインストーラを実行し、画面の指示に従ってOpenVPNクライアントをインストールします。

macOS用Tunnelblickのインストール

  1. Tunnelblickのダウンロードページにアクセスします。
  2. 最新のバージョンをダウンロードし、インストールパッケージを開きます。
  3. Tunnelblickアプリケーションをアプリケーションフォルダにドラッグしてインストールします。

Linux用OpenVPNパッケージのインストール

  1. ターミナルを開きます。

  2. 使用しているLinuxディストリビューションに応じて、以下のコマンドを実行してOpenVPNをインストールします。

    Debian/Ubuntu:

    sudo apt-get update
    sudo apt-get install -y openvpn

    Amazon Linux 2/CentOS/RHEL:

    sudo yum install -y epel-release
    sudo yum install -y openvpn

VPN接続の確立

ダウンロードした設定ファイルを使用してVPN接続を確立します。

Windows

  1. OpenVPN GUIを起動します。
  2. タスクバーの右端にあるOpenVPNアイコンを右クリックし、「Import file...」を選択します。
  3. 編集した .ovpn ファイルを選択し、「開く」をクリックします。
  4. インポートが成功すると通知が表示されます。
  5. 再度OpenVPNアイコンを右クリックし、インポートした設定を選択して「Connect」をクリックします。

macOS

  1. Tunnelblickを起動します。
  2. 編集した .ovpn ファイルをダブルクリックします。Tunnelblickが自動的にファイルをインポートします。
  3. インポートが成功すると通知が表示されます。
  4. メニューバーのTunnelblickアイコンをクリックし、インポートした設定を選択して「Connect」をクリックします。

Linux

  1. ターミナルを開きます。

  2. 編集した .ovpn ファイルを適切なディレクトリに配置します(例:/etc/openvpn/client/)。

  3. 以下のコマンドを実行してVPN接続を確立します。

    sudo openvpn --config /path/to/your.ovpn

これにより、VPN接続が確立され、セキュアにAWSリソースにアクセスできるようになります。 Linuxの場合は、Initialization Sequence Completedと出力していれば、接続されています。

5. まとめと後片付け

まとめ

この記事では、前回作成したACM証明書を使用してAWS Client VPNを設定する手順を学びました。具体的には、以下のステップを実施しました。

  1. VPCとサブネットの準備

  2. セキュリティグループの設定

  3. Client VPNエンドポイントの作成と設定

  4. クライアント設定のダウンロードとVPN接続の確立

  5. 関連付けの削除

    Client VPNエンドポイントに関連付けられたネットワークアソシエーションの一覧を取得

    aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id $vpn_endpoint_id

    このコマンドの出力から、関連付けID(例:cvpn-assoc-xxxxxxxxxxxx)を確認します。

    次に、ネットワークアソシエーションの削除を実施します。

    aws ec2 disassociate-client-vpn-target-network --client-vpn-endpoint-id $vpn_endpoint_id --association-id cvpn-assoc-xxxxxxxxxxxx

    上記コマンドを、すべてのアソシエーションIDについて繰り返します。

  6. Client VPNエンドポイントの削除

    aws ec2 delete-client-vpn-endpoint --client-vpn-endpoint-id $vpn_endpoint_id
  7. サブネットの削除

    aws ec2 delete-subnet --subnet-id $subnet_id
  8. セキュリティグループの削除

    aws ec2 delete-security-group --group-id $sg_id
  9. VPCの削除

    aws ec2 delete-vpc --vpc-id $vpc_id

参考資料

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事