社内ネットワークとAWSの考え方を比べる学習用設計
かんたんに言うと会社の中に作るネットワークと、AWS(Amazon Web Services/インターネット経由で借りるサーバーやネットワークのサービス)で作るネットワークを、同じ考え方で並べて整理した学習ノートです。設計図とコードは書きましたが、AWS上に実際の環境はまだ作っていません。
AWS上でネットワークを分け、接続できる範囲を制限する方法を学ぶための設計例です。設定内容はTerraform(サーバーやネットワークの構成を設定ファイルに書き残し、その通りに作れるようにする道具)で記録しています。書式と構文が正しいことは自動テストで確認しています。
AWS環境の作成・削除、実際の通信確認、利用料金の確認はまだ行っていません。料金が発生するEC2(AWSで借りる仮想サーバー)、NAT Gateway(内側から外へ通信を出すための中継サービス)、Elastic IP(固定の外向けIPアドレス)は作成対象から外しています。このページは構築済みAWS環境の実績ではありません。
かんたんに言うと下の図は、AWSの中にネットワークを1つ用意し、その中を2つの区画に分けた形です。上の区画はインターネットとつながる場所、下の区画はつながらない場所です。外から中へ入るときは、必ず入口用のサーバーを1台だけ経由します。
図の中の英語表記は次の意味です。Internet Gatewayは、AWSのネットワークとインターネットをつなぐ出入口です。Route Tableは、通信をどこへ流すかを決める行き先の表です。Subnetは、ネットワークを区切った小さな区画です。Bastionは、外から中へ入るときだけ通る踏み台サーバーです。Security Groupは、サーバーごとの通信許可ルールです。SSHは、離れた場所からサーバーを文字で操作する通信です。Admin CIDRは、管理者が使うIPアドレスの範囲を指します。
10.20.0.0/16のような表記は、使えるIPアドレスの範囲を表します。斜線の後ろの数字が小さいほど範囲は広く、/16は/24より広い範囲を指します。
| 要素 | 設計値 | 社内ネットワークで近いもの | 確認すること |
|---|---|---|---|
| VPC AWS上のネットワーク全体 |
10.20.0.0/16 |
拠点やデータセンター全体のネットワーク | 将来の拡張に備え、ほかの拠点やVPN(拠点同士を安全につなぐ通信)とIPアドレスの範囲が重ならないようにします。重なると通信の行き先が定まらなくなるためです。 |
| Public Subnet 外部接続用の領域 |
10.20.10.0/24 |
外部公開用または管理用のネットワーク | インターネットへの経路を持たせます。SSH接続は管理者が使うIPアドレスの範囲だけに制限します。 |
| Private Subnet 外部へ直接公開しない領域 |
10.20.20.0/24 |
社内サーバー用のネットワーク | インターネットへ直接公開せず、管理用の入口を経由した必要な通信だけを許可します。 |
| Security Group サーバーごとの通信許可ルール |
管理用とアプリ用のルールを分ける | ファイアウォールの許可ルール | 管理用サーバーからの通信だけを許可し、ほかのサーバーへ意図せず接続できる状態を防ぎます。 |
| Terraform 構成をコードで記録する仕組み |
cloud-lab/terraform/ |
構成管理の記録 / 変更点の一覧 | fmt、init -backend=false、validateを自動テストで確認しています。AWS上での作成確認ではありません。 |
かんたんに言うとこの節は、AWSに実際に作る前の自己点検の内容です。コードの書き方が正しいかを確かめること、誰でも接続できる設定を避けること、料金が発生するものは作らないことの3点をまとめています。あわせて、実務環境ではさらに何が必要かも並べています。
変更前の確認(AWSに作る前のコード点検)
terraform fmt -checkでコードの書式を確認します。terraform init -backend=falseで、AWSを操作するための部品(プロバイダ)を取り込み、初期化できることを確認します。-backend=falseは、状態を保存する外部の置き場所に接続せずに確認するための指定です。terraform validateで、書き方の誤りと、設定同士の参照(あるまとまりが別のまとまりを正しく指しているか)を確認します。AWSに実際に作る前の段階で、コードの誤りに気づけたと言えます。
セキュリティ
- SSH接続は管理者が使うIPアドレスの範囲だけに限定し、誰でも接続できる設定(
0.0.0.0/0=すべてのIPアドレスを表す書き方)を禁止します。世界中の見知らぬ相手から接続を試される状態を防ぐためです。 - 外部へ直接公開しない領域は、管理用の入口から必要な通信だけを許可します。
- 実務では、会社で指定された安全な接続方法(SSM Session Manager、VPNなど)を優先します。SSM Session Managerは、SSH用の入口を開けずにAWSの管理画面経由でサーバーを操作できる仕組みです。開ける入口を減らせるため、より安全に運用できます。
コスト
- この学習用設計では、料金が発生するEC2、NAT Gateway、Elastic IPを作りません。
- 将来これらを作成する場合は、予算の通知と削除手順を先に用意します。消し忘れによって料金が増え続けることを防ぐためです。
- 検証用に作ったもの(サーバーやネットワークなど)には、目的と環境が分かるタグ(名前付きの目印)を付ける想定です。あとから見たときに、消してよいものを見分けられるようにするためです。
実務環境で追加するもの(未実施)
- 操作記録、通信ログ、異常検知の仕組みを追加します(CloudTrail、VPC Flow Logsなど)。CloudTrailは「誰がAWSで何を操作したか」を、VPC Flow Logsは「どの通信が行き来したか」を残す機能です。問題が起きたときに原因をたどれるようにするためです。
- 異常を知らせる通知と、通知を受けたあとの対応手順を対応させておきます。通知だけが届いて、誰も次に何をすればよいか分からない状態を防ぐためです。
- バックアップを設定し、定期的に復元できるかを確認します。
Terraformコードと確認記録
学習用の詳細設計、Terraformコード、自動テストで確認したコマンドを掲載しています。AWS実環境での動作記録ではありません。
実務環境へ進む前の学習項目
監視、通知、ログイン方法、秘密情報(パスワードや鍵の扱い)、バックアップ、変更手順など、まだ確認が必要な内容を別資料にまとめています。以下はいずれも学習用の資料です。実際の本番運用を行った実績ではありません。