AWS Network Firewallのデプロイモデルは、複数の建物があるショッピングモール複合施設の警備体制に例えると分かりやすくなります。 各建物が「VPC」、お客さんの出入り(トラフィック)をチェックする「警備ゲート」がNetwork Firewallです。
| AWSの世界 🌐 | ショッピングモールの世界 🏬 |
|---|---|
| VPC | 各建物(A棟・B棟・C棟…) |
| Network Firewall | セキュリティ検問ゲート(手荷物検査+金属探知機) |
| Firewall Endpoint | 検問ゲートの設置場所(出入口) |
| Transit Gateway | 建物間をつなぐ連絡通路のハブ(中央広場) |
| East-West トラフィック | 建物間のお客さんの移動 |
| North-South トラフィック | 外部(駐車場・道路)から建物への出入り |
| Firewall Policy / Rule Group | 警備マニュアル(チェック項目一覧) |
AWS Network Firewallは、VPC向けのステートフルかつマネージド型のネットワークファイアウォールサービスです。 Suricata互換のIDS/IPSルールエンジンを内蔵し、レイヤー3〜7のトラフィックを検査できます。 デプロイモデルの選択は、ファイアウォールをどのVPCのどこに配置するかという設計判断です。
VPC数が少ない(2〜3個以下)環境、VPCごとに完全に異なるセキュリティポリシーが必要な場合、Transit Gatewayを使わないシンプルなアーキテクチャ。
VPC数が多い(4個以上)エンタープライズ環境、VPC間通信の検査が必須な場合、セキュリティポリシーを統一管理したい組織、AWS Organizationsでマルチアカウント運用している場合。
Webアプリケーションが外部公開されており低遅延のイングレス検査が必要な場合、かつVPC間通信の統一検査も必要な大規模エンタープライズ環境。ALB/NLBの前段にFWを置きつつ、内部通信は集中管理したいハイブリッドなケース。
| 比較項目 | 🔵 分散型 | 🟣 集中型 | 🟢 複合型 |
|---|---|---|---|
| 🏬 たとえ話 | 各建物に警備員配置 | 正面玄関に集中ゲート | 正面ゲート+VIP棟ガード |
| Transit Gateway | 不要 | 必須 | 必須 |
| N-S検査 | 各VPCで検査 | 検査VPCで一括検査 | 各VPCで検査 |
| E-W検査 | ❌ 検査不可 | ✅ 検査可能 | ✅ 検査可能 |
| コスト | VPC数に比例(高) | FW1つ+TGW(中) | FW複数+TGW(高) |
| 管理の複雑さ | 低(各VPC独立) | 中(TGWルーティング) | 高(両方の管理) |
| 障害影響範囲 | そのVPCのみ | 全VPC(単一障害点) | E-W: 全VPC / N-S: そのVPC |
| 推奨VPC数 | 1〜3個 | 4個以上 | 4個以上+外部公開VPCあり |
| ポリシー管理 | VPCごとに個別 | 中央で一元管理 | 中央+個別の併用 |
Network Firewallの基本的な作成コマンドと、集中型モデルでのTGWルーティング設定例を示します。
# 1. Firewallポリシーの作成
aws network-firewall create-firewall-policy \
--firewall-policy-name "inspection-policy" \
--firewall-policy '{
"StatelessDefaultActions": ["aws:forward_to_sfe"],
"StatelessFragmentDefaultActions": ["aws:forward_to_sfe"],
"StatefulRuleGroupReferences": [
{
"ResourceArn": "arn:aws:network-firewall:ap-northeast-1:123456789012:stateful-rulegroup/block-malware"
}
]
}'
# 2. Network Firewallの作成(検査VPC内)
aws network-firewall create-firewall \
--firewall-name "central-inspection-fw" \
--firewall-policy-arn "arn:aws:...:firewall-policy/inspection-policy" \
--vpc-id "vpc-inspection123" \
--subnet-mappings '[{"SubnetId": "subnet-fw-az1"}, {"SubnetId": "subnet-fw-az2"}]'
# 3. TGWルートテーブルでトラフィックを検査VPCへ転送
aws ec2 create-transit-gateway-route \
--destination-cidr-block "0.0.0.0/0" \
--transit-gateway-route-table-id "tgw-rtb-spoke" \
--transit-gateway-attachment-id "tgw-attach-inspection-vpc"
AWSTemplateFormatVersion: '2010-09-09'
Description: Network Firewall - Centralized Inspection VPC
Resources:
# Firewall Policy
InspectionPolicy:
Type: AWS::NetworkFirewall::FirewallPolicy
Properties:
FirewallPolicyName: inspection-policy
FirewallPolicy:
StatelessDefaultActions:
- aws:forward_to_sfe
StatelessFragmentDefaultActions:
- aws:forward_to_sfe
StatefulRuleGroupReferences:
- ResourceArn: !Ref BlockMalwareRuleGroup
# Network Firewall
CentralFirewall:
Type: AWS::NetworkFirewall::Firewall
Properties:
FirewallName: central-inspection-fw
FirewallPolicyArn: !Ref InspectionPolicy
VpcId: !Ref InspectionVPC
SubnetMappings:
- SubnetId: !Ref FirewallSubnetAZ1
- SubnetId: !Ref FirewallSubnetAZ2
# Stateful Rule Group
BlockMalwareRuleGroup:
Type: AWS::NetworkFirewall::RuleGroup
Properties:
RuleGroupName: block-malware
Type: STATEFUL
Capacity: 100
RuleGroup:
RulesSource:
RulesSourceList:
TargetTypes: [HTTP_HOST, TLS_SNI]
Targets:
- ".malware-example.com"
GeneratedRulesType: DENYLIST
# Terraform - Network Firewall (集中型モデル)
resource "aws_networkfirewall_firewall_policy" "inspection" {
name = "inspection-policy"
firewall_policy {
stateless_default_actions = ["aws:forward_to_sfe"]
stateless_fragment_default_actions = ["aws:forward_to_sfe"]
stateful_rule_group_reference {
resource_arn = aws_networkfirewall_rule_group.block_malware.arn
}
}
}
resource "aws_networkfirewall_firewall" "central" {
name = "central-inspection-fw"
firewall_policy_arn = aws_networkfirewall_firewall_policy.inspection.arn
vpc_id = aws_vpc.inspection.id
dynamic "subnet_mapping" {
for_each = aws_subnet.firewall[*].id
content {
subnet_id = subnet_mapping.value
}
}
}
resource "aws_networkfirewall_rule_group" "block_malware" {
name = "block-malware"
type = "STATEFUL"
capacity = 100
rule_group {
rules_source {
rules_source_list {
target_types = ["HTTP_HOST", "TLS_SNI"]
targets = [".malware-example.com"]
generated_rules_type = "DENYLIST"
}
}
}
}
# TGWルートでトラフィックを検査VPCに誘導
resource "aws_ec2_transit_gateway_route" "to_inspection" {
destination_cidr_block = "0.0.0.0/0"
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.spoke.id
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.inspection.id
}
原因:ルートテーブルの設定ミス。IGWルートテーブルやTGWルートテーブルがFirewallエンドポイントを指していない。
✅ 対策:VPC Reachability Analyzerで経路を確認し、IGWルートテーブルのエッジアソシエーションにFirewallサブネットへの経路を追加する。
原因:集中型でTGWアプライアンスモードが無効。行きと帰りで異なるAZのFirewallを通り、ステートフル検査が失敗する。
✅ 対策:TGWのVPCアタッチメントで「Appliance Mode Support = Enable」を設定する。
原因:FirewallのLogging Configurationが未設定、またはIAMロールにCloudWatch Logs書き込み権限がない。
✅ 対策:aws network-firewall update-logging-configuration でALERT/FLOWログの出力先を設定し、IAMポリシーを確認する。
原因:TGWルートテーブルのアソシエーションまたはプロパゲーション設定の不足。該当VPCのアタッチメントが正しいルートテーブルに関連付けられていない。
✅ 対策:TGWルートテーブルのアソシエーション一覧を確認し、該当VPCのアタッチメントが正しいルートテーブル(Spoke RTB)に紐付いているか確認する。
各VPCにFWを個別配置。TGW不要。N-S検査のみ。VPC 1〜3個向け。障害はVPC単位で分離。VPCごとに個別ポリシー。🏬 各建物に警備員。
検査VPCにFW集約。TGW必須。N-S + E-W検査。VPC 4個以上向け。一元管理・低コスト。単一障害点に注意。アプライアンスモード必須。🏬 正面玄関ゲート。
E-Wは中央FW、N-Sは各VPCのFW。TGW必須。最も柔軟だが最も複雑。外部公開VPCあり+E-W検査の両方が必要な場合。🏬 正面ゲート+VIP警備。
Created by SSuzuki1063
AWS SAP Learning Resources