VPC Flow LogsをAthenaで分析する

2022年11月29日

Amazon VPC Flow Logs の Athena 統合を使って、S3 に保存した VPC Flow Logs を分析する機会があったので備忘録。Athena は難しそうなイメージがあったのですが、Athena 統合のおかげで Athena 側のややこしいところは自動で設定してくれるようになっていて、ずいぶんと敷居が低くなっていました。とはいえ、各種設定の意味をドキュメントで調べたりしたので、手順や参考にしたドキュメントを残します。

目次

  1. VPC Flow Logs を有効化
  2. VPC Flow logs が S3 に保存されているか確認する
  3. Athena 統合で CloudFormation テンプレートを作成する
  4. CloudFormation テンプレートから Athena のリソースを作成する
  5. Athena で Flow Logs をクエリする
  6. よく使う Athena のクエリ
  7. エクセルで unixtime を date に変換する

VPC Flow Logs を有効化

VPC Flow ログは、VPC の詳細画面の「Flow Logs」のタブの「Create Flow Logs」ボタンから有効化ができます。

フローログを Amazon S3 に発行する - Amazon Virtual Private Cloud を見ながら設定していきます。ポイントを以下で解説します。ここに触れているもの以外はデフォルトで良いと思います。

S3 バケットポリシーは VPC Flow Logs を作成したときに自動で設定してくれる

VPC Flow Logs を保存するための S3 バケットには、バケットポリシーを設定する必要があります。フローログのための Amazon S3 バケットのアクセス許可 に説明がありますが、VPC Flow Logs を作成したときに S3 のバケットのポリシーが自動で設定されるので、バケットポリシーは何もしなくても大丈夫でした。Terraform で VPC Flow Logs を作成したときも自動で設定されました。

Log record format は Custom format を指定する

default format だと得られる情報が少ないので Custom format を指定しましょう。使用可能なフィールド を見ながら追加のフィールドを指定します。慣れないうちはすべて指定しても良いと思います。

Terraform で項目を指定する場合は以下のようにエスケープします。

log_format = "$${version} $${account-id} $${interface-id} $${srcaddr} $${dstaddr} $${srcport} $${dstport} $${protocol} $${packets} $${bytes} $${start} $${end} $${action} $${log-status} $${subnet-id} $${instance-id} $${tcp-flags} $${type} $${pkt-srcaddr} $${pkt-dstaddr} $${region} $${az-id} $${sublocation-type} $${sublocation-id} $${pkt-src-aws-service} $${pkt-dst-aws-service} $${flow-direction} $${traffic-path}"

Log file format は Parquet を選択

高速でストレージ料金も安くなるので Parquet を選択します。詳細はフローログファイルを参照。

Partition logs by time は Every 1 hour (60 minutes) を選択

VPC Flow logs は量が多くなることが多いです。ログを時間単位で分割し、Athena のクエリの検索条件に時間を指定することで、より高速な結果が得られ、クエリコストを節約できます。詳細はフローログファイルを参照。

VPC Flow logs が S3 に保存されているか確認する

設定が完了したら 10 分ほど待ってから S3 バケットの中身をみてみます。うまくいっていれば日付でフォルダが作られて、ログが保存されています。

Athena 統合で CloudFormation テンプレートを作成する

作成された VPC Flow Logs を選択し「アクション」「Athena 統合の生成」の順に選択します。

コンソールを使用した CloudFormation テンプレートの生成 を参考に進めます。

  • パーティションのロード頻度は「毎日」を選択します。パーティションについて詳細は Athena でのデータのパーティション化 を参照。
  • パーティションの開始日と終了日は空欄にしておきます。
  • CloudFormation テンプレートを出力するための S3 バケットを選択します。私は CloudFormation をマネジメントコンソールから利用すると自動で生成される cf-templates-xxxx-ap-northeast-1 のバケットを指定しました。
  • Athena のクエリ結果を保存するための S3 バケットを作成し、選択します。

上記を設定し、「Athena 統合を生成」ボタンをクリックすると、S3 バケットに CloudFormation テンプレートが作成されるので、ローカル PC にダウンロードします。

CloudFormation テンプレートから Athena のリソースを作成する

ダウンロードした CloudFormation テンプレートを使って、Athena のリソースを作成します。

Athena で Flow Logs をクエリする

  1. Athena コンソールを開いて、右上の「ワークグループ」から CloudFormation テンプレートによって作成されたワークグループを選択します。
  2. 定義済みクエリの 1 つを選択し、必要に応じてパラメータを変更してから、クエリを実行します。
  3. Athena に結果が表示されます。S3 バケットににもクエリの結果が CSV 形式で保存されています。

よく使う Athena のクエリ

VPC Flow Logs を確認するときは何か問題が起きていることが多く、特定の IP アドレスやポート番号に絞って確認をすることが多いです。私がよく使うクエリは以下の通り。

特定の IP アドレスの通信を調べる。

SELECT * FROM fl0effxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WHERE start BETWEEN 1669605300 AND 1669606200
AND ( srcaddr = '192.168.0.10' OR dstaddr = '192.168.0.10' )
AND month = '11' AND day = '28' AND hour = '03'
ORDER BY "start" ASC

特定のポート番号の通信を調べる。

SELECT * FROM fl0effxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WHERE start BETWEEN 1669605300 AND 1669606200
AND ( srcport = 443 OR dstport = 443 )
AND month = '11' AND day = '28' AND hour = '03'
ORDER BY "start" ASC

macOS で unixtime と date の変換

上記のクエリの例で WHERE 条件で指定している の start と end が unixtime なので、macOS で unixtime と datet の変換をするコマンドを紹介します。詳細は macOS の man date コマンドを参照してください。

macOS で UTC の date を unixtime に変換する。

date -u -j -f "%Y-%m-%d %H:%M:%S" "2022-11-28 03:15:00" +%s
1669605300

macOS で UTC の unixtime を date に変換する。

date -u -r 1669606200
Mon Nov 28 03:30:00 UTC 2022

エクセルで unixtime を date に変換する

VPC Flow Logs を csv でダウンロードしたあと、エクセルで内容を確認することもよくあります。その際、start, end の unixtime を date に変換する例です。

  1. K 列に start がある場合
  2. start の隣の列に新しい列を作成
  3. ブランクのセルに=(((K2/60)/60)/24)+DATE(1970,1,1)という式を設定
  4. 列を選択して右クリック、セルのフォーマットを時間に変更
  5. 残りの空欄のセルに式を適用

VPC Flow Logs の削除

VPC Flow Logs が不要になったら、以下の手順で削除します。

  1. VPC Flow Logs を削除する
  2. Athena のワークグループを削除する
  3. Athena のクエリ結果のオブジェクトを削除する
  4. Athena 統合の CloudFormation のテンプレートを S3 から削除する
  5. CloudFormation のスタックを削除する

-技術ブログ
-