SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

VPCフローログ — キャプチャされる情報・されない情報・分析方法

VPCフローログが記録するフィールド、キャプチャされないトラフィックの種類、CloudWatch Logs/S3への出力設定、Athenaによるクエリ分析、セキュリティ調査での活用法を解説。

一言結論

VPCフローログはインスタンスメタデータ・DNS・DHCPのトラフィックは記録されないことを把握した上で、ACCEPT/REJECTの記録からSGとNACLどちらが遮断しているかを特定する調査ツールとして活用し、大量ログの分析にはS3+Athenaの組み合わせが最も効率的だ。

VPCフローログとは

VPCフローログはVPC内のネットワークインターフェース(ENI)に対するIPトラフィックの情報を記録するサービスだ。ネットワークのトラブルシューティング、セキュリティ分析、コンプライアンス監査に使われる。

キャプチャの対象レベル

フローログは3つのレベルで設定できる。

VPCレベル:     VPC内の全ENIのトラフィックを記録
サブネットレベル: 指定サブネット内の全ENIのトラフィックを記録
ENIレベル:     特定のENIのみ記録

フローログのデフォルトフィールド

version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status

例:
2 123456789012 eni-abc123 10.0.1.5 172.31.0.1 49152 443 6 20 4000 1617801600 1617801660 ACCEPT OK

各フィールドの意味:

  • interface-id: ENI ID
  • srcaddr / dstaddr: 送信元/送信先IPアドレス
  • srcport / dstport: 送信元/送信先ポート
  • protocol: 6=TCP, 17=UDP, 1=ICMP
  • action: ACCEPT または REJECT
  • log-status: OK, NODATA, SKIPDATA

カスタムフォーマット(追加フィールド)

デフォルトフォーマットに加えて、追加フィールドを指定できる。

aws ec2 create-flow-logs \
  --resource-type VPC \
  --resource-ids vpc-xxx \
  --traffic-type ALL \
  --deliver-logs-permission-arn arn:aws:iam::123456789012:role/FlowLogsRole \
  --log-destination-type cloud-watch-logs \
  --log-destination arn:aws:logs:ap-northeast-1:123456789012:log-group:VPCFlowLogs \
  --log-format '${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status} ${vpc-id} ${subnet-id} ${instance-id} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr}'

pkt-srcaddr / pkt-dstaddr はNAT通過後の元のIPアドレスを記録する(NATゲートウェイ通過時に有用)。

キャプチャされないトラフィック

フローログに記録されないトラフィックがある点に注意。

❌ インスタンスメタデータサービス(169.254.169.254)へのトラフィック
❌ Amazon DNS サーバー(169.254.169.253)へのトラフィック
❌ DHCP トラフィック
❌ Windows ライセンス認証サーバーへのトラフィック
❌ インスタンス外でのトラフィック(VPC外のルーティング等)

ACCEPT と REJECT の記録

ACCEPT: セキュリティグループとNACLの両方でALLOWされたトラフィック
REJECT: セキュリティグループまたはNACLでDENYされたトラフィック

→ トラブルシューティング: REJECTされているのにアクセスできない
  → フローログでREJECTを確認してどちらのルールかを特定

S3への出力とAthenaでの分析

大量のログをクエリするにはS3に出力してAthenaで分析するのが効率的だ。

-- Athena外部テーブル作成
CREATE EXTERNAL TABLE vpc_flow_logs (
  version int,
  account string,
  interfaceid string,
  sourceaddress string,
  destinationaddress string,
  sourceport int,
  destinationport int,
  protocol int,
  numpackets int,
  numbytes bigint,
  starttime int,
  endtime int,
  action string,
  logstatus string
)
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://my-flow-logs-bucket/AWSLogs/123456789012/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");

-- 特定IPへのREJECTトラフィックを調査
SELECT
  sourceaddress,
  destinationaddress,
  destinationport,
  count(*) as reject_count
FROM vpc_flow_logs
WHERE action = 'REJECT'
  AND dt = '2026-04-08'
GROUP BY 1, 2, 3
ORDER BY reject_count DESC
LIMIT 20;

セキュリティ分析のユースケース

-- ポートスキャンの検出(1分間に多数の異なるポートへのアクセス)
SELECT
  sourceaddress,
  count(DISTINCT destinationport) as unique_ports,
  min(from_unixtime(starttime)) as first_seen
FROM vpc_flow_logs
WHERE dt = '2026-04-08'
GROUP BY sourceaddress
HAVING unique_ports > 100
ORDER BY unique_ports DESC;

-- 異常な大量データ転送の検出
SELECT
  sourceaddress,
  destinationaddress,
  sum(numbytes) as total_bytes
FROM vpc_flow_logs
WHERE dt = '2026-04-08'
GROUP BY sourceaddress, destinationaddress
HAVING total_bytes > 1073741824  -- 1GB以上
ORDER BY total_bytes DESC;

CloudWatch Logs Insightsでのリアルタイム分析

# 過去1時間のREJECTを送信元IPでカウント
fields @timestamp, srcAddr, dstAddr, dstPort, action
| filter action = "REJECT"
| stats count(*) as rejects by srcAddr
| sort rejects desc
| limit 20

試験頻出ポイント

シナリオ回答
フローログが記録されないトラフィックインスタンスメタデータ(169.254.169.254)、DNS、DHCP
接続試行がREJECTになっている原因調査SGかNACLのどちらかがDENYしている
NATゲートウェイ通過後の元IPを確認pkt-srcaddr フィールド
大量ログの効率的な分析S3出力 + Athena

まとめ

VPCフローログはAWSネットワークの可視性を提供するが、すべてのトラフィックが記録されるわけではない。インスタンスメタデータへのアクセスやDHCPは記録されないことを把握した上で、セキュリティ分析にはS3+Athenaの組み合わせが有効だ。