目次

AWS Network Firewall v2.0 完全ガイド

マネージドステートフルファイアウォール & IDS/IPS

AWS Network Firewall は、VPC のトラフィックを Layer 3~7 で検査・フィルタリングするマネージドステートフルファイアウォール・IDS/IPS サービスです。CloudFront・ALB・API Gateway に特化した AWS WAF とは異なり、すべての TCP/UDP トラフィック、ドメイン名ベースのフィルタリング、Suricata 互換ルールによるカスタム脅威検知を VPC レベルで提供します。Security Group・NACL の IP・ポートレベルフィルタでは対応できない、ドメイン名・プロトコル検査・マルウェア通信検知を実現し、コンプライアンス(PCI DSS・HIPAA)と多層防御を強化します。マネージド操作により初期設定から自動スケーリング・ログ管理まで AWS が担い、On-Premises サードパーティアプライアンス(Palo Alto・Fortinet)との比較では、複雑性・コストで優位ながら高度な検査機能では Tier 2 です。本ガイドは、Network Firewall のアーキテクチャ・ルール管理・検査パターン・運用設定・ベストプラクティスを体系的に解説します。


目次

  1. 概要と課題
  2. 主な特徴
  3. アーキテクチャ
  4. コアコンポーネント
  5. ルール種別と検査エンジン
  6. 主要ユースケース
  7. 設定・操作の具体例
  8. 類似サービス比較表
  9. ベストプラクティス
  10. トラブルシューティング
  11. 2025-2026 最新動向
  12. 学習リソース・参考文献
  13. 実装チェックリスト
  14. まとめ

概要と課題

Network Firewall が解決する課題

1. Security Group/NACL の検査不足

  • Security Group:IP・ポート単位、ステートレス(実質ステートフル)、プロトコルレベルのみ
  • NACL:IP・ポート単位、設定複雑
  • Network Firewall の解決:L7 ドメイン名・HTTP ヘッダ・Suricata シグネチャで高度な検査

2. VPC Egress トラフィックの制御困難

  • EC2 から悪意あるドメイン(C2 サーバ)への通信をブロックしたい(ドメインリスト)
  • 解決:Network Firewall ドメインリスト機能で一時的なマルウェア感染時の C2 通信遮断

3. AWS WAF の限界

  • AWS WAF は CloudFront・ALB・API Gateway 専用(HTTP/HTTPS のみ)
  • SSH・DNS・SMTP・カスタムプロトコル検査が必要
  • 解決:Network Firewall で全プロトコル検査

4. 既存 IDS/IPS ルールの活用不可

  • Suricata ルール(ET Labs・Talos 等)が活用できない
  • 解決:Suricata 互換ルルールを直接使用可能

ユースケース例

  • 出口フィルタリング:全社 VPC から外部への通信を .amazonaws.com, .github.com, .pypi.org のみに制限、未承認ドメインブロック
  • 東西トラフィック検査:Transit Gateway 経由の VPC 間通信を IDS/IPS で検査してラテラルムーブメント検出
  • ハイブリッド環境:VPN/Direct Connect での On-Premises 通信を検査
  • PCI DSS 対応:カード決済 VPC の入出力を Suricata ルールで IDS 検査、コンプライアンス証跡生成
  • ランサムウェア対策:既知のランサムウェア C2 IP・ドメインをドメインリストでブロック

主な特徴

特徴 説明
ステートフル検査 TCP・UDP フロー単位で状態追跡、シーケンス番号・フラグ検証
ドメイン名フィルタリング FQDN リストベース、ワイルドカード対応 (Allow/Deny)
Suricata IPS 脅威シグネチャ検知・ブロック、既知ルール資産活用
深いパケット検査(DPI) L7 までの検査で HTTP ヘッダ・ペイロード分析
マネージドルール AWS の脅威インテリジェンス統合(有料オプション)
マルチ AZ HA 各 AZ に自動デプロイ、AZ 間フェイルオーバー自動
ログ統合 CloudWatch Logs・S3 へのストリーミング、Athena 分析対応
Organizations 統合 Firewall Manager で複数アカウント一元管理
Transit Gateway 対応 HUB VPC での集中検査アーキテクチャ
API・IAM 制御 CloudFormation・Terraform・CLI で IaC 対応

