CI部1課の山﨑です。
これまでAmazon Athenaを利用してS3に保管されているAWS Config/AWS CloudTrail のログを調査する方法を調べましたが、今回はVPC Flow Logs のログを調査する方法を調べてみました。
おさらい
VPC Flow Logs
VPC Flow Logs とは
VPC フローログは、VPC のネットワークインターフェイスとの間で行き来する IP トラフィックに関する情報をキャプチャできるようにする機能です。フローログデータは Amazon CloudWatch Logs または Amazon S3 に発行できます。フローログを作成すると、選択した送信先でそのデータを取得して表示できます。
フローログは、以下のような多くのタスクに役立ちます。
- 制限の過度に厳しいセキュリティグループルールを診断する
- インスタンスに到達するトラフィックをモニタリングする
- ネットワークインターフェイスに出入りするトラフィックの方向を決定する
※引用元:https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html
VPC Flow Logsの出力単位
VPC FlowLogsはENI単位でログストリームが出力されます。そのため以下のようにENIを利用するサービスであれば送受信トラフィックを確認することが可能です。
- Elastic Load Balancing
- Amazon RDS
- Amazon ElastiCache
- Amazon Redshift
- Amazon WorkSpaces
- NAT Gateway
- Transit Gateway
- Amazon Elastic Compute Cloud
ただし、以下のフローログは記録することはできません。
- Amazon DNS サーバーに接続したときにインスタンスによって生成されるトラフィック。独自の DNS サーバーを使用する場合は、その DNS サーバーへのすべてのトラフィックが記録されます。
- Amazon Windows ライセンスのアクティベーション用に Windows インスタンスによって生成されたトラフィック。
- インスタンスメタデータ用に 169.254.169.254 との間を行き来するトラフィック。
- Amazon Time Sync Service の 169.254.169.123 との間でやり取りされるトラフィック。
- DHCP トラフィック。
- デフォルト VPC ルーターの予約済み IP アドレスへのトラフィック。
- エンドポイントのネットワークインターフェイスと Network Load Balancer のネットワークインターフェイスの間のトラフィック。
※引用元:https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html
VPC Flow Logsの見方
ログの一例
2 111111111111 eni-09234fd609f3aa6d2 10.0.20.236 172.16.0.89 49795 3389 6 3 152 1621151386 1621151388 ACCEPT OK
左から順番に
- VPC FlowLogsのバージョン(2)
- アカウントID(111111111111)
- ENI ID
- 送信元IPアドレス(10.0.20.236)
- 送信先IPアドレス(172.16.0.89)
- 送信元ポート(49795)
- 送信先ポート(3389)RDP通信
- プロトコル番号(6)TCPプロトコル
- パケット数(3)
- バイト数(152)
- 開始時刻(Unix時間)2021年05月16日 16:49:46
- 終了時刻(Unix時間)2021年05月16日 16:49:48
- 通信可否(ACCEPT = 許可された通信、REJECT = 許可されていない通信)
- ログ(OK = 正常にCloudWatch Logsに記録。NODATA = NICと通信したトラフィックはない。SKIPDATA = 一部のフローログレコードはキャプチャウィンドウ中にスキップされた。これは、内部的なキャパシティー制限、または内部エラーが原因である可能性があり
今年に入ってからVPC Flow Logs に新しく4つのメタデータフィールドが追加されるというアップデートもありましたので気になる方は以下のブログをご覧ください。
Amazon Athena
Amazon Athena とは
Amazon Athena は、標準的な SQL を使用して Amazon Simple Storage Service (Amazon S3) 内のデータを直接分析することを容易にするインタラクティブなクエリサービスです。AWS Management Console でいくつかのアクションを実行するだけで、Athena にデータの保存先の Amazon S3 を設定し、標準 SQL を使用してアドホッククエリの実行を開始できます。結果は数秒で返されます。
Athena はサーバーレスであるため、インフラストラクチャの設定や管理は不要です。また、実行したクエリにのみ課金されます。自動的にスケールしてクエリを並列実行するため、大規模なデータベースや複雑なクエリでも結果がすぐに返されます。 ※引用元:https://docs.aws.amazon.com/ja_jp/athena/latest/ug/what-is.html
Amazon Athenaは Apache Hiveのデータ定義言語(DDL)を使ってテーブルを作成し、Hadoopの分散型SQLエンジンでアドホックな分析を行うのに適しているPrestoを使ってクエリを実行しています。S3バケットはオブジェクトストレージであり、非構造化データあるいはスキーマレスデータが保管されています。Amazon Athena でクエリを実行する際はCREATE TABLEを使ってS3内のデータを構造化データに整形した上で、SQLを使ってクエリをかけていきます。
執筆時期が古いですが、Athenaについては以下のブログもご覧ください。
S3のログを調査してみる
Athena でクエリを実行するテーブルを作成
今回は以下の参考ドキュメントを参考にテーブルを作成します。
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, vpcid string, subnetid string, instanceid string, tcpflags int, type string, pktsrcaddr string, pktdstaddr string, region string, azid string, sublocationtype string, sublocationid string, pktsrcawsservice string, pktdstawsservice string, flowdirection string, trafficpath string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/ap-northeast-1/' TBLPROPERTIES ("skip.header.line.count"="1");
上記のクエリではROW FORMAT DELIMITED を指定し、SerDe の指定が省略されています。これはクエリが CSV、TSV、およびカスタム区切りファイルの LazySimpleSerDe を使用しているということです。LazySimpleSerDeはAthena がデフォルトで使用する CSV、TSV、およびカスタム区切りの形式のデータ用の SerDe です。このクエリではフィールドはスペースで終了しています。
Athena でクエリを実行する
1. Rejectされた送信元IPアドレスのトップ10を調べる
SELECT sourceaddress, destinationaddress, count(*) cnt FROM vpc_flow_logs WHERE action = 'REJECT' GROUP BY sourceaddress, destinationaddress ORDER BY cnt desc LIMIT 10;
上記のクエリを実行することで、ある任意の期間内にRejectされた送信元IPアドレスのトップ10を調べることができ、Rejectされた通信の送信元IPアドレスと送信先IPアドレスも確認することが可能です。
2. ACCEPTされた送信元IPアドレスのトップ10を調べる
SELECT sourceaddress, destinationaddress, count(*) cnt FROM vpc_flow_logs WHERE action = 'ACCEPT' GROUP BY sourceaddress, destinationaddress ORDER BY cnt desc LIMIT 10;
上記のクエリを実行することで、ある任意の期間内にACCEPTされた送信元IPアドレスのトップ10を調べることができ、ACCEPTされた通信の送信元IPアドレスと送信先IPアドレスも確認することが可能です。例えば、ある日を境にしてWebサーバーの処理負荷が高くなった際にトラフィック量が多い送信元IPアドレスを調べることが可能です。これが不審な送信元IPアドレスと思われる場合はAWS WAFでDROP対象のIPリストに追加する等の運用が考えられます。
その他サンプルクエリ
その他のサンプルクエリは以下のAWS blog にも記載されておりますのでご覧ください。
まとめ
ということで、今回はAmazon Athena を利用してS3に保管されているVPC Flow Logs のログを調査する方法を調べてみました。AWS Config/AWS CloudTrail/VPC Flow Logs と3つのサービスのログをAthena を利用して調査する方法を整理してみましたが、それぞれ実行するクエリをその都度考えるのは大変なので予め必要な情報を整理してAthena にクエリを保存しておくとかなり運用負荷が減らせそうだなと思いました。本ブログがどなたかのお役に立てば幸いです。
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors