はじめに
外部環境⇒自社管理のAWS環境内リソースへの通信がうまくいかないことがあり、
VPCフローログでアクセス拒否されているのか調査したい場面がありました。
ログが少なければ「該当しそうなログをダウンロードしてGrep検索」で乗り切れますが、
大量のログが吐かれていたので、Athenaで対象のログを抽出しました。
備忘として記載します。
やりたいこと & 前提
・IPアドレス(xxx.xxx.xxx.xx)⇒IPアドレス(△△.△△.△.△△)の通信を、VPCフローログから抽出したい。
・VPCフローログはS3に格納されている。
事前確認
対象のVPCフローログをコンソールで確認し、保存先のS3バケットを特定します。
VPCフローログの設定確認 & 保存先S3バケット確認
VPC画面にて、対象VPCの詳細画面に遷移します。
「フローログ」タブを開き、「送信先タイプ」「送信先名」を確認します。
「tst」というS3バケットに保存されていることが分かりました。
S3バケットのディレクトリ構成確認
「フローログ」タブの「送信先」を押下し、保存先のS3バケットに移動します。
確認したい日付のフォルダまで遷移し、画面上部のディレクトリ構成を確認します。
Athenaでの抽出手順
データベース作成
クエリ画面にて、データベースを作成します。
下記SQLをコピペして実行します。
正常終了すると、データベースのドロップダウンリストに「VPCFlowLogs」が追加されます。
データベースのドロップダウンリストから「VPCFlowLogs」を選択します。
データベース名は、任意の名前で指定可能です(今回は「VPCFlowLogs」と指定しています)。
※「実行」ボタンがグレーアウトされていて押下できない場合、Athena自身のログ格納先(S3バケット)設定をしてください。
CREATE DATABASE VPCFlowLogs;
テーブル作成
クエリ画面にて、テーブルを作成します。
(データベース作成のSQLは削除してしまって大丈夫です。)
下記SQLをコピペし、事前に確認したディレクトリ情報に書き換えた後、実行します。
基本的には、S3バケット名・AWSアカウント番号の書き換えのみになります。
CREATE EXTERNAL TABLE IF NOT EXISTS 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://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");
S3バケットのVPCフローログをAthenaに取り込む
クエリ画面にて、S3バケットに格納されているVPCフローログをAthenaに取り込みます。
日付毎に取り込む必要がある為、下記日付部分を変更しつつ必要な日数分、実行します。
・dt=YYYY-MM-DD
・s3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/YYYY/MM/DD
※dt=YYYY/MM/DDと指定するとパーティションが壊れ、やり直しになるのでご注意ください。
ALTER TABLE vpc_flow_logs
ADD PARTITION (dt='2023-04-01')
location 's3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/2023/04/01';
セットアップは以上になります。
対象ログを抽出してみる
クエリ画面にて、下記SQLをコピペし、実際のIPアドレスに書き換えた後、実行します。
画面下部のクエリ結果を確認します。
確認したかったログが抽出できました!
SELECT *
FROM vpc_flow_logs
WHERE sourceaddress = 'xxx.xxx.xxx.xx' and destinationaddress = '△△.△△.△.△△';
他者に当該ログを共有したい場合は、結果をCSVでダウンロードすることも可能です。
参考にさせて頂いた記事