アーキテクチャ

flowchart TB
    internet["インターネット"]
    fw["ファイアウォールサブネット<br/>AZ-a / AZ-b<br/>Network Firewall Endpoint(ENI)<br/>Suricata Engine / Stateful Rules<br/>ルートテーブル変更でトラフィック迂回"]
    app["パブリック / プライベートサブネット<br/>ALB / EC2 / RDS / アプリケーション層"]

    internet -->|IGW| fw -->|フィルタリング後| app

トラフィックフロー

インバウンド(IGW → Firewall → App)

flowchart LR
    igw["IGW"] --> rt["FW Subnet Route Table"] --> nfe["NF Endpoint"] --> stateless["Stateless Rules"] --> stateful["Stateful / Domain Rules"] --> alb["ALB"] --> ec2["EC2"]

アウトバウンド(App → Firewall → Internet)

flowchart LR
    ec2["EC2"] --> natrt["NATGW Subnet Route Table"] --> nfe["NF Endpoint"] --> domain["Domain List"] --> ips["Suricata IPS"] --> igw["IGW"] --> internet["Internet"]

Transit Gateway での集中検査

flowchart LR
    vpca["VPC-A"] --> tgw["Transit Gateway"]
    vpcb["VPC-B"] --> tgw
    vpcc["VPC-C"] --> tgw
    tgw --> hub["HUB VPC"] --> fw["Network Firewall"] --> igw["IGW"]
    fw --> note["全 VPC トラフィックを集中検査・ログ取得"]

コアコンポーネント

1. Firewall リソース

{
  "Name": "production-firewall",
  "VpcId": "vpc-12345",
  "SubnetMappings": [
    {
      "SubnetId": "subnet-az-a",
      "IPAddressType": "IPV4"
    },
    {
      "SubnetId": "subnet-az-b",
      "IPAddressType": "IPV4"
    }
  ],
  "FirewallPolicyArn": "arn:aws:network-firewall:...",
  "Tags": {"Environment": "prod"}
}

2. FirewallPolicy

ファイアウォールが参照するルールの定義と優先度:

{
  "StatefulDefaultActions": ["aws:alert_established", "aws:drop"],
  "StatelessDefaultActions": ["aws:pass"],
  "StatefulRuleGroupReferences": [
    {
      "ResourceArn": "arn:aws:network-firewall:...:stateful-rulegroup/suricata-rules",
      "Priority": 1
    },
    {
      "ResourceArn": "arn:aws:network-firewall:...:stateful-rulegroup/domain-list",
      "Priority": 2
    }
  ]
}

3. RuleGroup - Stateless(高速フィルタ)

{
  "RuleGroupName": "stateless-acl",
  "Type": "STATELESS",
  "Capacity": 100,
  "RulesSource": {
    "RulesSourceList": {
      "TargetTypes": ["TLS_SNI", "HTTP_HOST"],
      "GeneratedRulesType": "ALLOWLIST",
      "Targets": [
        ".github.com",
        ".aws.amazon.com"
      ]
    }
  }
}

4. RuleGroup - Stateful(ドメイン・シグネチャ検査)

ドメイン指定ルール:

