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 IDsrcaddr/dstaddr: 送信元/送信先IPアドレスsrcport/dstport: 送信元/送信先ポートprotocol: 6=TCP, 17=UDP, 1=ICMPaction: ACCEPT または REJECTlog-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の組み合わせが有効だ。