スクラッチからセキュアなAWS VPCを構築するためのガイド

計画的なCIDR範囲、パブリックおよびプライベートサブネット、ルートテーブル、NAT、セキュリティグループ、フローログを使用して、セキュアなAWS VPCを構築します。

スクラッチからセキュアなAWS VPCを構築するためのガイド

AWS VPCはクラウドリソースにプライベートネットワーク境界を提供しますが、デフォルトの形状では本番環境には不十分です。データベースをパブリックサブネットに配置したり、重複するCIDR範囲を再利用したり、広範なセキュリティグループルールを開放したりすると、後で修正が困難な問題を引き起こす可能性があります。

このガイドでは、エントリポイント用のパブリックサブネット、アプリケーションおよびデータベースワークロード用のプライベートサブネット、ルートテーブル、NAT、セキュリティグループ、基本的なモニタリングを備えた、セキュアなAWS VPCをスクラッチから構築する方法を説明します。

コアVPCコンセプトの理解

設定手順に入る前に、AWS VPCの基本的な概念を理解することが重要です:

  • VPC(仮想プライベートクラウド): AWSアカウント専用の仮想ネットワーク。AWSリソースを起動できる、論理的に分離されたAWSクラウドのセクションです。
  • サブネット: VPC内のIPアドレスの範囲。作成したサブネットにAWSリソースを起動できます。サブネットは、VPCのCIDRブロックのサブセットであるCIDRブロックによって定義されます。
  • ルートテーブル: サブネットまたはゲートウェイからのネットワークトラフィックの転送先を決定するために使用される、ルートと呼ばれるルールのセット。
  • インターネットゲートウェイ(IGW): パブリックIPアドレスとゲートウェイへのルートを持つリソースに対して、インターネットルーティング可能なトラフィックを許可するVPCコンポーネント。
  • NATゲートウェイ(ネットワークアドレス変換): プライベートサブネット内のインスタンスにインターネットへのアウトバウンド接続を可能にし、インターネットからのインバウンド接続を防ぐ、高可用性でスケーラブルなNATサービス。
  • セキュリティグループ: インスタンスの仮想ファイアウォールとして機能し、インバウンドおよびアウトバウンドトラフィックを制御します。インスタンスレベルで動作します。
  • ネットワークアクセス制御リスト(NACL): VPCのオプションのセキュリティレイヤーで、1つ以上のサブネットとの間のトラフィックを制御するファイアウォールとして機能します。サブネットレベルで動作します。

ステップバイステップの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

2. VPCの作成

AWS管理コンソールでVPCダッシュボードに移動し、新しいVPCを作成します。

  1. VPCダッシュボード > お使いのVPC > VPCを作成に移動します。
  2. 名前タグ: VPCにわかりやすい名前を付けます(例:MySecureVPC)。
  3. IPv4 CIDRブロック: 計画したCIDRブロックを入力します(例:10.0.0.0/16)。
  4. IPv6 CIDRブロック: 必要に応じて、IPv6 CIDRブロックを有効にすることもできます。
  5. テナンシー: ほとんどのユースケースでは、デフォルトが適切です。専有は、より高いコストでハードウェアの分離を提供します。
  6. VPCを作成をクリックします。

3. サブネットの作成

次に、VPC内にパブリックおよびプライベートサブネットを作成します。

  1. VPCダッシュボード > サブネット > サブネットを作成に移動します。
  2. VPC ID: 作成したVPCを選択します。
  3. サブネット名: 名前を付けます(例:MyPublicSubnet-AZ1)。
  4. アベイラビリティーゾーン: アベイラビリティーゾーン(AZ)を選択します。高可用性のために、複数のAZにリソースをデプロイするのがベストプラクティスです。
  5. IPv4 CIDRブロック: このサブネットのCIDRブロックを入力します(例:10.0.1.0/24)。
  6. サブネットを作成をクリックします。

このプロセスを繰り返して、計画したすべてのパブリックおよびプライベートサブネットを作成し、耐障害性のためにそれらが異なるアベイラビリティーゾーンにあることを確認します。

4. インターネットゲートウェイ(IGW)の作成

パブリックサブネットがインターネットにアクセスするには、IGWが必要です。

  1. VPCダッシュボード > インターネットゲートウェイ > インターネットゲートウェイを作成に移動します。
  2. 名前タグ: MyVPCInternetGateway
  3. インターネットゲートウェイを作成をクリックします。
  4. 作成後、IGWを選択し、アクションをクリックして、VPCにアタッチを選択します。VPCを選択し、インターネットゲートウェイをアタッチをクリックします。

5. ルートテーブルの作成

ルートテーブルは、VPC内のトラフィックを転送します。通常、少なくとも2つ必要です:パブリックサブネット用とプライベートサブネット用です。

