本記事の内容
- 初めてAWSでサーバを建てようと考えている方向けに、最低限のセキュリティ設計を考慮したネットワークとサーバの設定方法をまとめた記事です。
最近、AWS認定ソリューションアーキテクト アソシエイト(SAA-C02)に合格しまして、
知識を再整理するために、以下のことを本記事にまとめてみました。
- ネットワーク(VPC,サブネット,インターネットゲートウェイ、NATゲートウェイ、ルートテーブル)設定方法
- サーバ(EC2、セキュリティグループ)設定方法
本記事の手順で以下のような構成のクラウド環境を作成できます。
今回は手作業でAWSのコンソールを操作して、AWSサービスを理解しつつ1~2時間ほどでサーバを建てることを目的の一つとしています。
AWSのクラウド環境の自動構築サービス(AWS CloudFormation)を使えば、AWSの知識が無くてもアカウント取得後に爆速でこちらの図の環境を作成できますが、今回の目的から離れてしまうので、そちらの紹介はこちらの記事「CloudFormationで最低限のセキュリティ設計を考慮したクラウド環境をさくっと建てる」にまとめました。
またAWSの操作画面はサービスリリースと共に更新されていくため、本記事をご覧いただくタイミングによっては、現在の画面と異なる場合があります。その点はご了承頂ければと思います。※本記事内の画面キャプチャーは2022年3月の物となっています。
設計のポイントと意図を以下に記載しておきます。
-
設計のポイント
- クラウド内のネットワークからインターネット接続するためにインターネットゲートウェイを設定
- クラウド内のネットワークをパブリックとプライベートなネットワークに分離
- プライベートネットワークにアプリケーション(AP)サーバを設置
- パブリックネットワークにAPサーバへのSSH接続用の踏み台サーバを設置
- プライベートネットワーク内のAPサーバがインターネット通信を出来るようにするNATゲートウェイをパブリックネットワークに設置
-
設計の意図
- クラウド内のネットワークをパブリック/プライベートに分離。サーバを用途に応じ適切に配置することでセキュリティ向上を図る。
- 各サーバへの通信は、ファイアウォール(AWSではネットワークACLとセキュリティグループという設定がある)で適切に制御する。
- APサーバへの通信は、http通信のみ許可し、SSH接続は踏み台サーバからのみ接続可能とする。
- 踏み台サーバへの通信は、SSH接続のみ許可
- 踏み台サーバのログイン方法も公開鍵認証とし、セキュアなログインを行う。※AWSのEC2サーバは公開鍵認証方式でのログインがデフォルト
実施環境
- Windows 10
- Chrome
- AWS
手順の流れ
- AWSアカウントの作成と初期設定
- ネットワーク設定:VPC、サブネット、インターネットゲートウェイ、NATゲートウェイ、ルートテーブル
- サーバ設定:EC2、セキュリティグループ
- サーバへのSSHログイン確認とパッケージ更新
- おまけ
1. AWSアカウントの取得と初期設定
まず初めにAWSアカウントを作成します。
まだ作成していない場合は、公式ページのこちらを参考にしてください。
作成後に実施すべき手順は、「AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ」がとても参考になりました。ありがとうございます。
アカウントのセキュリティ/課金情報の設定等の手順をまとめてくださっています。
私の場合は、gitでアプリ開発をしていないので、git-secretsの章の設定は未実施です。
2. ネットワーク設定:VPC、サブネット、インターネットゲートウェイ、NATゲートウェイ、ルートテーブル
2.1 VPC設定
VPCとはAWSアカウント内で作成できる仮想ネットワークで、
このネットワーク内にサーバやデータベース等AWSのサービスを配置できます。
今回は東京リージョンを例として説明します。 ※画面右上のリージョン設定は初期状態でバージニア北部になっている可能性があるため、必要に応じて東京リージョンへ変更を行ってください。以下となっている場合は、リージョンがバージニア北部になっています。マネジメントコンソールで違うサービスの画面を開く際には、常にリージョンを意識するように気を付けてください。
VPCやリージョンとは?という方は、こちらのページがとても分かりやすくまとまっていますので、是非参考にしてください。
※基本的なシステム構成図を理解するためのAWS基礎をまとめてみた
現在、2.1の設定を行う前の東京リージョンは以下のような構成となっています。
2.1の設定を行うことで、以下のようにVPCが配置されます。
AWSマネジメントコンソールにアクセスし、「VPCサービス」を選択する。アカウント作成時にはデフォルトのVPCが一つ作成されています。
「VPCメニュー」を選択し、「VPCを作成」をクリックする。
名前、IPv4 CIDRを入力し、その他はデフォルトのままとし、「VPCを作成」ボタンを押す。
・名前:study-vpc
・IPv4 CIDR:10.0.0.0/16
2.2 サブネット設定
次にVPC内をパブリックネットワークとプライベートネットワークに分けるために二つのサブネットを作成する。
現在、2.2の設定を行う前は以下のような構成となっています。
2.2の設定を行うことで、以下のようにサブネットが配置されます。※デフォルト設定のルートテーブルも同時に配置されます。
サブネットメニューを選択し、右上の「サブネットを作成」をクリックする。
VPC IDのプルダウンから先程作成したVPC(study-vpc)を選ぶ。
サブネット1に以下を入力する。
・サブネット名:study-pub-sub-1a
・アベイラビリティーゾーン:アジアパシフィック(東京)/ap-northeast-1a
・IPv4 CIDR:10.0.1.0/24
後程、こちらのサブネットのネットワークルーティング(ルートテーブル)にインターネットゲートウェイを設定してパブリックネットワークとする。
「新しいサブネットを追加」をクリックし、サブネット2に以下を入力する。
・サブネット名:study-pri-sub-1a
・アベイラビリティーゾーン:アジアパシフィック(東京)/ap-northeast-1a
・IPv4 CIDR:10.0.2.0/24
後程、こちらのサブネットのネットワークルーティングにNATゲートウェイをの関連付けを行いプライベートネットワークとする。
サブネットの作成が完了。
2.3 インターネットゲートウェイ設定
インターネットゲートウェイ設定を行うことで、VPC内のネットワークからインターネットに接続できるようになる。
2.3の設定を行うことで、以下のようにインターネットゲートウェイが配置されます。
メニューから「インターネットゲートウェイ」を選択し、右上の「インターネットゲートウェイの作成」をクリックする。
以下を入力し、「インターネットゲートウェイの作成」をクリックする。
名前:study-vpc-igw
右上のアクションのプルダウンから「VPCにアタッチ」をクリックする。
使用可能なVPCの選択ボックスから今回作成したVPC(study-vpc)を選択し、「インターネットゲートウェイのアタッチ」をクリックする。
インターネットゲートウェイの設定が完了。
2.4 NATゲートウェイ設定
NATゲートウェイを設定することで、プライベートネットワークからインターネットに接続できるようになります。
2.4の設定を行うことで、以下のようにNATゲートウェイが配置されます。
メニューから「NATゲートウェイ」を選択し、右上の「NATゲートウェイを作成」をクリックする。※キャプチャーだとすでにテストで作ったNATがありますが、気にしないでください。
以下を入力する。
名前:study-nat-gw
サブネット:study-pub-sub-1a ※パブリックサブネットに配置する
接続タイプ:パブリック
「Elastic IPを割り当て」をクリックし、Elastic IPの割り当てを行い、「NATゲートウェイの作成」をクリックする
Elastic IPとはグローバルIPアドレスのことで、NATゲートウェイに割り当てが必要になります。
NATゲートウェイの作成が完了。
2.5 ルートテーブル設定
ルートテーブルとは、サブネットにおいてネットワークのルーティングを行う設定である。
作成したパブリック/プライベートネットワーク用のそれぞれのサブネット(study-pub-sub-1a/study-pri-sub-1a)に対してルートテーブルの作成と設定を行う。
2.5の設定を行う前は以下のように、デフォルトのルートテーブルが配置された構成となっています。
二つのサブネットに対してデフォルトのルートテーブルが割り当てられているため、
2.5の設定を行うことで、以下のようにネットワークの役割に応じて、新しいルートテーブルを配置します。
先にパブリックネットワーク向けサブネットのルートテーブルを作成する。
メニューから「ルートテーブル」を選択し、「ルートテーブルを作成」をクリックする。
以下を入力し、「ルートテーブルを作成」をクリックする。
名前:pub-sub-route-table
VPC:先程選択した「study-vpc」を選択する
次にプライベートネットワーク向けサブネットのルートテーブルを作成する。
メニューから「ルートテーブル」を選択し、もう一度右上の「ルートテーブルを作成」をクリックする。
以下を入力し、「ルートテーブルを作成」をクリックする。
名前:pri-sub-route-table
VPC:先程選択した「study-vpc」を選択する
作成したそれぞれのルートテーブルの設定を変更する。
メニューから「ルートテーブル」を選択し、パブリックサブネット用のルートテーブル「pub-sub-route-table」をクリックし、右上のアクションボタンから「サブネットの関連付けを編集」をクリックする。
パブリックサブネット(study-pub-sub-1a)をクリックし、「関連付けを保存」する。
次にネットワークルーティングの設定を変更を行うため、再びパブリックサブネット用のルートテーブル「pub-sub-route-table」をクリックし、右上のアクションボタンから「ルートを編集」をクリックする。
「ルートを追加」をクリックし、送信先、ターゲットに以下を入力し、「変更を保存」ボタンをクリックする。
・送信先:0.0.0.0/0
・ターゲット:インターネットゲートウェイから作成したigw(study-vpc-igw)を選択
※本設定で10.0.0.0/16以外の通信を全てインターネットゲートウェイ宛にルーティングしている。
次にプライベートネットワーク用サブネットのルートテーブルの編集を行う。
メニューから「ルートテーブル」を選択し、プライベートサブネット用のルートテーブル「pri-sub-route-table」をクリックし、右上のアクションボタンから「サブネットの関連付けを編集」をクリックする。
プライベートサブネット(study-pri-sub-1a)をクリックし、「関連付けを保存」する。
次にルーティングの設定を変更を行うため、再びパブリックサブネット用のルートテーブル「pri-sub-route-table」をクリックし、右上のアクションボタンから「ルートを編集」をクリックする。
「ルートを追加」をクリックし、送信先、ターゲットに以下を入力し、「変更を保存」ボタンをクリックする。
送信先:0.0.0.0/0
ターゲット:NATゲートウェイから作成したNATゲートウェイ(study-nat-gw)を選択する
※本設定で10.0.0.0/16以外の通信を全てナットゲートウェイ宛にルーティングしている。
ここまででVPCの設定は完了。
3. サーバ設定:EC2、セキュリティグループ
3.1 セキュリティグループ設定
ここまででネットワークの設定が完了したので、サーバ関連の設定を進めていきます。
初めにセキュリティグループを作成する。
セキュリティグループとは、サーバ等のリソース単位に設定するネットワークのファイアウォールです。
似たような機能としてネットワークACLが存在するが、こちらはサブネット単位で設定します。
ここでは詳しい説明は割愛させて頂きます。
まずは、パブリックネットワークに配置するSSH踏み台サーバ向けのセキュリティグループを作成します。
上部の検索ボックスにて「EC2」サービスを入力して選択する。
左のメニューを下にスクロールし「セキュリティグループ」を選択する。
以下の情報を入力する。
・セキュリティグループ名:pub-sub-sg
・説明:pub-sub-sg
VPC欄は、作成したVPCを選択する。
※アカウント作成時にデフォルトで作成されるVPCが初期表示されている場合があるので注意。
インバウンドルールの「ルールを追加」をクリックする。
タイプを「SSH」とし、ソースをアクセス元のIPアドレスまたは帯域を指定する。
アクセス元を限定できることが望ましいが、私のクライアント環境はGIPがないためどこからでもアクセスできる設定(0.0.0.0/0)を行う。
画面下部の「セキュリティグループを作成」をクリックし、作成を完了する。
次にプライベートネットワークに配置するAPサーバ向けのセキュリティグループを作成する。
以下の情報を入力する。
・セキュリティグループ名:pri-sub-sg
・説明:pri-sub-sg
VPC欄は、作成したVPCを選択する。
※アカウント作成時にデフォルトで作成されるVPCが初期表示されている場合があるので注意。
インバウンドルールの「ルールを追加」をクリックする。
タイプを「HTTP」とし、ソースをアクセス元のIPアドレスまたは帯域を指定する。
アクセス元を限定できることが望ましいが、私のクライアント環境はGIPがないためどこからでもアクセスできる設定(0.0.0.0/0)を行う。
さらにインバウンドルールの「ルールを追加」をクリックし、踏み台サーバからのSSHの設定を行う。
タイプを「SSH」とし、ソースを踏み台サーバに割り当てるセキュリティグループを指定する。こうすることで、SSHのアクセス元を該当のセキュリティグループが紐づけられたリソースからに限定できる。
画面下部の「セキュリティグループを作成」をクリックし、作成を完了する。
3.2 EC2設定
最後にサーバの設定を行います。
現在、3.2の設定を行う前は以下のような構成となっています。
3.2の設定を行うことで、以下のようにサーバ配置され、完了となります。
この章ではSSH用の踏み台サーバとAPサーバを作成します。
まずは、SSH用の踏み台用サーバを作成します。
上部の検索ボックスにて「EC2」サービスを入力して選択する。
※私は表示された際に「バージニア北部」となっていたので注意。その場合は、東京リージョンに変更する。
無料利用枠の対象である「Amazon Linux 2 AMI (HVM) - Kernel 5.10」の「選択」をクリックする。
初期状態で無料利用枠のファミリー「t2」のタイプ「t2.micro」が選択されているので、この状態で右下の「次のステップ:インスタンスの詳細設定」をクリックする。
表示された画面で以下の内容を入力する
・ネットワーク:study-vpc ※先程作成したVPCを選択。初期状態ではデフォルトVPCとなっているので注意。
・サブネット:study-pub-sub-1a ※踏み台用サーバはパブリックネットワークに配置する。
・自動割り当てパブリックIP:有効 ※有効を選択することでインターネット側からアクセスできるようになる。
右下の「次のステップ:ストレージの追加」をクリックする。
ストレージのサイズは、デフォルトのまま8GBとし、「次のステップ:タグの追加」をクリックする。ます。必要に応じて容量を変更してください。
「タグの追加」をクリックし、以下を入力し、「次のステップ:セキュリティグループの作成」をクリックする。
キー:Name
値:ssh-server
セキュリティグループの設定では先程作成したセキュリティグループを設定するため、「既存のセキュリティグループを選択する」をクリックし、パブリックネットワーク用に作成した「pub-sub-sg」セキュリティグループを選択した状態で、右下の「確認と作成」をクリックする。
表示された内容で問題なければ、右下の「起動」をクリックして、「起動」をクリックする。
サーバにログインする際のキーペアの作成の画面が出るため任意の名前をつけて、「キーペアーのダウンロード」をクリックする。
ダウンロードが完了したら「インスタンスの作成」をクリックする。
これでサーバの作成ができた右下の「インスタンスの表示」をクリックし、作成できたことを確認する。
インスタンスの状態やステータスチェックは、作成直後だと保留中や初期化中の様な表記になっているので、完了するまでしばらく待つ。これでSSH用の踏み台サーバが作成できたので、次に同様の手順でAPサーバの手順も作成する。同一手順のためポイントだけ記載し、画面キャプチャーでの説明は割愛します。
以下がAPサーバ用の設定内容です。
・ステップ1:Amazonマシンイメージ(AMI)
・無料利用枠のAMI:Amazon Linux 2 AMI (HVM) - Kernel 5.10
・ステップ2:インスタンスのタイプ選択
・タイプ:t2micro
・ステップ3:インスタンスの詳細設定
・ネットワーク:study-vpc
・サブネット:study-pri-sub-1a ※APサーバはプライベートネットワークに配置する。
・自動割り当てパブリックIP:有効
・ステップ4:ストレージの設定
・サイズ:8 ※必要に応じて8MBから増減してください。
・ステップ5:タグの追加
・キー:Name
・値:ap-server
・ステップ6:セキュリティグループの設定
・既存のセキュリティグループを選択する
・名前:pri-sub-sg
・ステップ7:インスタンスの作成の確認
・キーペーアの作成では、先程作成したキーを使用する。※APサーバ用に新規作成しても良いです。
・既存のキーペアの選択
・「対応するプライベートキーファイル~」のチェックを行う
ここまでの手順で以下のような構成のクラウド環境ができたので、最後にサーバへSSHでアクセスできることを確認して終了とする。
4. サーバへのSSHログイン確認とパッケージ更新
EC2サービスの「インスタンス」メニューにて、SSH用踏み台サーバをクリックして、パブリック IPv4 アドレスを確認する。ここで表示されているアドレス(今回だと52.X.X.X)がSSHアクセスするIPアドレスとなる。
WindowsのSSHクライアントソフトを起動し、確認したパブリックIPv4アドレスにアクセスする。※ここではTeraTarmを利用する。ポートは22。
初めてアクセスした際に表示される以下は「続行」をクリックする。
ユーザ名;ec2-user
※パスワードではなく、「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れ「秘密鍵」ボタンを押下し、作成したキーペーアを選択する。
これでアクセスが完了した。
最低限のセキュリティアップデートとして、yumコマンドにてサーバ内のパッケージの更新を行う。「sudo -i yum update -y」コマンドを実行する。
次にAPサーバにログインするために必要な鍵ファイルをSSHサーバにアップロードを行う。
「ファイル」→「SSH SCP」をクリックする。
FromにWindows内に保管してあるキーペーアを選択し、「Send」ボタンをクリックする。
Toは空白の場合ログインユーザのホームディレクトリに転送されるため「ls -l」コマンドで確認する。キーが保存できた。
このままSSH接続に利用しても「セキュリティが低い!」とエラーで怒られるので、以下のコマンドでキーファイルにパーミッション(読み取り・編集権限の様な物)変更を行う。
chmod 400 キーファイル名
ここでSSH踏み台サーバからAPサーバへSSH接続を行う。
VPC内の接続のため、プライベートIPv4アドレスでの接続を行う。
SSH踏み台サーバで以下のコマンドを実行する。
ssh -i キーファイル名 ec2-user@プライベートIPv4アドレス
※初回アクセス時には、セキュリティ警告でyes/noを聞かれるのでyesを入力し、APサーバにログインすること。申し訳ないのですが、初回ログイン時の画面キャプチャーを取り忘れたので本キャプチャーは2回目にログインした際の物です。
アクセスが完了したので最低限のセキュリティアップデートとして、yumコマンドにてサーバ内のパッケージの更新を行う。「sudo -i yum update -y」コマンドを実行する。
これにて最低限のセキュリティを確保したクラウド環境にAWSのサーバを建てることが出来た。
手順は以上。
5. おまけ
5.1 実際のサービス提供時には耐障害性の考慮が必要
今回作った構成は、最低限の構成であり、耐障害性を担保したものではありません。
実際にサービスを提供するとなったら、アベイラビリティーゾーンを二つに分けてサーバを冗長化したりします。
そのあたりの話は奥が深いです。こちらの記事の考え方が参考になります。
AWS 耐障害性と高可用性
5.2 NATゲートウェイを常時起動しておくだけで毎月2000円~3000円かかってしまう
勉強用途で立ち上げていると地味にお金がかかります。
私は節約のために勉強のために都度、NAT Gatewayの削除、生成を行っています。
EC2インスタンスのように停止状態がないので、そこが少し不便ですね。
AWS CloudFormationをテンプレートを作成しておくと、環境の作成、削除を爆速でできるのですごい便利です。
このあたりの話は、また別記事でできたらと考えております。
長くなりましたが本記事が何かの役に立てばうれしいです。
参考文献
本記事の作成に当たり、以下の情報を参考にさせて頂きました。ありがとうございました。
追記(2022/05/22)
今回の環境の構成を作成するようのCloudFormationを作成しました。
内容はちらの記事「CloudFormationで最低限のセキュリティ設計を考慮したクラウド環境をさくっと建てる」にまとめましたので、CloudFormationについて勉強したい方や急ぎ本環境構築したい方はこちらを参照ください。