{
  "RuleGroupName": "domain-filtering",
  "Type": "STATEFUL",
  "RuleVariables": {
    "IPSets": {
      "HOME_NET": ["10.0.0.0/8", "172.16.0.0/12"]
    }
  },
  "RulesSource": {
    "RulesString": "
      pass domain-list $HOME_NET any -> any 53 (msg:\"Allow home DNS\";)
      pass fqdn-filter \$ALLOWLIST any -> any any (msg:\"Allowlist\";)
      drop domain-list any any -> any any (msg:\"Block malicious domain\";)
    "
  }
}

Suricata IPS ルール:

# SQL インジェクション検知
alert http any any -> any any (
  msg:"SQL Injection Attempt";
  content:"UNION|20|SELECT";
  nocase;
  flow:established,to_server;
  sid:1000001;
)

# DNS Tunneling 検知
alert dns any any -> any 53 (
  msg:"Suspicious DNS Query Length";
  dns.query;
  content:!"|03|www|06|google|03|com|00|";
  dsize:>100;
  sid:1000002;
)

# ランサムウェア C2 通信ブロック
drop ip any any -> any any (
  msg:"Block Known C2 IP";
  ip-dst:[10.0.1.5, 192.168.1.10];
  sid:1000003;
)

5. VPC Endpoint Association(複数 VPC 対応)

HUB VPC の Firewall を他 VPC でも利用:

{
  "FirewallArn": "arn:aws:network-firewall:...",
  "VpcId": "vpc-spoke-1",
  "SubnetId": "subnet-spoke-1a",
  "Association": {
    "SubnetId": "subnet-spoke-1a",
    "AttachmentStatus": "CREATING"
  }
}

ルール種別と検査エンジン

ステートレスルール

パケット単位の独立検査、高速、低レイテンシ(< 1ms):

{
  "RuleNumber": 1,
  "RuleAction": "DROP",
  "MatchAttributes": {
    "Sources": [{"AddressDefinition": "10.0.0.0/8"}],
    "SourcePorts": [{"FromPort": 0, "ToPort": 65535}],
    "Destinations": [{"AddressDefinition": "192.168.0.0/16"}],
    "DestinationPorts": [{"FromPort": 445, "ToPort": 445}],
    "Protocols": [6],  // TCP
    "TCPFlags": [{"Flags": ["SYN"], "Masks": ["SYN|ACK"]}]
  }
}

ステートフルルール(5タプル)

フロー単位(SRC IP・SRC Port・DST IP・DST Port・Protocol)での状態追跡:

{
  "RuleGroupName": "stateful-5tuple",
  "Type": "STATEFUL",
  "RulesSource": {
    "RulesString": "
      pass tcp 10.0.0.0/8 80,443 -> any any (
        flow:established,to_server;
        msg:\"Allow internal web access\";
        sid:2000001;
      )
      drop tcp any 22 -> 10.0.0.0/8 any (
        msg:\"Block SSH inbound from internet\";
        sid:2000002;
      )
    "
  }
}

ステートフルルール(ドメインリスト)

L7 FQDN ベースフィルタ、トラフィック量 (GB) 課金:

{
  "RuleGroupName": "domain-list-rules",
  "Type": "STATEFUL",
  "RulesSource": {
    "RulesSourceList": {
      "TargetTypes": ["TLS_SNI", "HTTP_HOST"],
      "GeneratedRulesType": "ALLOWLIST",
      "Targets": [
        ".github.com",
        ".pypi.org",
        ".amazonaws.com",
        ".docker.com"
      ]
    }
  }
}

Suricata 互換ルール(IPS/IDS)

脅威シグネチャベース検知、処理エンジンは Suricata 7.0(2024年11月アップグレード):

# HTTP Request Smuggling 検知
alert http any any -> any any (
  msg:"HTTP Request Smuggling Attempt";
  content:"Content-Length|3a|";
  content:"Transfer-Encoding|3a|";
  distance:0;
  within:200;
  sid:3000001;
)

# カスタム脅威検知
pass icmp any any -> any any (
  msg:"Monitor ICMP for DDoS patterns";
  icmp.type:8;  # Echo Request
  detection_filter: track by_src, count 100, seconds 10;
  sid:3000002;
)

マネージドルール(脅威インテリジェンス)

AWS の Intelligence Feeds を活用(有料):

{
  "RuleGroupName": "managed-threat-intel",
  "Type": "STATEFUL",
  "ManagedRuleGroupConfig": {
    "ManagedRuleGroupName": "AWSManagedRulesNetworkFirewallThreatIntelligenceList"
  }
}

主要ユースケース

1. VPC 出口フィルタリング(ドメインホワイトリスト)

シナリオ:開発チームが無意識にマルウェア感染、C2 通信をブロック

aws network-firewall create-rule-group \
  --rule-group-name egress-whitelist \
  --type STATEFUL \
  --rule-group-details '{
    "RulesSource": {
      "RulesSourceList": {
        "TargetTypes": ["TLS_SNI", "HTTP_HOST"],
        "GeneratedRulesType": "ALLOWLIST",
        "Targets": [
          ".amazonaws.com",
          ".github.com",
          ".npm.org",
          ".rubygems.org",
          ".pypi.org"
        ]
      }
    }
  }' \
  --region ap-northeast-1

効果

  • マルウェア感染時の外部通信を自動遮断
  • 未承認 SaaS アクセス防止(Shadow IT 排除)
  • AWS Organizations OU ごとにポリシー分岐

2. 東西トラフィック(VPC 間)の IDS 検査

シナリオ:Transit Gateway 経由の VPC 間通信でラテラルムーブメント検出

graph LR
    VPC-A[VPC-A<br/>App Tier] -->|TGW| HUB[HUB VPC<br/>FW Endpoint]
    VPC-B[VPC-B<br/>DB Tier] -->|TGW| HUB
    HUB -->|IDS/IPS| LOG[CloudWatch Logs]
    HUB -->|Suricata Alerts| ALERT[EventBridge<br/>Auto Response]

ルール設定

# VPC 間の異常なデータベースアクセス検知
alert tcp 10.1.0.0/16 any -> 10.2.0.0/16 3306 (
  msg:"MySQL access from non-standard source";
  flow:established,to_server;
  threshold: type both, track by_src, count 100, seconds 60;
  sid:4000001;
)

# RDP Brute Force 検知
alert tcp 10.1.0.0/16 any -> 10.2.0.0/16 3389 (
  msg:"RDP Brute Force Attempt";
  flags:S;
  threshold: type threshold, track by_src, count 50, seconds 10;
  sid:4000002;
)

3. HybridCloud(VPN/DirectConnect)トラフィック検査

シナリオ:On-Premises とのハイブリッド通信で脅威検知

# VPN subnet routing を firewall endpoint 経由に
aws ec2 create-route \
  --route-table-id rtb-vpn \
  --destination-cidr-block 192.168.0.0/16 \
  --network-firewall-endpoint-id vpce-12345 \
  --region ap-northeast-1

4. PCI DSS / HIPAA コンプライアンス対応

要件:カード決済・患者情報の入出力ログ記録・検査

{
  "FirewallLogConfiguration": {
    "LogDestinationConfigs": [
      {
        "LogType": "FLOW",
        "LogDestinationType": "CloudWatch Logs",
        "LogGroupName": "/aws/network-firewall/flow-logs"
      },
      {
        "LogType": "ALERT",
        "LogDestinationType": "S3",
        "LogDestination": {
          "BucketName": "nfw-alert-logs-prod",
          "Prefix": "alerts/"
        }
      }
    ]
  }
}

Athena での検査ログ分析

SELECT
  timestamp,
  srcaddr,
  dstaddr,
  dstport,
  protocol,
  action,
  threat_intel_category
FROM network_firewall_logs
WHERE action = 'DROP'
  AND timestamp > date_format(current_timestamp - interval '1' day, '%Y-%m-%d')
ORDER BY timestamp DESC
LIMIT 100;

5. API Gateway への段階的フィルタリング

Network Firewall(L3-L7)→ WAF(L7 HTTP)の多層防御:

# NF: API Gateway リージョンエンドポイント宛のみ許可
aws network-firewall create-rule-group \
  --rule-group-name api-gateway-ips \
  --type STATELESS \
  --rule-group-details '{
    "RulesSource": {
      "RulesSourceList": {
        "TargetTypes": ["TLS_SNI"],
        "GeneratedRulesType": "ALLOWLIST",
        "Targets": ["api.example.com", "api-prod.example.com"]
      }
    }
  }'

# WAF: SQL Injection・XSS・レート制限
# (別途 WAF WebACL で設定)

6. ランサムウェア検査・隔離

シナリオ:既知のランサムウェア C2 IP・ドメインをリアルタイムでブロック

# 脅威インテリジェンス統合:Abuse.ch RansomList
aws network-firewall create-rule-group \
  --rule-group-name ransomware-iocs \
  --type STATEFUL \
  --rule-group-details '{
    "RulesSource": {
      "RulesSourceList": {
        "TargetTypes": ["TLS_SNI"],
        "GeneratedRulesType": "DENYLIST",
        "Targets": [
          "ransom-c2.example.com",
          "c2-server.evil.com"
        ]
      }
    }
  }'

