Amazon Athena を使用して Amazon VPC フローログを分析する方法を教えてください。

最終更新日: 2021 年 4 月 16 日

Amazon Athena を使用して Amazon Virtual Private Cloud (Amazon VPC) フローログを分析したいと考えています。

簡単な説明

Amazon VPC フローログにより、VPC 内のネットワークインターフェイス間で送信される IP トラフィックに関する情報を取得できるようになります。ログを使用して、ネットワークトラフィックパターンを調査し、Amazon VPC ネットワーク全体の脅威とリスクを特定できます。

解決方法

Athena を使用して VPC ログを分析する

Amazon Athena を使用してアクセスログを分析するには、次の手順を実行します。

1.    Amazon Athena コンソールの [クエリエディタ] タブで、次のようなコマンドを実行して、データベース test_db_vpclogs を作成します
重要: フローログを保存する Amazon S3 バケットと同じ AWS リージョンにデータベースを作成するのがベストプラクティスです。

CREATE DATABASE test_db_vpclogs;

注: test_db_vpclogs は、作成するデータベースの名前に置き換えてください。

2.    作成したデータベースで、次のようなコマンドを実行して、VPC フローログのテーブルを作成します。このコマンドを使用すると、パーティションプロジェクションを使用して、テーブルを作成し、テーブルをパーティション化し、ユースケースに応じて自動的にパーティションを設定することができます。

CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs (
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
)
PARTITIONED BY (region string, day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://awsexamplebucket/awsexampleprefix/awsexamplelogs/1111222233334444/vpcflowlogs/test_region_code/'
TBLPROPERTIES
(
"skip.header.line.count"="1",
"projection.enabled" = "true",
"projection.region.type" = "enum",
"projection.region.values" = "us-east-1,us-west-2,ap-south-1,eu-west-1",
"projection.day.type" = "date",
"projection.day.range" = "2021/01/01,NOW",
"projection.day.format" = "yyyy/mm/dd",
"storage.location.template" = "s3://awsexamplebucket/awsexampleprefix/awsexamplelogs/1111222233334444/vpcflowlogs/test_region_code/${region}/${day}"
)

次のことを必ず行ってください。

  • クエリ内の test_table_vpclogs をテーブルの名前に置き換えます。
  • ログデータを含む Amazon S3 バケットを指すように、クエリの LOCATION パラメータを変更します。

注: Amazon S3 に投影されたパーティションが存在しない場合でも、Athena は引き続きパーティションを投影します。クエリでパーティション化された属性を使用するのがベストプラクティスです。

3.    コンソールでクエリエディタを使用して、テーブルで SQL ステートメントを実行します。クエリの保存や、以前のクエリの表示、CSV 形式でのクエリ結果のダウンロードを行うことができます。

クエリの例

注意: クエリ内の test_table_vpclogs は、作成したテーブルの名前に置き換えます。クエリに合わせて列の値、その他の変数を変更します。

1.    特定の期間の最初の 100 個のアクセスログエントリを時系列順に表示するには、次のようなクエリを実行します。

SELECT * FROM test_table_vpclogs WHERE day >= '2021/02/01' AND day < '2021/02/28' ORDER BY time ASC LIMIT 100;

2.    一定期間上位 10 個の HTTP パケットを受信するサーバを表示するには、次のようなクエリを実行します。

SELECT SUM(numpackets) AS
  packetcount,
  destinationaddress
FROM test_table_vpclogs
WHERE destinationport = 443 AND day >= '2021/03/01' AND day < '2021/03/31'
GROUP BY destinationaddress
ORDER BY packetcount DESC
LIMIT 10;

このクエリでは、HTTPS ポート 443 で受信したパケット数をカウントし、送信先 IP アドレスでグループ化し、前週の上位 10 エントリを返します。

3.    一定の期間に作成されたログを確認するには、次のようなクエリを実行します。

SELECT interfaceid, sourceaddress, action, protocol, to_iso8601(from_unixtime(starttime))
AS start_time, to_iso8601(from_unixtime(endtime))
AS end_time
FROM test_table_vpclogs
WHERE day >= '2021/04/01' AND day < '2021/04/30';

このクエリは、2020-12-04 11:28:19 .000 と 2020-12-04 11:28:33 .000 の間に作成されたログを返します。

4.    特定の期間の特定の送信元 IP アドレスのアクセスログを表示するには、次のようなクエリを実行します。

SELECT * FROM test_table_vpclogs WHERE sourceaddress= '10.117.1.22' AND day >= '2021/02/01' AND day < '2021/02/28';

5.    拒否された TCP 接続を一覧表示するには、次のようなクエリを実行します。

SELECT day_of_week(date) AS
day,
date,
interfaceid,
sourceaddress,
action,
protocol
FROM test_table_vpclogs
WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28' LIMIT 10;

6.    「10.117」で始まる IP アドレス範囲のアクセスログを表示するには、次のようなクエリを実行します。

SELECT * FROM test_table_vpclogs WHERE split_part(sourceaddress,’.’, 1)=’10’ AND split_part(sourceaddress,’.’, 2) =‘117’;

7.    特定の時間範囲内の特定の送信先 IP アドレスのアクセスログを表示するには、次のようなクエリを実行します。

SELECT * FROM test_table_vpclogs WHERE destinationaddress= '10.0.1.14' AND day >= '2021/01/01' AND day < '2021/01/31';