ゼロから安全なAWS VPCを構築するためのガイド
Amazon Web Services (AWS) Virtual Private Cloud (VPC) は、クラウドにアプリケーションやリソースをデプロイするための基本的な構成要素です。これは、お客様が定義した仮想ネットワーク内でAWSリソースを起動できる、AWSクラウドの論理的に分離されたセクションを提供します。不正アクセスからデータとアプリケーションを保護するためには、ゼロから安全なVPCを構築することが不可欠です。このガイドでは、新しいVPCを設計および設定するための重要なステップを順を追って説明し、最適なネットワークセグメンテーションと分離のためのサブネット、ルートテーブル、重要なセキュリティ上の考慮事項などの主要コンポーネントを網羅します。
適切に設計されたVPCは、安全なクラウドインフラストラクチャの基盤です。これにより、ネットワーク環境を制御し、アクセスルールを定義し、リソースの機密性や機能に基づいてリソースをセグメント化できます。VPCを慎重に計画し実装することで、AWSデプロイメントのセキュリティ体制を大幅に強化し、攻撃対象領域を減らし、意図しないデータ漏洩を防ぐことができます。このガイドは、特定のニーズに合わせた堅牢で安全なVPCを作成するための知識を提供します。
VPCの核となる概念の理解
設定手順に進む前に、AWS VPCの基本的な概念を把握することが不可欠です。
- VPC (Virtual Private Cloud): お客様のAWSアカウント専用の仮想ネットワークです。AWSリソースを起動できる、AWSクラウドの論理的に分離されたセクションです。
- サブネット: VPC内のIPアドレスの範囲です。作成したサブネット内にAWSリソースを起動できます。サブネットはCIDRブロックによって定義され、これはVPCのCIDRブロックのサブセットとなります。
- ルートテーブル: ルートと呼ばれる一連のルールで、サブネットまたはゲートウェイからのネットワークトラフィックの送信先を決定するために使用されます。
- インターネットゲートウェイ (IGW): VPCとインターネット間の通信を可能にするVPCコンポーネントです。これにより、VPC内のインスタンスがインターネットに接続したり、その逆の接続も可能になります。
- NATゲートウェイ (Network Address Translation): 高可用性でスケーラブルなNATサービスで、プライベートサブネット内のインスタンスがインターネットから開始されるインバウンド接続を防止しながら、インターネットアクセスを可能にします。
- セキュリティグループ: インスタンスの仮想ファイアウォールとして機能し、インバウンドおよびアウトバウンドトラフィックを制御します。インスタンスレベルで動作します。
- ネットワークアクセスコントロールリスト (NACL): 1つまたは複数のサブネットとの間でトラフィックを制御するためのファイアウォールとして機能する、VPCのオプションのセキュリティレイヤーです。サブネットレベルで動作します。
VPC作成のステップ・バイ・ステップ
安全なVPCの構築を始めましょう。
1. IPアドレススキームの計画
最初にして最も重要なステップは、VPCとそのサブネットのIPアドレス範囲を計画することです。これには、VPCのクラスレスドメイン間ルーティング (CIDR) ブロックを選択することが含まれます。
-
VPC CIDRブロック: オンプレミスネットワークや、VPNまたはDirect Connect経由で接続する可能性のある他のAWS VPCと重複しないプライベートIPアドレス範囲を選択してください。AWSは、RFC 1918 IPアドレス範囲 (10.0.0.0/8、172.16.0.0/12、または192.168.0.0/16) の使用を推奨しています。CIDRブロックは、/16 (65,536個のIPアドレス) から/28 (16個のIPアドレス) までにすることができます。
- 例:
10.0.0.0/16は、VPCに大きなアドレス空間を提供します。
- 例:
-
サブネット CIDRブロック: VPCのCIDRブロックを、サブネット用のより小さなCIDRブロックに分割します。各サブネットのCIDRブロックがVPCのCIDRブロックのサブセットであり、他のサブネットと重複しないようにしてください。
- **例 (VPCが
10.0.0.0/16の場合):- パブリックサブネット 1:
10.0.1.0/24 - パブリックサブネット 2:
10.0.2.0/24 - プライベートサブネット 1:
10.0.10.0/24 - プライベートサブネット 2:
10.0.11.0/24
- パブリックサブネット 1:
- **例 (VPCが
2. VPCの作成
AWSマネジメントコンソールのVPCダッシュボードに移動し、新しいVPCを作成します。
- VPCダッシュボード > VPC > VPCを作成 に移動します。
- 名前タグ: VPCにわかりやすい名前を付けます (例:
MySecureVPC)。 - IPv4 CIDRブロック: 計画したCIDRブロックを入力します (例:
10.0.0.0/16)。 - IPv6 CIDRブロック: 必要に応じてIPv6 CIDRブロックを有効にすることもできます。
- テナンシー: ほとんどのユースケースでは、デフォルトが適しています。専用 (Dedicated) は、より高コストでハードウェア分離を提供します。
- VPCを作成 をクリックします。
3. サブネットの作成
次に、VPC内にパブリックサブネットとプライベートサブネットを作成します。
- VPCダッシュボード > サブネット > サブネットを作成 に移動します。
- VPC ID: 今作成したVPCを選択します。
- サブネット名: 名前を提供します (例:
MyPublicSubnet-AZ1)。 - アベイラビリティゾーン: アベイラビリティゾーン (AZ) を選択します。高可用性のために、複数のAZにリソースをデプロイすることがベストプラクティスです。
- IPv4 CIDRブロック: このサブネットのCIDRブロックを入力します (例:
10.0.1.0/24)。 - サブネットを作成 をクリックします。
このプロセスを繰り返して、計画したすべてのパブリックサブネットとプライベートサブネットを作成し、回復力のためにそれらが異なるアベイラビリティゾーンにあることを確認します。
4. インターネットゲートウェイ (IGW) の作成
パブリックサブネットがインターネットにアクセスするにはIGWが必要です。
- VPCダッシュボード > インターネットゲートウェイ > インターネットゲートウェイを作成 に移動します。
- 名前タグ:
MyVPCInternetGateway。 - インターネットゲートウェイを作成 をクリックします。
- 作成後、IGWを選択し、アクションをクリックし、VPCにアタッチを選択します。お客様のVPCを選択し、インターネットゲートウェイをアタッチ をクリックします。
5. ルートテーブルの作成
ルートテーブルは、VPC内のトラフィックを転送します。通常、パブリックサブネット用とプライベートサブネット用の少なくとも2つが必要です。
a. パブリックルートテーブル:
- VPCダッシュボード > ルートテーブル > ルートテーブルを作成 に移動します。
- 名前タグ:
MyPublicRouteTable。 - VPC: お客様のVPCを選択します。
- ルートテーブルを作成 をクリックします。
- 新しく作成された
MyPublicRouteTableを選択します。 - ルート タブの下で、ルートを編集 をクリックします。
- ルートを追加 をクリックします。
- 送信先:
0.0.0.0/0(すべてのIPv4トラフィック)。 - ターゲット: インターネットゲートウェイ を選択し、お客様のIGWを選択します。
- ルートを保存 をクリックします。
- サブネットの関連付け: サブネットの関連付け タブに移動し、サブネットの関連付けを編集 をクリックし、パブリックサブネットをこのルートテーブルに関連付けます。
b. プライベートルートテーブル (NATゲートウェイ使用):
プライベートサブネット内のインスタンスがインターネットから直接アクセスされることなく、インターネットへのアウトバウンド接続 (ソフトウェア更新など) を開始できるようにするには、NATゲートウェイを使用します。
-
NATゲートウェイの作成:
- VPCダッシュボード > NATゲートウェイ > NATゲートウェイを作成 に移動します。
- 名前:
MyNATGateway。 - サブネット: いずれかのパブリックサブネットを選択します。
- 接続タイプ:
パブリック。 - Elastic IP割り当て ID: Elastic IPを割り当てる をクリックして、新しいElastic IPアドレスを作成して割り当てます。
- NATゲートウェイを作成 をクリックします。
- 注: NATゲートウェイにはコストがかかります。基本的なアウトバウンド接続のために、NATゲートウェイ用の十分なIPアドレスがパブリックサブネットで利用可能であることを確認してください。。
-
プライベートルートテーブルの作成:
- VPCダッシュボード > ルートテーブル > ルートテーブルを作成 に移動します。
- 名前タグ:
MyPrivateRouteTable。 - VPC: お客様のVPCを選択します。
- ルートテーブルを作成 をクリックします。
MyPrivateRouteTableを選択します。- ルート タブの下で、ルートを編集 をクリックします。
- ルートを追加 をクリックします。
- 送信先:
0.0.0.0/0。 - ターゲット: NATゲートウェイ を選択し、お客様のNATゲートウェイを選択します。
- ルートを保存 をクリックします。
- サブネットの関連付け: サブネットの関連付け タブに移動し、サブネットの関連付けを編集 をクリックし、プライベートサブネットをこのルートテーブルに関連付けます。
6. セキュリティグループの設定
セキュリティグループは、インスタンスレベルでステートフルなファイアウォールとして機能します。定義したルールに基づいてトラフィックを許可または拒否します。
- ベストプラクティス: 異なるタイプのリソース (例: ウェブサーバー、データベースサーバー、アプリケーションサーバー) 用に特定のセキュリティグループを作成します。制限が緩すぎるルールを使用することは避けてください。
例: ウェブサーバーセキュリティグループ (WebServerSG)
- VPCダッシュボード > セキュリティグループ > セキュリティグループを作成 に移動します。
- セキュリティグループ名:
WebServerSG。 - 説明:
HTTPおよびHTTPSアクセスを許可。 - VPC: お客様のVPCを選択します。
- インバウンドルール:
- タイプ:
HTTP、プロトコル:TCP、ポート範囲:80、ソース:0.0.0.0/0(またはより具体的な信頼できるIP範囲)。 - タイプ:
HTTPS、プロトコル:TCP、ポート範囲:443、ソース:0.0.0.0/0(またはより具体的な信頼できるIP範囲)。 - (オプション) タイプ:
SSH、プロトコル:TCP、ポート範囲:22、ソース:お客様の信頼できるIPアドレス/範囲(管理に不可欠)。
- タイプ:
- アウトバウンドルール: デフォルトでは、すべてのアウトバウンドトラフィック (
0.0.0.0/0) を許可します。必要に応じてこれを制限できます。 - セキュリティグループを作成 をクリックします。
例: データベースサーバーセキュリティグループ (DatabaseSG)
DatabaseSGという名前の新しいセキュリティグループを作成します。- インバウンドルール:
- データベースのデフォルトポート (例: MySQLの場合は
3306、PostgreSQLの場合は5432) へのトラフィックを、アプリケーションサーバーのセキュリティグループ (例:WebServerSGまたはAppServerSG) からのみ許可するルールを追加します。 - ソース: カスタム を選択してから、アプリケーションサーバーのセキュリティグループのIDを入力します。
- データベースのデフォルトポート (例: MySQLの場合は
- アウトバウンドルール: 通常、すべてのアウトバウンドトラフィックを許可します。
7. ネットワークアクセスコントロールリスト (NACL) の設定
NACLは、サブネットレベルで動作するステートレスなファイアウォールです。これは追加の防御層として機能します。
-
ステートフルとステートレス: セキュリティグループはステートフルです (インバウンドトラフィックを許可すると、アウトバウンド応答は自動的に許可されます)。NACLはステートレスです (インバウンドとアウトバウンドの両方のトラフィックに対してルールを明示的に定義する必要があります)。
-
ベストプラクティス: NACLは、特定のサブネットレベルのアクセスコントロールが必要な場合を除き、デフォルト設定のままにされることがよくあります。管理が複雑になる可能性があります。
NACLを使用する必要がある場合:
- VPCダッシュボード > ネットワーク ACL > ネットワーク ACLを作成 に移動します。
- 名前タグ:
MyNacl。 - VPC: お客様のVPCを選択します。
- ネットワーク ACLを作成 をクリックします。
- NACLを選択し、インバウンドルール の下でルールを追加します。
- ルール番号: NACLは、最も小さい番号のルールから順にルールを評価します。将来のルール挿入を可能にするために、
100、200、300などの番号を使用します。 - 許可/拒否: トラフィックを許可するか拒否するかを指定します。
- プロトコル、ポート範囲、ソース/送信先: トラフィックパラメータを定義します。
- 対応するアウトバウンドルールも設定することを忘れないでください。
- サブネットの関連付け タブに移動して、NACLをサブネットに関連付けます。
デプロイメントシナリオの例
典型的なウェブアプリケーションを考えてみましょう。
- VPC:
10.0.0.0/16 - パブリックサブネット 1 (
us-east-1a):10.0.1.0/24(MyPublicRouteTableおよび IGWに関連付け) - パブリックサブネット 2 (
us-east-1b):10.0.2.0/24(MyPublicRouteTableおよび IGWに関連付け) - プライベートサブネット 1 (
us-east-1a):10.0.10.0/24(MyPrivateRouteTableおよび NATゲートウェイに関連付け) -
プライベートサブネット 2 (
us-east-1b):10.0.11.0/24(MyPrivateRouteTableおよび NATゲートウェイに関連付け) -
インターネットゲートウェイ: VPCにアタッチされています。
- NATゲートウェイ: Elastic IPとともに
Public Subnet 1にデプロイされます。 - パブリックルートテーブル:
0.0.0.0/0をIGWに転送します。パブリックサブネットに関連付けられています。 -
プライベートルートテーブル:
0.0.0.0/0をNATゲートウェイに転送します。プライベートサブネットに関連付けられています。 -
ロードバランサー用セキュリティグループ (パブリックサブネット内):
0.0.0.0/0からのHTTP/HTTPSを許可します。 - ウェブサーバー用セキュリティグループ (プライベートサブネット内): ロードバランサーのSGからのHTTP/HTTPSと、信頼できるIPからのSSHを許可します。
- データベース用セキュリティグループ (プライベートサブネット内): ウェブサーバーのSGからのMySQL/PostgreSQLを許可します。
重要なセキュリティ上の考慮事項
- 最小権限の原則: セキュリティグループおよびNACLに必要なアクセス許可のみを付与します。ソースIPアドレスを可能な限り制限してください。
- 複数のアベイラビリティゾーンの使用: 高可用性と災害復旧のために、サブネットとリソースを複数のAZに分散させます。これは、異なるAZにサブネットを作成し、適切なルートテーブルに関連付けることで実現されます。
- セキュリティグループとNACLの定期的なレビュー: アプリケーションの進化に伴い、セキュリティルールも進化させる必要があります。定期的に監査および更新してください。
- 機密リソースに対するパブリックサブネットの回避: データベース、アプリケーションサーバー、その他の機密リソースはプライベートサブネットに配置する必要があります。直接インターネットアクセスを必要とするリソース (ロードバランサーやバスティオンホストなど) のみがパブリックサブネットにあるべきです。
- バスティオンホストの検討: プライベートサブネット内のインスタンスにSSH接続する必要がある場合は、パブリックサブネット内の強化されたバスティオンホストの使用を検討してください。バスティオンホストへのSSHアクセスは既知のIPアドレスに制限します。
- VPCフローログ: VPC内のネットワークインターフェイスに出入りするIPトラフィックに関する情報をキャプチャするために、VPCフローログを有効にします。これは、セキュリティ監視とトラブルシューティングにとって非常に重要です。
- ネットワークセグメンテーション: 環境 (例: 開発、ステージング、本番) およびアプリケーションの異なる階層をセグメント化するために、異なるVPCとサブネットを使用します。
まとめ
ゼロから安全なAWS VPCを構築するには、そのコアコンポーネントの慎重な計画と設定が必要です。CIDRブロック、サブネット、ルートテーブルを理解し、セキュリティグループとNACLを効果的に活用することで、AWSリソースのための堅牢で分離されたネットワーク環境を確立できます。セキュリティは継続的なプロセスであるため、安全なクラウドインフラストラクチャを維持するためには、継続的な監視、レビュー、およびベストプラクティスの順守が最も重要であることを忘れないでください。