7. マルチ VPC ポリシー一元管理(Firewall Manager 連携)

シナリオ:50 アカウントの全 VPC に統一ルールを適用

# Firewall Manager Policy(Network Firewall)
aws waf create-firewall-manager-resource-policy \
  --resource-policy '{
    "ResourceType": "NETWORK_FIREWALL",
    "Policy": "...",
    "Scope": "ORGANIZATION",
    "AutoRemediation": true
  }'

8. TLS/SSL インスペクション(Application Gateway 連携)

シナリオ:HTTPS トラフィック内部をディープ検査(復号化・検査・再暗号化)

# TLS Client Hello の検査(証明書ピンニング検証)
alert tls any any -> any 443 (
  msg:"Suspicious TLS Version";
  tls.version:sslv3,tlsv10,tlsv11;
  sid:5000001;
)

9. DNS セキュリティ統合

Route 53 Resolver DNS Firewall との連携:

aws route53resolver create-firewall-domain-list \
  --name malicious-domains \
  --domains file://malware-domains.txt

10. アラート自動対応(EventBridge + Lambda)

シナリオ:Network Firewall が脅威検知 → Lambda で EC2 隔離

import boto3

def lambda_handler(event, context):
    finding = event['detail']
    
    if finding['action'] == 'DROP' and finding['threat_level'] == 'HIGH':
        ec2 = boto3.client('ec2')
        
        # 疑わしい SG に変更(トラフィック遮断)
        ec2.modify_instance_attribute(
            InstanceId=finding['instance_id'],
            Groups=['sg-quarantine']
        )
        
        # SNS で通知
        sns = boto3.client('sns')
        sns.publish(
            TopicArn='arn:aws:sns:...:security-alerts',
            Subject=f"Instance Quarantined: {finding['instance_id']}",
            Message=f"Action: {finding['action']}\nThreat: {finding['msg']}"
        )

