VPC DNS クエリログを Amazon Athena で確認してみた

クエリログの取得から Amazon Athena を使って確認するまでを行ったのでご紹介したいと思います。
2021.04.15

こんにちは、望月です。
去年、Route53 Resolver で VPC DNS クエリログが取得できるようになりましたが、今回クエリログを取得し、特定ドメインへの名前解決 (アクセス) を行っていないことを確認するため、クエリログの取得から Amazon Athena を使って確認するまでを行ったので、ご紹介したいと思います。

やってみた

クエリログ記録の設定を行う

Route 53 のコンソールを表示し、Resolver の [クエリのログ記録] を選択し、[クエリログ記録の設定] をクリックします。

クエリログ記録の設定画面にて以下項目を入力し、[クエリログの設定] をクリックします。

  • 名前
    • 作成する設定の名前を入力
  • クエリログの送信先
    • Athena を使うため、S3 バケットを指定
      • S3 バケットを事前に作成もしくはここの [新しい S3 送信先を作成] をクリックし作成します
  • Amazon S3 バケット
    • s3://<bucket name>/ という形で S3 バケットを指定
      • Prefix には自動で /AWSLogs/<AWSアカウントID>/vpcdnsquerylogs/<VPCID>/<YYYY>/<MM>/<DD>/ と付くため、別途分かりやすい Prefix を付けなくてもよさそうです
  • クエリをログ記録する VPC
    • VPC を指定

設定が作成されたことを確認します。

Athena で確認を行う

Athena のコンソールを表示し、テーブルを作成するため、以下クエリを実行します。

  • S3 バケットの LOCATION はログが保存されている S3 URI を指定
CREATE EXTERNAL TABLE IF NOT EXISTS default.route53_querylog (
  version float,
  account_id string,
  region string,
  vpc_id string,
  query_timestamp string,
  query_name string,
  query_type string,
  query_class string,
  rcode string,
  answers array<string>,
  srcaddr string,
  srcport int,
  transport string,
  srcids string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('serialization.format' = '1')
LOCATION 's3://<bucket name>/<AWSアカウントID>/vpcdnsquerylogs/<VPCID>/<YYYY>/<MM>/<DD>/'

上記クエリを実行すると以下テーブルが作成されます。

あとは必要に応じ、クエリを実行してください。以下使いそうなクエリをメモっておきます。

例) 最新 100 件のクエリを表示

SELECT *
FROM default.route53_querylog
LIMIT 100;

例) 指定した IP アドレスが送信元のクエリを表示

SELECT *
FROM default.route53_querylog
WHERE srcaddr = '<IP アドレス>';

例) 指定したドメイン名のクエリを表示

SELECT *
FROM default.route53_querylog
WHERE query_name = 'classmethod.jp.'

例) 指定したドメイン名のすべてのサブドメインのクエリを表示

SELECT *
FROM default.route53_querylog
WHERE query_name like '%.classmethod.jp.';

まとめ

出力された DNS クエリログを Amazon Athena でいろいろと確認してみました。
ドメイン名からどこに接続したかというのが簡単に確認できるため、本当にそのドメインにアクセスしてない?とか、調べるのに便利かと思います。

参考