a. パブリックルートテーブル:

  1. VPCダッシュボード > ルートテーブル > ルートテーブルを作成に移動します。
  2. 名前タグ: MyPublicRouteTable
  3. VPC: VPCを選択します。
  4. ルートテーブルを作成をクリックします。
  5. 新しく作成されたMyPublicRouteTableを選択します。
  6. ルートタブで、ルートを編集をクリックします。
  7. ルートを追加をクリックします。
  8. 送信先: 0.0.0.0/0(すべてのIPv4トラフィック)。
  9. ターゲット: インターネットゲートウェイを選択し、IGWを選択します。
  10. ルートを保存をクリックします。
  11. サブネットの関連付け: サブネットの関連付けタブに移動し、サブネットの関連付けを編集をクリックして、パブリックサブネットをこのルートテーブルに関連付けます。

b. プライベートルートテーブル(NATゲートウェイを使用):

プライベートサブネット内のインスタンスがインターネットから直接アクセス可能にせずに、インターネットへのアウトバウンド接続(ソフトウェアアップデートなど)を開始できるようにするには、NATゲートウェイを使用します。

  1. NATゲートウェイを作成:

    • VPCダッシュボード > NATゲートウェイ > NATゲートウェイを作成に移動します。
    • 名前: MyNATGateway
    • サブネット: パブリックサブネットの1つを選択します。
    • 接続タイプ: パブリック
    • Elastic IP割り当てID: Elastic IPを割り当てるをクリックして、新しいElastic IPアドレスを作成して割り当てます。
    • NATゲートウェイを作成をクリックします。
    • 注:NATゲートウェイにはコストがかかります。基本的なアウトバウンド接続の場合、NATゲートウェイ用にパブリックサブネットに十分なIPアドレスがあることを確認してください。
  2. プライベートルートテーブルを作成:

    • VPCダッシュボード > ルートテーブル > ルートテーブルを作成に移動します。
    • 名前タグ: MyPrivateRouteTable
    • VPC: VPCを選択します。
    • ルートテーブルを作成をクリックします。
    • MyPrivateRouteTableを選択します。
    • ルートタブで、ルートを編集をクリックします。
    • ルートを追加をクリックします。
    • 送信先: 0.0.0.0/0
    • ターゲット: NATゲートウェイを選択し、NATゲートウェイを選択します。
    • ルートを保存をクリックします。
    • サブネットの関連付け: サブネットの関連付けタブに移動し、サブネットの関連付けを編集をクリックして、プライベートサブネットをこのルートテーブルに関連付けます。

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

セキュリティグループは、インスタンスレベルでステートフルファイアウォールとして機能します。定義したルールに基づいてトラフィックを許可または拒否します。

  • ベストプラクティス: 異なるタイプのリソース(例:Webサーバー、データベースサーバー、アプリケーションサーバー)に対して特定のセキュリティグループを作成します。過度に寛容なルールの使用は避けてください。

