Route53 ResolverのDNSクエリログをElasticsearchに連携して可視化してみた

2020.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Route 53 Resolver にて DNS クエリのロギングがサポートされ、VPC で発生するクエリログを保存できるようになりました。

ログの出力先に Kinesis Data Firehose を選択でき、分析基盤に連携がしやすくなっています。クエリログは可視化することによって、トラフィックの分析やセキュリティインシデントの調査に役立てることが期待できます。
本エントリでは、DNS クエリログを Elasticsearch に連携し、Kibana で可視化するまでやってみます。

やってみた

構成は以下のとおりです。VPC 上で発生した DNS クエリのログを Kinesis Firehose 経由で Elasticsearch に連携します。

以下の流れで設定します。

  1. Elasticsearch ドメインを作成
  2. Kinesis Firehose を作成
  3. Elasticsearch ロール設定
  4. Route53 クエリログを有効化
  5. ログ確認、Kibana可視化

1. Elasticsearch ドメインを作成

はじめに Elasticasearch クラスタを作成します。バージョンは最新の 7.8 を選択します。

検証なのでインスタンスタイプは t3.medium.elasticsearch に変更します。

ネットワーク構成は パブリックアクセス を選択します。

アクセスコントロールは 細かいアクセスコントロールを有効化 にチェックを入れ、マスターユーザーの作成 からユーザーを追加します。

アクセスポリシーでドメインへのオープンアクセスを許可します。

他の設定はデフォルトのまま進め、確認画面で [確認] をクリックし、クラスタを作成します。

2. Kinesis Firehose を作成

続いて、Kinesis Firehose を作成します。Amazon Kinesis のコンソールから [配信ストリームを作成] をクリックします。 ストリーム名を入力し、Source に Direct PUT or other sources を選択します。

データは加工せず、次へ進めます。

宛先に Amazon Elasticsearch 選択します。先程作成したドメインを選択し、Index に dnsquerylog を入力、Index rotation は Every day を選択します。

S3 Backup では Failed records only を選択し、次へ進めます。

バッファ設定でインターバルを 60 秒に変更し、ストリームの作成まで進めます。

作成完了後、ストリームを開き Firehose の ARN とサービスロールの ARN をメモしておきます。

3. Elasticsearch ロール設定

Kinesis Firehose からログを書き込めるように、Elasticsearch 側でロール設定します。Elasticsearch のコンソールから Kibana の URL をクリックします。

メニューから、Security をクリックします。

Roles をクリックし、新規ロールを作成します。

Overview タブで、ロール名に firehose-role を入力します。

Cluster Permissions タブで、cluster_composite_opscluster_monitor を追加します。

Index Permissions タブで、[Add index permissions] をクリックします。

Index patterns に dnsquerylog、Permissions: Actions Group に create_indexcrudmanage を追加します。追加したらスクロールして、[Save Role Definition] をクリックします。

作成したロールを Firehose のサービスロールに関連付けます。Security -> Role Mappings をクリックします。

Role でプルダウンから firehose-role を選択し、メモしておいた Firehose のサービスロールの ARN をBackend roles に入力し、[Submit] をクリックします。

Elasticsearch のロール設定が完了し、Firehose からデータを送れるようになりました。

4. Route53 クエリログを有効化

DNS クエリログを Firehose に出力するに設定していきます。Route 53 のコンソールから、クエリのログ記録 -> クエリログ記録の設定をクリックします。

クエリログ送信先に Kinesis Data Firehose 配信ストリーム を選択し、メモしておいた Firehose の ARN を入力します。

記録する VPC を追加し、[クエリログの設定] をクリックします。

以上で設定が完了しました。

5. ログ確認、Kibana 設定

事前に クエリログ対象で設定した VPC の EC2 から 適当に DNS クエリを発生させておきます。

dig dev.classmethod.jp

Kibana の左メニューから Discovery を選択し、インデックスパータンを設定していきます。

Index pattern に dnsquery を入力し、[Next step] をクリックします。

タイムフィルターのフィールドに query_timestamp を選択し、[Create index pattern] をクリックします。

メニューから 再度 Discovery を選択すると、ログが出力されていることを確認できました。

せっかくなので DNSクエリ対象を集計してみます。メニューから Visualize -> Create new visualization -> Horizontal Bar をクリックします。

X-axix で、Aggregation に Terms、Field に query_name.keyword を指定して更新すると、クエリごとに件数を集計できました。

さいごに

Route 53 の DNS クエリログを Elasticsearch に連携して、Kibana で可視化をしてみました。ログの送信先として直接 Firehose を指定できるので、簡単に連携することができました。
DNS クエリをログ出力できるようになったことで、VPC 上で発生するトラフィックの可視化がしやすくなり、トラッフィク分析やインシデント調査がしやくすくなったのではと思いました。