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層セキュリティモデル
- 境界層(NACL): サブネット間通信の大局的制御
- アプリケーション層(セキュリティグループ): サービス固有のアクセス制御
- ホスト層(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
- 分析対象: 拒否されたトラフィックパターン
一般的な問題とデバッグ手順
接続できない場合の確認順序
- ルートテーブルの確認
- セキュリティグループルールの検証
- NACLルールの検証
- DNSまたはインスタンスの状態確認
パフォーマンス問題の調査
- フローログでの帯域幅分析
- セキュリティグループルール数の最適化
- NACL ルール順序の見直し
セキュリティベストプラクティス
定期的なセキュリティレビュー
- 未使用セキュリティグループの特定と削除
- 過度に広範囲なルールの見直し
- セキュリティグループ参照の循環依存チェック
自動化とコンプライアンス
- AWS Configによるセキュリティグループ設定監視
- AWS Security Hubでのセキュリティ態勢評価
- CloudFormationテンプレートでの標準化
まとめ
VPCにおけるセキュリティ設計は、セキュリティグループとNACLの特性を理解し、適切に組み合わせることが重要です。セキュリティグループによる細かいアプリケーションレベルの制御と、NACLによるネットワークレベルの境界制御を組み合わせることで、堅牢な多層防御を実現できます。継続的な監視と定期的な設定レビューにより、セキュリティ態勢を維持・向上させることができます。
引用元:
- https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html
- https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html
- https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html
- https://aws.amazon.com/blogs/security/how-to-debug-aws-security-group-rules/
- https://docs.aws.amazon.com/config/latest/developerguide/security-group-rules.html