設定・操作の具体例

CLI:ステートレスルール作成

# IP プロトコル(ICMP)フロー削除
aws network-firewall create-rule-group \
  --rule-group-name block-icmp \
  --type STATELESS \
  --capacity 100 \
  --rule-group-details '{
    "RulesSource": {
      "StatelessRules": [
        {
          "RuleNumber": 1,
          "RuleAction": "DROP",
          "MatchAttributes": {
            "Sources": [{"AddressDefinition": "0.0.0.0/0"}],
            "Destinations": [{"AddressDefinition": "10.0.0.0/8"}],
            "Protocols": [1]
          }
        }
      ]
    }
  }' \
  --region ap-northeast-1

SDK(Python):Suricata ルール動的生成

import boto3

nfw = boto3.client('network-firewall', region_name='ap-northeast-1')

# 脅威インテリジェンスから Suricata ルール生成
threat_ips = ['203.0.113.50', '198.51.100.100']

suricata_rules = "\n".join([
    f'drop ip any any -> {ip} any (msg:"Block known malicious IP"; sid:{1000+i};)'
    for i, ip in enumerate(threat_ips)
])

response = nfw.create_rule_group(
    RuleGroupName='dynamic-threat-rules',
    Type='STATEFUL',
    Capacity=500,
    RuleGroupDetails={
        'RulesSource': {
            'RulesString': suricata_rules
        }
    }
)

print(f"Rule Group ARN: {response['RuleGroupResponse']['RuleGroupArn']}")

CloudFormation:マルチ AZ Firewall デプロイ

