VPC セキュリティグループとNACLの設計ガイド

VPCにおけるネットワークセキュリティは、セキュリティグループ(Security Groups)とネットワークACL(Network Access Control Lists, NACLs)という2つの主要な仕組みによって実現されます。これらの違いを理解し、適切に使い分けることで、多層防御による堅牢なセキュリティ設計を構築できます。

セキュリティグループの基本概念

仮想ファイアウォールとしての機能

セキュリティグループは、EC2インスタンスレベルで動作する仮想ファイアウォールです。インスタンスの各ネットワークインターフェースに対して、インバウンドとアウトバウンドトラフィックを制御します。

セキュリティグループの特徴

  • ステートフル: 許可された受信接続のレスポンストラフィックは自動的に許可
  • デフォルト拒否: 明示的に許可されていないトラフィックはすべて拒否
  • 動的参照: 他のセキュリティグループを参照してルールを定義可能
  • インスタンスレベル制御: 各インスタンスに最大5つまでのセキュリティグループを関連付け

セキュリティグループルールの構成要素

インバウンドルールの設定

プロトコル: TCP/UDP/ICMP
ポート範囲: 例)80, 443, 3306, 22
ソース: IP/CIDR, セキュリティグループ, プレフィックスリスト
説明: 目的を明確にする説明文

アウトバウンドルールの設定

  • デフォルト: すべてのトラフィックを許可
  • ベストプラクティス: 必要最小限のアウトバウンドアクセスのみ許可

ネットワークACL(NACL)の基本概念

サブネットレベルでの境界制御

NACLは、サブネット境界で動作するファイアウォールです。サブネットに出入りするすべてのトラフィックを検査し、ルールに基づいて許可または拒否を決定します。

NACLの特徴

  • ステートレス: インバウンドとアウトバウンドルールを個別に定義必要
  • ルール番号順: 小さい番号から順に評価、最初にマッチしたルールを適用
  • サブネットレベル制御: サブネット全体に対する境界制御
  • デフォルトACL: VPC作成時に自動生成、すべてのトラフィックを許可

NACLルールの構成要素

ルール設定の基本

ルール番号: 1-32766(小さい順に評価)
プロトコル: TCP/UDP/ICMP/すべて
ポート範囲: カスタム範囲設定可能
ソース/宛先: IP/CIDR範囲
アクション: ALLOW/DENY

セキュリティグループ vs NACL比較

機能面での違い

特徴セキュリティグループNACL
動作レベルインスタンスサブネット
ステートステートフルステートレス
デフォルト動作拒否許可(デフォルトACL)
ルール評価すべてのルールを評価番号順で最初のマッチ
ルール参照セキュリティグループID可能IP/CIDR範囲のみ

用途別使い分け指針

セキュリティグループの主な用途

  • アプリケーション層セキュリティ: サービス固有のポートアクセス制御
  • マイクロセグメンテーション: サービス間通信の細かい制御
  • 動的セキュリティ: Auto Scalingによるインスタンス増減への対応

NACLの主な用途

  • ネットワーク層セキュリティ: サブネット境界での大まかな制御
  • 拒否ルールの実装: 特定IPレンジからのアクセス完全遮断
  • コンプライアンス要件: ネットワークレベルでの明示的制御

セキュリティ設計のベストプラクティス

多層防御アーキテクチャ

3層セキュリティモデル

  1. 境界層(NACL): サブネット間通信の大局的制御
  2. アプリケーション層(セキュリティグループ): サービス固有のアクセス制御
  3. ホスト層(OS/アプリ): インスタンス内部のセキュリティ

セキュリティグループ設計原則

最小権限の原則

yaml
Web層セキュリティグループ:
  Inbound:
    - Protocol: TCP, Port: 80, Source: 0.0.0.0/0
    - Protocol: TCP, Port: 443, Source: 0.0.0.0/0
  Outbound:
    - Protocol: TCP, Port: 3000, Destination: app-sg

