2020年6月3日インフラツイートシェアはてブ1送るPocket4こんにちは。Life管理人の仁科(@nishina555)です。前回、HTTPやSSHで接続できるEC2をVPCに構築する手順について紹介しました。【AWS環境構築手順】VPCとEC2を作成し、実際にアクセスしてみる2020年7月8日しかし、外部公開しているWebサーバーに対して直接SSH接続ができるのはセキュリティ的にはあまりよくありません。実際にサービスが稼働しているAWS環境では、踏み台(Bastion)サーバー経由でSSH接続する方法がよく採用されています。そこで今回は、インターネットで直接アクセスできないプライベートサブネットワーク内にWebサーバーを配置したセキュアなAWS環境の構築方法について紹介します。今回作成するAWS環境のイメージ図は以下の通りです。補足説明は以下の通りです。Gateway経由でWebサーバーからインターネットへのアウトバウンド通信(yumコマンドなど)を実現するなお、今回はパブリックサブネットに配置したEC2インスタンスを『踏み台(Bastion)サーバー』、プライベートサブネットに配置したEC2インスタンスのことを『Webサーバー』と呼ぶことにします。VPCを作成するAWSマネージメントコンソールでVPCを選択します。『VPC』→『VPCの作成』を選択します。必要事項を入力し、『作成』を選択します。各項目の意味は以下の通りです。VPCで利用するアドレスの範囲を記述。ブロックサイズは`/16`から`/24`の間までである必要がある。CIDRブロックをVPCに紐づけるかどうかの設定。ブロックについてですが、/xxの値が小さいほどVPC内に割り当てられるプライベートIPの数が多くなります。CIDRブロック10.0.0.0/16で作成しました。インターネットゲートウェイを作成するVPCの空間とインターネットの世界を結びつけるために必要な『インターネットゲートウェイ』と呼ばれるものを作成します。『VPCダッシュボード』を開き、『インターネットゲートウェイ』→『インターネットゲートウェイの作成』を選択します。『名前タグ』を入力し、『作成』を選択します。今回はsample-gatewayというインターネットゲートウェイを作成しました。VPCとインターネットゲートウェイを結びつけるVPCがインターネットゲートウェイを介してインターネットの世界とつながるには、VPCとインターネットゲートウェイを結びつける作業が必要です。この作業をアタッチと呼びます。インターネットゲートウェイを作成した直後のsample-gatewayは以下のようにdetachedという状態になっています。アタッチ対象のインターネットゲートウェイを選択し、『アクション』→『VPCにアタッチ』を選択します。アタッチするVPCを指定し(今回の場合はsample-dev)、『アタッチ』を選択します。以下のようにattachedになればOKです。サブネットを作成する次に、先ほど作成したVPCで利用するサブネットを作成していきます。『パブリックサブネット』と、Webサーバーを配置する『プライベートサブネット』を作成します。パブリックサブネットの作成をする『VPCダッシュボード』を開き、『サブネット』→『サブネットの作成』を選択します。必要事項を入力し、『作成』を選択します。各項目の意味は以下の通りです。サブネットを作成するアベイラビリティゾーン。サブネットで利用するアドレスの範囲を記述。ブロックサイズは『/16』から『/28』の間までである必要がある。今回は例として10.0.0.0/24にpublic-subnetという名前のプライベートサブネットを、先ほど作成したsample-devVPC内に用意するようにしました。プライベートサブネットを作成するパブリックサブネットと同様の手順で作成していきます。今回は10.0.1.0/24にprivate-subnetという名前のプライベートサブネットを作成しました。Gatewayとはプライベートサブネットからインターネットへのアウトバウンド通信を実現するためのものです。Gatewayを構築することにより、直接インターネットに接続されていないプライベートサブネット配下のサーバーでもライブラリのアップデートやインストールを行えるようになります。ゲートウェイの作成』を選択します。IPとはパブリックIPを固定するための機能です。今回は割り当て可能なEIPがなかったため『新しいEIPの作成』を選択しました。入力が完了したら『NATゲートウェイの作成』を選択します。Gatewayが作成され、ステータスが『使用可能』になればOKです。ルートテーブルを作成するルートテーブルとは通信の送信先をルール化したものです。サブネットごとにルートテーブルを設定することでサブネットからの通信の送信先を制御できるようになります。今回はパブリックサブネット用とプライベートサブネット用の2つのルートテーブルを作成します。パブリックサブネット用のルートテーブルを作成する『VPCダッシュボード』を開き、『ルートテーブル』→『ルートテーブルの作成』を選択します。必要事項を入力し、『作成』を選択します。各項目の意味は以下の通りです。ルートテーブルを利用するVPC今回は例として、public-routeというルートテーブルを、先ほど作成したsample-devVPC内に用意するようにしました。ルートテーブルとサブネットを関連付けるVPC内に存在するパブリックサブネットに先ほど作成したルートテーブルを適用させるため、ルートテーブルとサブネットの関連付けを行っていきます。関連付け対象のルートテーブルを選択し、『サブネット関連付け』→『サブネットの関連付けを編集』を選択します。関連付けしたいサブネットをチェックし、『保存』を選択します。以下のようにルートテーブルにサブネットが紐づいていればOKです。ルートテーブルを編集するサブネットからの通信をインターネットへつなぐようにするため、ルートテーブルを編集します。関連付け対象のルートテーブルを選択し、『ルート』→『ルートの編集』を選択します。『ルートの追加』を選択し、以下の設定を追加します。インターネットゲートウェイ追加が完了したら『ルートの保存』を選択します。0.0.0.0/0はデフォルトルートと呼ばれ、すべてのネットワークを集約している意味を持ちます。任意IPアドレスに対する通信の送信先がインターネットゲートウェイになるため、このルートテーブルが設定されたサブネットの通信は全てインターネットゲートウェイを向くようになります。新しく追加したルートがactiveになっていればOKです。プライベートサブネット用のルートテーブルを作成する先ほど作成したパブリックサブネット用のルートテーブルと同様の手順で今度はプライベートサブネット用のルートテーブルを作成していきます。Gatewayにし、関連付けるサブネットはprivate-subnetにします。今回はprivate-routeというルートテーブル名をつけました。セキュリティグループを作成するセキュリティグループとはグループ外との通信を制御するためのファイアウォールです。『インバウンド』と『アウトバウンド』の制御をすることができます。EC2インスタンスを作成する過程でセキュリティグループが必要になるため、まずはセキュリティグループの準備を行います。今回は踏み台サーバー用とWebサーバー用の2つのセキュリティグループを作成します。踏み台サーバー用のセキュリティグループを作成する『VPCダッシュボード』を開き、『セキュリティグループ』→『セキュリティグループを作成』を選択します。必要事項を入力し、『セキュリティグループを作成』を選択します。各項目の意味は以下の通りです。外への通信に対するルール踏み台サーバー用のセキュリティグループのため、インバウンドルールでSSHのみを許可するように設定しました。ソースを開発者が利用するグローバルIPアドレス/32を指定することで開発者しかSSH接続できないようにしています。sample-bastionという名前のセキュリティグループ名をつけました。Webサーバー用のセキュリティグループを作成する先ほど作成した踏み台サーバー用のセキュリティグループと同様の手順で作成していきます。Webサーバー用のセキュリティグループの場合、インバウンドルールで踏み台サーバーが所属するセキュリティグループからのみSSH接続をできるように設定します。今回はsample-webという名前のセキュリティグループ名をつけました。EC2インスタンスの作成をする踏み台サーバー用とWebサーバー用の2つのEC2インスタンスを作成します。踏み台サーバーを作成するAWSマネージメントコンソールでEC2を選択します。『EC2ダッシュボード』を開き、『インスタンス』→『インスタンスの作成』を選択します。インスタンスを作成する際のベースとなるマシンシメージ(AMI)を選択します。AMI』を選択します。インスタンスタイプの選択をします。今回は『t2.nano』を選択します。インスタンスの詳細設定をします。設定する内容はいくつかありますが、今回は以下の項目の設定をすればOKです。『有効』(インターネットで直接インスタンスを参照できるようにするため)ストレージの追加をします。