𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
AWS Network Firewallセキュリティ実践ガイド|SESエンジニア向けネットワーク保護の基礎から応用まで

AWS Network Firewallセキュリティ実践ガイド|SESエンジニア向けネットワーク保護の基礎から応用まで

AWSNetwork FirewallセキュリティVPCファイアウォール
目次
⚡ 3秒でわかる!この記事のポイント
  • 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単位
NACLL3-L4サブネットレベルの通信制御サブネット単位
AWS WAFL7Webアプリケーション攻撃防御ALB/CloudFront
Network FirewallL3-L7VPC全体のトラフィック制御VPC単位
AWS ShieldL3-L4DDoS防御アカウント全体

セキュリティグループだけでは、以下の脅威に対応できません。

  • マルウェアの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",
        ]
      }
    }
  }
}

AWS Network Firewallの構成図解

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で検索してみてください。

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修