Resources:
  NetworkFirewall:
    Type: AWS::NetworkFirewall::Firewall
    Properties:
      FirewallName: prod-firewall
      VpcId: !Ref VPC
      SubnetMappings:
        - SubnetId: !Ref SubnetAZa
          IPAddressType: IPV4
        - SubnetId: !Ref SubnetAZb
          IPAddressType: IPV4
      FirewallPolicyArn: !GetAtt FirewallPolicy.FirewallPolicyArn
      Tags:
        - Key: Environment
          Value: production

  FirewallPolicy:
    Type: AWS::NetworkFirewall::FirewallPolicy
    Properties:
      FirewallPolicyName: prod-policy
      FirewallPolicyDetails:
        StatefulDefaultActions:
          - aws:alert_established
          - aws:drop
        StatelessDefaultActions:
          - aws:pass
        StatefulRuleGroupReferences:
          - ResourceArn: !GetAtt DomainRuleGroup.RuleGroupArn
            Priority: 1
          - ResourceArn: !GetAtt SuricataRuleGroup.RuleGroupArn
            Priority: 2

  DomainRuleGroup:
    Type: AWS::NetworkFirewall::RuleGroup
    Properties:
      RuleGroupName: domain-filter
      Type: STATEFUL
      Capacity: 1000
      RuleGroupDetails:
        RulesSource:
          RulesSourceList:
            TargetTypes:
              - TLS_SNI
              - HTTP_HOST
            GeneratedRulesType: ALLOWLIST
            Targets:
              - .amazonaws.com
              - .github.com

  SuricataRuleGroup:
    Type: AWS::NetworkFirewall::RuleGroup
    Properties:
      RuleGroupName: suricata-rules
      Type: STATEFUL
      Capacity: 5000
      RuleGroupDetails:
        RulesSource:
          RulesString: |
            alert http any any -> any any (
              msg:"SQL Injection Attempt";
              content:"UNION|20|SELECT";
              sid:1000001;
            )

Terraform:ドメインリスト管理

resource "aws_networkfirewall_rule_group" "domain_list" {
  name             = "domain-whitelist"
  type             = "STATEFUL"
  capacity         = 1000
  
  rule_group_details {
    rules_source {
      rules_source_list {
        target_types           = ["TLS_SNI", "HTTP_HOST"]
        generated_rules_type   = "ALLOWLIST"
        targets = [
          ".amazonaws.com",
          ".github.com",
          ".pypi.org",
          ".docker.io"
        ]
      }
    }
  }
}

resource "aws_networkfirewall_firewall" "main" {
  name            = "prod-firewall"
  vpc_id          = aws_vpc.main.id
  firewall_policy_arn = aws_networkfirewall_firewall_policy.main.arn

  subnet_mapping {
    subnet_id           = aws_subnet.firewall_az1.id
  }
  subnet_mapping {
    subnet_id           = aws_subnet.firewall_az2.id
  }

  depends_on = [aws_networkfirewall_firewall_policy.main]
}

IaC:ログ設定と Athena 統合

# CloudWatch Logs へのフローログ出力
aws network-firewall update-firewall-description \
  --firewall-arn arn:aws:network-firewall:ap-northeast-1:ACCOUNT:firewall/prod \
  --firewall-policy-change-protection false

aws network-firewall put-logging-configuration \
  --firewall-arn arn:aws:network-firewall:ap-northeast-1:ACCOUNT:firewall/prod \
  --logging-configuration '{
    "LogDestinationConfigs": [
      {
        "LogType": "FLOW",
        "LogDestinationType": "CloudWatch Logs",
        "LogGroupName": "/aws/network-firewall/flow"
      },
      {
        "LogType": "ALERT",
        "LogDestinationType": "S3",
        "LogDestination": {
          "BucketName": "nfw-alerts-bucket",
          "Prefix": "alerts/"
        }
      }
    ]
  }'

# Athena 用パーティション作成
aws athena create-work-group \
  --name nfw-queries \
  --description "Network Firewall log queries" \
  --work-group-config '{
    "ResultConfigurationUpdates": {
      "OutputLocation": "s3://athena-results-bucket/nfw/"
    }
  }'

類似サービス比較表

サービス 検査層 プロトコル ドメイン IPS/IDS マネージド 価格 導入複雑さ
Network Firewall L3-L7 全て ✅ Suricata $0.395/hr + $0.065/GB
AWS WAF L7 HTTP/S $5.00 + $0.60/M req
Security Group L3-L4 全て 無料
Palo Alto VM-Series L3-L7 全て $1500-5000/月
Fortinet FortiGate-VM L3-L7 全て $1000-4000/月
Suricata (OSS) L3-L7 全て 無料
Snort (Cisco) L3-L7 全て ライセンス別
CrowdStrike Falcon Cloud L3-L7 全て $3000+/月
Zscaler ZPA L3-L7 全て $2000+/月

