- AWS Network FirewallはVPCレベルのステートフルファイアウォールで、セキュリティグループ・NACLでは防げない脅威に対応
- ルールグループ(ステートレス+ステートフル)の設計で、L3〜L7の多層防御を実現できる
- SES市場でネットワークセキュリティスキルの需要が急増しており、月額85〜120万円クラスの案件に直結する
「セキュリティグループとNACLだけでは不十分と言われたけど、何を追加すればいいかわからない…」「IDS/IPSの導入を求められているが、AWSでどう実現するのか…」——SES現場でネットワークセキュリティの強化を求められるケースが増えています。
結論から言うと、AWS Network Firewallを導入すれば、VPCレベルでのステートフルなパケットインスペクション・IDS/IPS機能・ドメインフィルタリングを実現できます。セキュリティグループやNACLでは対応できないL7レベルの脅威検知にも対応し、企業のセキュリティ要件を満たす多層防御を構築できます。
この記事はAWS完全攻略シリーズとして、Network Firewallによるネットワーク保護の実践手法を解説します。
- AWS Network Firewallの基本概念とアーキテクチャ
- セキュリティグループ・NACL・WAFとの違いと使い分け
- ルールグループの設計とSuricata互換ルールの書き方
- IDS/IPS機能を活用した脅威検知の実装
- Terraformでのインフラ自動構築方法
AWS Network Firewallとは
基本概念
AWS Network Firewallは、VPC全体のネットワークトラフィックを検査・フィルタリングするマネージドファイアウォールサービスです。
主な特徴は次の通りです。
- ステートフルインスペクション:接続状態を追跡し、戻りトラフィックを自動許可
- IDS/IPS機能:Suricata互換ルールで脅威を検知・ブロック
- ドメインフィルタリング:許可/拒否するドメイン名を指定可能
- TLSインスペクション:暗号化通信の中身を検査
- ログ統合:S3、CloudWatch Logs、Kinesis Data Firehoseに出力
AWSのネットワークセキュリティサービス比較
| サービス | レイヤー | 用途 | スケール |
|---|---|---|---|
| セキュリティグループ | L3-L4 | インスタンスレベルの通信制御 | ENI単位 |
| NACL | L3-L4 | サブネットレベルの通信制御 | サブネット単位 |
| AWS WAF | L7 | Webアプリケーション攻撃防御 | ALB/CloudFront |
| Network Firewall | L3-L7 | VPC全体のトラフィック制御 | VPC単位 |
| AWS Shield | L3-L4 | DDoS防御 | アカウント全体 |
セキュリティグループだけでは、以下の脅威に対応できません。
- マルウェアのC&C(Command & Control)通信
- 既知の悪意あるドメインへのアクセス
- SQLインジェクションなどのL7攻撃パターン
- 社内ネットワークからの不正なデータ持ち出し
WAFとの使い分けについては「AWS WAF & Shield セキュリティガイド」を参照してください。
Network Firewallのアーキテクチャ
基本的なデプロイアーキテクチャ
Network Firewallは専用のファイアウォールサブネットにデプロイします。
Internet
│
▼
Internet Gateway
│
▼
┌─────────────────────────────────┐
│ Firewall Subnet (専用) │
│ └── Network Firewall Endpoint │
└─────────────┬───────────────────┘
│
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Public Subnet │ │ Public Subnet │
│ ALB / NAT GW │ │ ALB / NAT GW│
└──────┬───────┘ └──────┬───────┘
│ │
┌──────────────┐ ┌──────────────┐
│Private Subnet │ │Private Subnet│
│ App Servers │ │ App Servers │
└──────────────┘ └──────────────┘
ルーティングの設計
Network Firewallを経由するルーティング設定がキモです。
# Internet Gateway のルートテーブル
# → ファイアウォールエンドポイントに向ける
resource "aws_route_table" "igw" {
vpc_id = aws_vpc.main.id
route {
cidr_block = aws_subnet.public_a.cidr_block
vpc_endpoint_id = tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states[*].attachment[0].endpoint_id)[0]
}
route {
cidr_block = aws_subnet.public_c.cidr_block
vpc_endpoint_id = tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states[*].attachment[0].endpoint_id)[1]
}
tags = {
Name = "${var.project}-igw-rt"
}
}
# パブリックサブネットのルートテーブル
# → アウトバウンドをファイアウォールエンドポイント経由に
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
vpc_endpoint_id = tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states[*].attachment[0].endpoint_id)[0]
}
tags = {
Name = "${var.project}-public-rt"
}
}
ルールグループの設計
ステートレスルール
ステートレスルールは、パケット単体で判断する高速なフィルタリングです。
resource "aws_networkfirewall_rule_group" "stateless_drop" {
capacity = 100
name = "${var.project}-stateless-drop"
type = "STATELESS"
rule_group {
rules_source {
stateless_rules_and_custom_actions {
# 既知の不正IPレンジをドロップ
stateless_rule {
priority = 1
rule_definition {
actions = ["aws:drop"]
match_attributes {
source {
address_definition = "203.0.113.0/24"
}
}
}
}
# ICMPフラッド防止
stateless_rule {
priority = 2
rule_definition {
actions = ["aws:drop"]
match_attributes {
protocols = [1] # ICMP
source {
address_definition = "0.0.0.0/0"
}
}
}
}
# それ以外はステートフルルールに転送
stateless_rule {
priority = 100
rule_definition {
actions = ["aws:forward_to_sfe"]
match_attributes {
source {
address_definition = "0.0.0.0/0"
}
destination {
address_definition = "0.0.0.0/0"
}
}
}
}
}
}
}
}
ステートフルルール(Suricata互換)
ステートフルルールでは、Suricata互換のルール構文を使用して高度な脅威検知を行います。
resource "aws_networkfirewall_rule_group" "stateful_threats" {
capacity = 200
name = "${var.project}-stateful-threats"
type = "STATEFUL"
rule_group {
rule_variables {
ip_sets {
key = "HOME_NET"
ip_set {
definition = ["10.0.0.0/16"]
}
}
ip_sets {
key = "EXTERNAL_NET"
ip_set {
definition = ["0.0.0.0/0"]
}
}
port_sets {
key = "HTTP_PORTS"
port_set {
definition = ["80", "443", "8080"]
}
}
}
rules_source {
rules_string = <<-RULES
# SQLインジェクション検知
alert http $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (
msg:"SQL Injection Attempt Detected";
content:"UNION"; nocase;
content:"SELECT"; nocase; distance:0;
sid:1000001; rev:1;
classtype:web-application-attack;
)
# マルウェアC&C通信の検知
alert dns $HOME_NET any -> any any (
msg:"Known Malware C2 Domain";
dns.query; content:"malware-c2.example.com";
sid:1000002; rev:1;
classtype:trojan-activity;
)
# SSHブルートフォース検知
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (
msg:"SSH Brute Force Attempt";
flow:to_server,established;
threshold:type threshold, track by_src, count 5, seconds 60;
sid:1000003; rev:1;
classtype:attempted-admin;
)
# 機密データの外部送信検知
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"Potential Data Exfiltration - Large Upload";
flow:to_server,established;
dsize:>1000000;
sid:1000004; rev:1;
classtype:policy-violation;
)
# 暗号通貨マイニング通信の検知
alert tls $HOME_NET any -> $EXTERNAL_NET any (
msg:"Crypto Mining Pool Connection";
tls.sni; content:"pool."; nocase;
sid:1000005; rev:1;
classtype:trojan-activity;
)
RULES
}
stateful_rule_options {
capacity = 200
}
}
}
ドメインフィルタリング
許可リスト方式で外部通信を制御するルールです。
resource "aws_networkfirewall_rule_group" "domain_allowlist" {
capacity = 100
name = "${var.project}-domain-allowlist"
type = "STATEFUL"
rule_group {
rule_variables {
ip_sets {
key = "HOME_NET"
ip_set {
definition = ["10.0.0.0/16"]
}
}
}
rules_source {
rules_source_list {
generated_rules_type = "ALLOWLIST"
target_types = ["HTTP_HOST", "TLS_SNI"]
targets = [
".amazonaws.com",
".github.com",
".npmjs.org",
".docker.io",
".docker.com",
"registry.npmjs.org",
".googleapis.com",
".slack.com",
".datadoghq.com",
]
}
}
}
}