例:Webサーバーセキュリティグループ(WebServerSG

  1. VPCダッシュボード > セキュリティグループ > セキュリティグループを作成に移動します。
  2. セキュリティグループ名: WebServerSG
  3. 説明: HTTPおよびHTTPSアクセスを許可
  4. VPC: VPCを選択します。
  5. インバウンドルール:
    • タイプ:HTTP、プロトコル:TCP、ポート範囲:80、ソース:0.0.0.0/0(またはより具体的な信頼できるIP範囲)。
    • タイプ:HTTPS、プロトコル:TCP、ポート範囲:443、ソース:0.0.0.0/0(またはより具体的な信頼できるIP範囲)。
    • (オプション)タイプ:SSH、プロトコル:TCP、ポート範囲:22、ソース:信頼できるIPアドレス/範囲(管理に重要)。
  6. アウトバウンドルール: デフォルトでは、すべてのアウトバウンドトラフィックを許可します(0.0.0.0/0)。必要に応じて制限できます。
  7. セキュリティグループを作成をクリックします。

例:データベースサーバーセキュリティグループ(DatabaseSG

  1. DatabaseSGという名前の新しいセキュリティグループを作成します。
  2. インバウンドルール:
    • データベースのデフォルトポート(例:MySQLの場合は3306、PostgreSQLの場合は5432)のトラフィックを、アプリケーションサーバーのセキュリティグループ(例:WebServerSGまたはAppServerSGからのみ許可するルールを追加します。
    • ソース: カスタムを選択し、アプリケーションサーバーのセキュリティグループのIDを入力します。
  3. アウトバウンドルール: 通常、すべてのアウトバウンドトラフィックを許可します。

7. ネットワークアクセス制御リスト(NACL)の設定

NACLは、サブネットレベルで動作するステートレスファイアウォールです。追加の防御レイヤーとして機能します。

  • ステートフル vs ステートレス: セキュリティグループはステートフルです(インバウンドトラフィックを許可すると、アウトバウンド応答は自動的に許可されます)。NACLはステートレスです(インバウンドおよびアウトバウンドトラフィックの両方に対してルールを明示的に定義する必要があります)。

  • ベストプラクティス: 特定のサブネットレベルのアクセス制御が必要な場合を除き、NACLはデフォルト設定のままにしておくことがよくあります。管理が複雑になる可能性があります。

NACLを使用する必要がある場合:

  1. VPCダッシュボード > ネットワークACL > ネットワークACLを作成に移動します。
  2. 名前タグ: MyNacl
  3. VPC: VPCを選択します。
  4. ネットワークACLを作成をクリックします。
  5. NACLを選択し、インバウンドルールでルールを追加します。
  6. ルール番号: NACLは、最も低い番号のルールから順にルールを評価します。将来のルール挿入に備えて、100200300などの番号を使用します。
  7. 許可/拒否: トラフィックを許可するか拒否するかを指定します。
  8. プロトコル、ポート範囲、送信元/送信先: トラフィックパラメータを定義します。
  9. 対応するアウトバウンドルールを設定することを忘れないでください。
  10. サブネットの関連付けタブに移動して、NACLをサブネットに関連付けます。

デプロイメントシナリオの例

典型的なWebアプリケーションを考えてみましょう:

  • VPC: 10.0.0.0/16

  • パブリックサブネット1(us-east-1a): 10.0.1.0/24MyPublicRouteTableおよびIGWに関連付け)

  • パブリックサブネット2(us-east-1b): 10.0.2.0/24MyPublicRouteTableおよびIGWに関連付け)

  • プライベートサブネット1(us-east-1a): 10.0.10.0/24MyPrivateRouteTableおよびNATゲートウェイに関連付け)

  • プライベートサブネット2(us-east-1b): 10.0.11.0/24MyPrivateRouteTableおよびNATゲートウェイに関連付け)

  • インターネットゲートウェイ: VPCにアタッチ。

  • NATゲートウェイ: Elastic IPを使用してパブリックサブネット1にデプロイ。

  • パブリックルートテーブル: 0.0.0.0/0をIGWに転送。パブリックサブネットに関連付け。

  • プライベートルートテーブル: 0.0.0.0/0をNATゲートウェイに転送。プライベートサブネットに関連付け。

  • ロードバランサー用セキュリティグループ(パブリックサブネット内): 0.0.0.0/0からのHTTP/HTTPSを許可。

  • Webサーバー用セキュリティグループ(プライベートサブネット内): ロードバランサーSGからのHTTP/HTTPS、および信頼できるIPからのSSHを許可。

  • データベース用セキュリティグループ(プライベートサブネット内): WebサーバーSGからのMySQL/PostgreSQLを許可。

重要なセキュリティ考慮事項

  • 最小権限の原則: セキュリティグループとNACLに必要な権限のみを付与します。送信元IPアドレスを可能な限り制限します。
  • 複数のアベイラビリティーゾーンの使用: 高可用性と災害復旧のために、サブネットとリソースを複数のAZに分散します。これは、異なるAZにサブネットを作成し、適切なルートテーブルに関連付けることで実現されます。
  • セキュリティグループとNACLの定期的なレビュー: アプリケーションの進化に応じて、セキュリティルールも進化させる必要があります。定期的に監査し、更新します。
  • 機密リソースに対するパブリックサブネットの回避: データベース、アプリケーションサーバー、およびその他の機密リソースは、プライベートサブネットに配置する必要があります。直接インターネットアクセスが必要なリソース(ロードバランサーや踏み台ホストなど)のみをパブリックサブネットに配置します。
  • 踏み台ホストの検討: プライベートサブネット内のインスタンスにSSH接続する必要がある場合は、パブリックサブネットに強化された踏み台ホストを使用することを検討します。踏み台ホストへのSSHアクセスを既知のIPアドレスに制限します。
  • VPCフローログ: VPCフローログを有効にして、VPC内のネットワークインターフェイスとの間のIPトラフィックに関する情報をキャプチャします。これは、セキュリティ監視とトラブルシューティングに非常に役立ちます。
  • ネットワークセグメンテーション: 異なるVPCとサブネットを使用して、環境(例:開発、ステージング、本番)とアプリケーションの異なる層をセグメント化します。

最終的なポイント

トラフィックフローに基づいてVPCを構築します。パブリックサブネットはロードバランサー、NATゲートウェイ、または厳密に制御された踏み台アクセスのみを公開し、アプリケーションとデータベースリソースはプライベートのままにします。起動後も、セキュリティグループ、ルートテーブル、VPCフローログを継続的に確認し、ネットワークがアプリケーションの実際の動作に合わせて調整されるようにします。