【AWSのログ管理】Route53 ResolverのログをAthenaを使って調査してみる

Route53 Resolverログとは

Route53 Resolverログとは、VPCに流れるDNSクエリに関する情報をログとして記録します。このログには、クエリのタイムスタンプ、クエリのタイプ、クエリのドメイン、クエリの送信元IPアドレス、クエリの結果などが含まれます。

Route53 Resolverログは、セキュリティ分析やトラブルシューティングなどの目的で使用することができます。例えば、不正なクエリや攻撃を検出するために、ログを分析することができますし、また、ネットワークのパフォーマンスの問題を特定するために、クエリの応答時間やエラーをチェックすることも可能です。

今回は、Route53 ResolverログをAthenaを使って分析してみたいと思います。すでに作成済みのVPCに流れるDNSクエリを分析します。

前提

Route 53 Resolverログの設定が未設定の状態からすすめます。
※今回は、パブリックDNSのログ分析は行いません。

ログ保存先設定(S3バケット)

S3バケットの作成と注意点
まずは、ログを保存するためのS3バケットを作成します。
S3バケット作成の手順は割愛しますが、ログはCloudWatchLogsやKinesisDataFirehoseに送信することも可能です。
今回は、Athenaを使ってログ分析を行うため、S3をログ保存用に使います。
下記のドキュメントに詳細が記載してあります。
参考:https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver-query-logs-choosing-target-resource.html

ログ取得の設定(Route53)

1.AWS コンソールにログインし、Route53を選択します。

2.左側メニューのクエリのログ記録をクリックします。

3.「クエリログ記録の設定」をクリックします。

4.設定項目の入力
「名前」:
適宜入力します。
「クエリログの送信先」:S3 バケットを選択します。
「Amazon S3 バケット」:先程作成したログ保存用のS3バケットを選択します。

クエリをログ記録する VPC 欄の「VPC追加」をクリック

ログを記録する対象のVPCを選んで、「追加」をクリック

設定項目の入力は以上です。
最下段の「クエリログの設定」をクリックすると設定は完了です。
※しばらく待つとログが指定したS3バケットに出力し始めます。

ログの形式について

ログの出力形式については、こちらを参照ください。
ログの値については、こちらを参考にしてください。

Athenaの設定

ログの調査ができるように、Athenaを設定していきます。

1.AWS コンソールにログインし、Athenaを選択します。

2.「クエリエディタを起動」をクリック。

3.クエリ結果の保存設定
初めてAthenaを利用する場合、画像にあるような注意事項が表示され、クエリエディタからクエリを実行することができません。
Athenaのクエリ結果を保存するためのS3バケット設定が必要になります。
予めS3バケットの用意がある場合はそのまま「設定を編集」をクリックして設定にすすみます。
S3バケットの用意が無い場合は、S3バケットを新たに作成してから画像にある「設定を編集」にすすみます。

「設定を編集」をクリック後、いくつか入力項目があります。
「クエリ」結果の場所
にS3バケット名を指定します。
他の設定は適宜指定をしてください。後で変更することもできます。
「保存」をクリックするとクエリが実行できるようになります。

4.データベースの設定
Athena内にRoute 53 Resolverログを分析するためのデータベースを作成します。データベース名はわかりやすいように「r53logs」としてます。
クエリエディタ画面に下記のコードをペーストして「実行」します。

CREATE DATABASE r53logs;

コマンドが正常に実行できれば、データベース欄のプルダウンメニューに作成したデータベース「r53logs」が表示されます。

5.テーブル作成
続いてテーブルを作成します。
テーブル作成用のコマンドはAWSドキュメントに記載のコマンドを参考にして実行します。
参考:AWSドキュメント

最下段の「LOCATION」部分の編集が必要です。Route 53 Resolverログ用に作成したS3バケットを指定します。account_id、vpc-idも指定します。

CREATE EXTERNAL TABLE r53_rlogs (
  version string,
  account_id string,
  region string,
  vpc_id string,
  query_timestamp string,
  query_name string,
  query_type string,
  query_class
    string,
  rcode string,
  answers array<
    struct<
      Rdata: string,
      Type: string,
      Class: string>
    >,
  srcaddr string,
  srcport int,
  transport string,
  srcids struct<
    instance: string,
    resolver_endpoint: string
    >
 )
     
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<S3バケットを指定>/AWSLogs/<account_idを指定>/vpcdnsquerylogs/<vpc-idを指定>/'

コマンドが成功すると、左側画面のテーブル欄に「r53_rlogs」テーブルが表示されるようになります。

これで準備は終了です。

ログを調査する

ログにたいしてクエリを実行できるようになりました。まずは、データが入っているか確認します。
クエリエディタ画面に下記のコマンドをペーストして「実行」します。
うまくいけば、10件のログが出力されます。

SELECT * FROM "r53_rlogs" limit 10;

参考までにいくつか一般的なクエリを紹介します。

タイムスタンプ順にログを抽出するコマンド。

SELECT * FROM "r53_rlogs"
ORDER BY query_timestamp DESC

指定された開始時刻と終了時刻の範囲内でログをクエリする

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode
FROM "r53_rlogs"
WHERE (parse_datetime(query_timestamp,'yyyy-MM-dd''T''HH:mm:ss''Z')
     BETWEEN parse_datetime('2023-05-19-00:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2023-05-20-00:08:00','yyyy-MM-dd-HH:mm:ss'))
ORDER BY query_timestamp DESC

応答のなかったログを抽出するコマンド。

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers
FROM "r53_rlogs"
WHERE cardinality(answers) = 0

指定したIPアドレスがあるクエリログを抽出する
※IPアドレス部分は適宜編集してください

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answer.Rdata
FROM "r53_rlogs"
CROSS JOIN UNNEST(r53_rlogs.answers) as st(answer)
WHERE answer.Rdata='203.0.113.16';

このようにAthenaを使えば簡単にDNSクエリログを分析することができるようになります。


まとめ

Route 53 Resolverログを有効にすることで、VPC内のDNSクエリに関する情報を分析することができます。万が一ネットワーク攻撃を受けた際の分析、ネットワークやDNS疎通に関する問題解析などに利用することができます。
ぜひ有効化したいものですね。


参考


この記事が気に入ったらサポートをしてみませんか?