はじめに
⚠:本記事はZennにも投稿しています。
AWSのVPC フローログに関するドキュメントを読んでいると start
フィールドと end
フィールドについて気になる記述を見つけました。いまいち挙動のイメージがわかなかったので、実際に動かして確認してみました。
フィールド | 説明 |
---|---|
start | 集約間隔内にフローの最初のパケットが受信された時間 (UNIX 秒)。これは、パケットがネットワークインターフェイス上で送信または受信されてから最大 60 秒になる場合があります。 |
end | 集約間隔内にフローの最後のパケットが受信された時間 (UNIX 秒)。これは、パケットがネットワークインターフェイス上で送信または受信されてから最大 60 秒になる場合があります。 |
▲ VPC FlowLogsで使用可能なフィールド
確認のために使用した構成
AWS上にVPC FlowLogsを有効にしたVPCを作成し、EC2インスタンスを1台建てました。セキュリティグループはSSH(tcp/22)とICMPのみを許可しました。VPC FlowLogsはCloudWatch Logsに送ることでログの書き出し状況を見やすくし、最終的には当たりをつけたデータをUnix Timeの変換や分析のためにCSV形式でエクスポートし、加工しました。
VPC FlowLogsの仕様
AWSのVPC FlowLogsは、1分または10分のAggregation Intervalを指定し、そのインターバル内に対象のインターフェイスを通過したパケットを記録しています。
The aggregation interval
the period of time during which a particular flow is captured and aggregated into a flow log record. ~the maximum aggregation interval is 10 minutes. When you create a flow log, you can optionally specify a maximum aggregation interval of 1 minute.
引用:VPC Flow Logs - Amazon Virtual Private Cloud
この間に何パケット通過しようとFlowLogs上は1レコードとして処理されます。ただし、通過する方向によって別のパケットとして扱われるので、たとえばpingを送ったとするとICMP ECHO REQUESTとICMP ECHO REPLYのパケットが記録されるレコードは別のレコードとなるようです。
今回は冒頭に書いたとおり、「これは、パケットがネットワークインターフェイス上で送信または受信されてから最大60秒になる場合があります。」という挙動が実際どのようなものなのか見てみます。
観測結果
⚠:ここから先、取得したレコードを表形式で記載しますが、アスタリスク(*)つきの項目はわかりやすくするために筆者が追記した項目となりますのでご注意ください。
まずは連続したパケットを送りつけた結果です。Aggregation interval通り、1レコードは59秒(=約1分)の経過時間となっており、その間に85パケットが通過したことになっています。
フィールド | 値 |
---|---|
timestamp | 1602397806 |
*timestamp | 2020/10/11(日) 15:30:06 |
version | 2 |
account-id | xxxxxxxxxxxx |
interface-id | eni-0ff9b2e1f8edb8688 |
srcaddr | xxx.xxx.xxx.xxx |
dstaddr | 10.255.1.22 |
srcport | 52233 |
dstport | 22 |
protocol | 6 |
packets | 85 |
bytes | 8216 |
start(unixtime) | 1602397806 |
*start | 2020/10/11(日) 15:30:06 |
end(unixtime) | 1602397865 |
*end | 2020/10/11(日) 15:31:05 |
*経過時間 | 0:00:59 |
action | ACCEPT |
log-status | OK |
一方で、1パケットしか通過しなくても1レコードが59秒(=約1分)のレコードも存在しました。これが、ドキュメントに記載されている「パケットがネットワークインターフェイス上で送信または受信されてから最大60秒になる場合がある」という事象のようです。
フィールド | 値 |
---|---|
timestamp | 1602397446 |
*timestamp | 2020/10/11(日) 15:24:06 |
version | 2 |
account-id | xxxxxxxxxxxx |
interface-id | eni-0ff9b2e1f8edb8688 |
srcaddr | xxx.xxx.xxx.xxx |
dstaddr | 10.255.1.22 |
srcport | 52233 |
dstport | 22 |
protocol | 6 |
packets | 1 |
bytes | 136 |
start(unixtime) | 1602397446 |
*start | 2020/10/11(日) 15:24:06 |
end(unixtime) | 1602397505 |
*end | 2020/10/11(日) 15:25:05 |
*経過時間 | 0:00:59 |
action | ACCEPT |
log-status | OK |
「最大60秒」と言っていることからわかるように、以下の例では経過時間が39秒となっており、必ずしも経過時間が1分となるわけではないようです。
フィールド | 値 |
---|---|
timestamp | 1602397706 |
*timestamp | 2020/10/11(日) 15:28:26 |
version | 2 |
account-id | xxxxxxxxxxxx |
interface-id | eni-0ff9b2e1f8edb8688 |
srcaddr | xxx.xxx.xxx.xxx |
dstaddr | 10.255.1.22 |
srcport | 52233 |
dstport | 22 |
protocol | 6 |
packets | 1 |
bytes | 136 |
start(unixtime) | 1602397706 |
*start | 2020/10/11(日) 15:28:26 |
end(unixtime) | 1602397745 |
*end | 2020/10/11(日) 15:29:05 |
*経過時間 | 0:00:39 |
action | ACCEPT |
log-status | OK |
まとめ
今回の実験を通して、以下のことがわかりました。
- VPC FlowLogsはAggregation Interval内に通過したパケットのカウンターのような挙動をとる
- VPC FlowLogsは、Aggregation Interval内に何パケット流れようとも1レコードとして記録される
- 記録される時間は、実際にパケットが通過した時間と最大60秒のラグがある
タイムラグがあるというところで、トラブルシュート時やSIEM等での分析時には少々注意が必要そうです。
以上