Terraformでのフル構築
ファイアウォールリソースの定義
# Network Firewall本体
resource "aws_networkfirewall_firewall" "main" {
name = "${var.project}-${var.environment}-firewall"
firewall_policy_arn = aws_networkfirewall_firewall_policy.main.arn
vpc_id = aws_vpc.main.id
dynamic "subnet_mapping" {
for_each = aws_subnet.firewall
content {
subnet_id = subnet_mapping.value.id
}
}
tags = merge(local.common_tags, {
Name = "${var.project}-${var.environment}-firewall"
})
}
# ファイアウォールポリシー
resource "aws_networkfirewall_firewall_policy" "main" {
name = "${var.project}-${var.environment}-policy"
firewall_policy {
stateless_default_actions = ["aws:forward_to_sfe"]
stateless_fragment_default_actions = ["aws:drop"]
stateless_rule_group_reference {
priority = 1
resource_arn = aws_networkfirewall_rule_group.stateless_drop.arn
}
stateful_engine_options {
rule_order = "STRICT_ORDER"
}
stateful_rule_group_reference {
priority = 1
resource_arn = aws_networkfirewall_rule_group.stateful_threats.arn
}
stateful_rule_group_reference {
priority = 2
resource_arn = aws_networkfirewall_rule_group.domain_allowlist.arn
}
}
tags = local.common_tags
}
# ファイアウォールサブネット
resource "aws_subnet" "firewall" {
count = length(var.azs)
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet(var.vpc_cidr, 8, 200 + count.index)
availability_zone = var.azs[count.index]
tags = merge(local.common_tags, {
Name = "${var.project}-${var.environment}-firewall-${var.azs[count.index]}"
Tier = "firewall"
})
}
ログ設定
resource "aws_networkfirewall_logging_configuration" "main" {
firewall_arn = aws_networkfirewall_firewall.main.arn
logging_configuration {
# アラートログ → CloudWatch Logs
log_destination_config {
log_destination = {
logGroup = aws_cloudwatch_log_group.firewall_alerts.name
}
log_destination_type = "CloudWatchLogs"
log_type = "ALERT"
}
# フローログ → S3
log_destination_config {
log_destination = {
bucketName = aws_s3_bucket.firewall_logs.id
prefix = "flow-logs"
}
log_destination_type = "S3"
log_type = "FLOW"
}
}
}
resource "aws_cloudwatch_log_group" "firewall_alerts" {
name = "/aws/network-firewall/${var.project}-${var.environment}/alerts"
retention_in_days = 90
tags = local.common_tags
}
アラートと監視の設計
CloudWatchアラームの設定
resource "aws_cloudwatch_metric_alarm" "firewall_dropped_packets" {
alarm_name = "${var.project}-firewall-high-drops"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 2
metric_name = "DroppedPackets"
namespace = "AWS/NetworkFirewall"
period = 300
statistic = "Sum"
threshold = 1000
dimensions = {
FirewallName = aws_networkfirewall_firewall.main.name
}
alarm_actions = [aws_sns_topic.security_alerts.arn]
tags = local.common_tags
}
resource "aws_cloudwatch_metric_alarm" "firewall_threat_detected" {
alarm_name = "${var.project}-firewall-threats"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "Packets"
namespace = "AWS/NetworkFirewall"
period = 60
statistic = "Sum"
threshold = 0
dimensions = {
FirewallName = aws_networkfirewall_firewall.main.name
CustomAction = "alert"
}
alarm_actions = [aws_sns_topic.security_alerts.arn]
tags = local.common_tags
}
CloudWatchの詳細設定は「AWS CloudWatch監視ガイド」を参照してください。
ログ分析クエリ
CloudWatch Logs Insightsで脅威を分析するクエリ例です。
# 過去24時間のアラートTop10(シグネチャ別)
fields @timestamp, event.alert.signature, event.src_ip, event.dest_ip
| filter event_type = "alert"
| stats count() as cnt by event.alert.signature
| sort cnt desc
| limit 10
# 特定の送信元IPからの全トラフィック
fields @timestamp, event_type, event.src_ip, event.dest_ip, event.dest_port
| filter event.src_ip = "203.0.113.50"
| sort @timestamp desc
| limit 100
# ブロックされたドメインアクセス
fields @timestamp, event.src_ip, event.tls.sni
| filter event_type = "alert" and event.alert.action = "blocked"
| stats count() as cnt by event.tls.sni
| sort cnt desc
コスト最適化
Network Firewallの料金体系
| 料金項目 | 単価(東京リージョン) |
|---|---|
| ファイアウォールエンドポイント | $0.395/時間/AZ |
| トラフィック処理 | $0.065/GB |
月額コスト例(2AZ構成、100GB/月のトラフィック)
エンドポイント: $0.395 × 24h × 30日 × 2AZ = $568.80
トラフィック: $0.065 × 100GB = $6.50
合計: 約 $575/月(約86,000円)
AWSコスト最適化の詳細は「AWS FinOpsコスト最適化ガイド」を参照してください。
コスト削減のTips
- 集中型デプロイ:Transit Gatewayと組み合わせて1箇所にファイアウォールを集約
- ルールの最適化:不要なルールを削除してパフォーマンスを改善
- トラフィックフィルタリング:ステートレスルールで不要トラフィックを早期にドロップ
SES案件でのネットワークセキュリティスキル
需要の高いスキルセット
| スキルレベル | 想定月額単価 | 求められるスキル |
|---|---|---|
| 基本 | 65〜80万円 | SG/NACLの設計、基本的なVPC構成 |
| 中級 | 80〜95万円 | Network Firewall構築、ルール設計 |
| 上級 | 95〜120万円 | IDS/IPS運用、TLSインスペクション |
| エキスパート | 120万円〜 | ゼロトラストアーキテクチャ設計 |
VPCネットワーキングの基礎は「AWS VPCネットワーク設計ガイド」を参照してください。
まとめ:AWS Network Firewallで多層防御を実現
この記事のポイントをまとめます。
- AWS Network FirewallはVPCレベルのマネージドファイアウォールで、L3〜L7の多層防御を提供
- ステートレスルールで高速なパケットフィルタリング、ステートフルルールで高度な脅威検知
- Suricata互換ルールでSQLインジェクション・マルウェア通信・ブルートフォースを検知
- ドメインフィルタリングで不正な外部通信を制御
- Terraformでインフラをコード管理し、環境の再現性を確保
- CloudWatch Logsとの連携でセキュリティイベントの分析・アラートを自動化
AWS Network Firewallのスキルを身につけ、セキュリティ案件での市場価値を高めましょう。
SES BASEでセキュリティエンジニア案件を探す
ネットワークセキュリティ・AWS・ファイアウォール設計の経験を活かせるSES案件をSES BASEで検索してみてください。