App層セキュリティグループ:
  Inbound:
    - Protocol: TCP, Port: 3000, Source: web-sg
  Outbound:
    - Protocol: TCP, Port: 3306, Destination: db-sg

セキュリティグループの命名規則

[環境]-[層/サービス]-[方向]-sg
例:prod-web-inbound-sg、prod-db-access-sg

NACL設計原則

効果的なルール設計

ルール 100: TCP 80 ALLOW (Web access)
ルール 110: TCP 443 ALLOW (HTTPS access)  
ルール 120: TCP 22 ALLOW (SSH from管理ネットワーク)
ルール 200: TCP 1024-65535 ALLOW (ephemeral ports)
ルール 32767: ALL DENY (default deny)

パフォーマンス考慮事項

  • よく使用されるルールは小さい番号に配置
  • 不要なルールは削除してパフォーマンス向上
  • 広範囲な拒否ルールは後方に配置

実装パターンとユースケース

Web-App-DB三層アーキテクチャ

パブリックサブネット(Web層)

yaml
セキュリティグループ設定:
  web-sg:
    Inbound: [HTTP:80, HTTPS:443] from anywhere
    Outbound: [App:3000] to app-sg

NACL設定:
  public-nacl:
    Inbound: [HTTP:80, HTTPS:443, ephemeral ports]
    Outbound: [HTTP:80, HTTPS:443, App:3000]

プライベートサブネット(App層)

yaml
セキュリティグループ設定:
  app-sg:
    Inbound: [App:3000] from web-sg
    Outbound: [DB:3306] to db-sg

NACL設定:
  private-app-nacl:
    Inbound: [App:3000, ephemeral ports]
    Outbound: [DB:3306, HTTPS:443 for updates]

データベースサブネット(DB層)

yaml
セキュリティグループ設定:
  db-sg:
    Inbound: [DB:3306] from app-sg
    Outbound: [ephemeral ports] to app-sg

NACL設定:
  private-db-nacl:
    Inbound: [DB:3306, ephemeral ports]
    Outbound: [ephemeral ports]

マイクロサービスアーキテクチャ

サービス間通信の制御

yaml
api-gateway-sg:
  Inbound: [HTTPS:443] from anywhere
  Outbound: [Service ports] to service-sgs

user-service-sg:
  Inbound: [User API] from api-gateway-sg
  Outbound: [DB, Cache] to respective services

order-service-sg:
  Inbound: [Order API] from api-gateway-sg
  Outbound: [DB, Queue] to respective services

セキュリティ監視とトラブルシューティング

VPCフローログを活用した可視化

セキュリティ分析のための設定

yaml
フローログ設定:
  - 宛先: CloudWatch Logs / S3
  - フィルター: ALL, ACCEPT, REJECT
  - 分析対象: 拒否されたトラフィックパターン

一般的な問題とデバッグ手順

  1. 接続できない場合の確認順序

    • ルートテーブルの確認
    • セキュリティグループルールの検証
    • NACLルールの検証
    • DNSまたはインスタンスの状態確認
  2. パフォーマンス問題の調査

    • フローログでの帯域幅分析
    • セキュリティグループルール数の最適化
    • NACL ルール順序の見直し

セキュリティベストプラクティス

定期的なセキュリティレビュー

  • 未使用セキュリティグループの特定と削除
  • 過度に広範囲なルールの見直し
  • セキュリティグループ参照の循環依存チェック

自動化とコンプライアンス

  • AWS Configによるセキュリティグループ設定監視
  • AWS Security Hubでのセキュリティ態勢評価
  • CloudFormationテンプレートでの標準化

まとめ

VPCにおけるセキュリティ設計は、セキュリティグループとNACLの特性を理解し、適切に組み合わせることが重要です。セキュリティグループによる細かいアプリケーションレベルの制御と、NACLによるネットワークレベルの境界制御を組み合わせることで、堅牢な多層防御を実現できます。継続的な監視と定期的な設定レビューにより、セキュリティ態勢を維持・向上させることができます。


引用元: