目次
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 のアーキテクチャ・ルール管理・検査パターン・運用設定・ベストプラクティスを体系的に解説します。
目次
- 概要と課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- ルール種別と検査エンジン
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較表
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース・参考文献
- 実装チェックリスト
- まとめ
概要と課題
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 Network Firewall Developer Guide
- Suricata Documentation
- Suricata Compatible Rules - AWS Network Firewall
- Best Practices for Suricata Rules
- AWS Network Firewall Best Practices
自動化・チュートリアル
- How to Automate Rule Management for AWS Network Firewall
- re:Invent 2025 - Automating Suricata Rules (DEV206)
オープンソース・ベンダー
- Suricata IDS/IPS Engine
- Snort Network IDS
- OWASP ModSecurity Core Rule Set
- Abuse.ch - Ransomware C2 List
- ET Labs Open Ruleset
- Talos Intelligence Ruleset
競合製品・統合
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 選択)
導入のポイント
- Firewall Subnet は共有しない( 隔離が必須)
- ドメインリスト+Suricata ルール の組み合わせ
- マルチ AZ で HA 実現
- EventBridge + Lambda で自動対応パイプライン
- Firewall Manager で複数アカウント一元管理
Suricata 7.0 への upgrade(2024年11月)で PCRE2 移行が必須です。ルール管理を自動化し、脅威インテリジェンスと連携させることで、セキュリティ運用を大幅に効率化できます。
最終更新:2026-04-26 バージョン:v2.0