推奨判断チャート

  • Network Firewall ← VPC 内全トラフィック + Suricata ルール活用 + AWS ネイティブ
  • AWS WAF ← CloudFront/ALB/API GW の HTTP 攻撃対策のみ
  • Security Group ← IP・ポートレベルの基本フィルタのみ
  • Palo Alto/Fortinet ← 高度な脅威検知 + 複雑なポリシー必要

ベストプラクティス

✅ やるべきこと

項目 理由 実装例
マルチ AZ デプロイ HA・レイテンシ最適化 各 AZ に Firewall Endpoint 配置
ドメインホワイトリスト 未承認アクセス防止・マルウェア隔離 Allow リスト: .amazonaws.com, .github.com のみ
ルール優先度管理 誤検知防止・パフォーマンス最適化 Priority 1: Domain, Priority 2: Suricata
Stop Condition 実験安全性・本番影響回避 CloudWatch Alarm で自動停止
タグ分離 カオステスト対象を限定 ChaosTest=true タグ付きリソースのみ
ログ長期保管 コンプライアンス・フォレンジック S3 へのアーカイブ、1年保持
定期ルール監査 冗長ルール削除・効率化 月 1 回、使用されないルール確認
EventBridge 統合 検知から対応までの自動化 DROP → Lambda → SG 変更・通知
Suricata ルール バージョン管理 ロールバック・監査可能性 Git で version_20260426_v1 等管理

❌ してはいけないこと

項目 問題 対策
Firewall Subnet をアプリで共有 循環・検査不可 Firewall Subnet は独占使用
ステートレスルールのみ TCP 状態を追跡できない 必ず Stateful Rules 併用
デニーリスト(Denylist)依存 新種脅威対応困難 Allowlist ベース(ホワイトリスト)を主に
ルール評価順序を意識しない 予期しない DROP Priority 明示・厳密な優先度管理
ログ無視 インシデント対応困難 必ず CloudWatch Logs・S3 に記録
本番環境で初回テスト ビジネス影響 Staging で検証後、段階的に本番展開
PCRE1 ルール使用(2024年11月以降) Suricata 7.0 で非対応 PCRE2 に移行

トラブルシューティング

症状 原因 解決策
トラフィック遮断(断絶) Route Table が Firewall に向かない Route Table 確認: aws ec2 describe-route-tables --filters Name=vpc-id,Values=vpc-xxx
DNS 名前解決失敗 ドメインリスト設定誤り NSlookup テスト、Firewall ログ確認
Suricata ルール構文エラー PCRE2 非互換・sid 重複 aws network-firewall describe-rule-group --rule-group-arn ... でエラー確認
パフォーマンス低下(レイテンシ増加) ルール評価コスト高い・キャパシティ不足 Priority 再構成、ルール簡略化
Firewall ログが出力されない ログ設定未反映・IAM 権限なし aws network-firewall describe-firewall --firewall-arn ... 確認
マルチアカウント設定できない Firewall Manager 前提条件未整備 AWS Config 有効化確認
EventBridge トリガーされない イベント形式不一致 CloudWatch Logs Insights で ルール評価順序を確認

2025-2026 最新動向

Suricata エンジン version UP(2024年11月)

  • 旧バージョン:6.0.9
  • 新バージョン:7.0(GA)
  • 主な変更
    • PCRE1 → PCRE2(Perl Compatible Regular Expressions 2 へ移行)
    • 検出精度向上・FP(False Positive)削減
    • ルール評価性能 20% 向上

マイグレーション例

# 旧ルール(PCRE1)
alert http any any -> any any (
  msg:"Old Rule";
  pcre:"/\.php\?id=\d+/";  # PCRE1
)

