【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疎通に関する問題解析などに利用することができます。
ぜひ有効化したいものですね。