# 新ルール(PCRE2)
alert http any any -> any any (
  msg:"New Rule";
  pcre:"/\.php\?id=\d+/";  # PCRE2(互換)
  sid:1000001;
)

ルール自動生成・検証パイプライン(re:Invent 2025)

AWS re:Invent 2025 (DEV206) で発表:

  • Lambda 1:脅威インテリジェンス → Suricata ルール自動生成
  • Lambda 2:Suricata 構文検証
  • CodePipeline:自動デプロイ
# Threat Intel → Suricata 自動生成
import boto3

def generate_suricata_rules(threat_ips):
    rules = []
    for ip in threat_ips:
        rule = f'drop ip any any -> {ip} any (msg:"Threat IP {ip}"; sid:{hash(ip) % 100000};)'
        rules.append(rule)
    return "\n".join(rules)

# 構文検証
def validate_suricata_rules(rule_string):
    # Suricata CLI で検証
    result = subprocess.run(['suricata', '-c', '/etc/suricata/suricata.yaml', '-T', '-r', rule_string])
    return result.returncode == 0

AI/ML 統合(Bedrock AgentCore との連携予定)

  • 異常なドメイン名パターンを ML で検知
  • DGA(Domain Generation Algorithm)攻撃検知
  • TTL や他の DNS メタデータから C2 通信推定

学習リソース・参考文献

公式ドキュメント

自動化・チュートリアル

オープンソース・ベンダー

競合製品・統合

AWS セキュリティブログ


実装チェックリスト

  • [ ] 設計フェーズ

    • [ ] VPC アーキテクチャ確認(HUB-Spoke vs 分散型)
    • [ ] Firewall Subnet 設計(各 AZ で /27 以上)
    • [ ] ルール・ドメイン要件ヒアリング
    • [ ] IP・Port・Protocol の一覧化
  • [ ] デプロイフェーズ

    • [ ] Firewall リソース作成(マルチ AZ)
    • [ ] Firewall Policy 設定
    • [ ] ルールグループ作成(Stateless/Stateful/Suricata)
    • [ ] Route Table 変更(Firewall Endpoint 向け)
  • [ ] 検証フェーズ

    • [ ] 疎通テスト(Allow トラフィック)
    • [ ] ドメインリスト動作確認
    • [ ] Suricata ルール テスト(モード: alert)
    • [ ] ログ出力確認
  • [ ] 運用フェーズ

    • [ ] CloudWatch Alarms 設定(DROP率・パフォーマンス)
    • [ ] EventBridge ルール作成(自動対応)
    • [ ] ルール定期監査(月 1 回)
    • [ ] ログ保管ポリシー設定(S3 ライフサイクル)
    • [ ] ドキュメント整備(Runbook・トラブルシューティング)
  • [ ] セキュリティ強化

    • [ ] IAM ロール最小権限化
    • [ ] VPC フローログ有効化
    • [ ] GuardDuty / Security Hub 統合
    • [ ] アクセス分析(VPC Reachability Analyzer)

まとめ

AWS Network Firewall は、VPC トラフィックを Layer 3~7 で多層的に検査するマネージドステートフルファイアウォール・IDS/IPS です。

適用シーン

✅ VPC 出口のドメイン制限(マルウェア C2 隔離) ✅ Transit Gateway での集中 IDS/IPS 検査 ✅ PCI DSS・HIPAA コンプライアンス対応 ✅ 既存 Suricata ルール資産の活用

非適用シーン

❌ HTTP のみの保護(AWS WAF を使用) ❌ IP・ポートレベルのみ(Security Group で十分) ❌ 超高度な脅威検知(Palo Alto・Fortinet 選択)

導入のポイント

  1. Firewall Subnet は共有しない( 隔離が必須)
  2. ドメインリストSuricata ルール の組み合わせ
  3. マルチ AZ で HA 実現
  4. EventBridge + Lambda で自動対応パイプライン
  5. Firewall Manager で複数アカウント一元管理

Suricata 7.0 への upgrade(2024年11月)で PCRE2 移行が必須です。ルール管理を自動化し、脅威インテリジェンスと連携させることで、セキュリティ運用を大幅に効率化できます。


最終更新:2026-04-26 バージョン:v2.0