セキュリティ維持にはDNS Query Logsの可視化が必要です

DNSの攻撃を受けてもわからないので、高価なサードパーティー製品を購入してお金で解決しようという人は多いのではないでしょうか?
--
__そこで、「お金をかけたくない。」「コストをかけずになんとかしなくちゃならない。」と検討中の方々を対象として、DNSセキュリティ維持、のひとつの方法を取り上げたいと思います。__
__DNS Query LogsをOpenSearchに送信し、「Kibanaダッシュボード」で可視化するという方法です。__

DNSクエリログは、セキュリティやトラブルシューティングの目的で使用されます。
たとえば、DNS攻撃やネットワークの問題を特定するために使用することができます。
また、DNSクエリログは、ネットワーク内でどのサービスが使用されているかを把握するために使用することもできます。
__ただ、ログを眺めていても、ポイントがわかりにくいので、可視化して、分析する必要性があります。__

DNSサーバーのログを監視することで、不審なアクティビティを検出する事が出来ます。

1).大量のリクエスト
一定期間に大量のDNSリクエストが発生した場合、DDoS攻撃の可能性があります。
2).おかしななクエリ
一般的でないドメイン名やクエリの種類など、不審なクエリが含まれる場合、攻撃の可能性があります。
3).クエリの変更
サーバーが期待しない回答を返した場合、DNSキャッシュのポイズニングやDNSハイジャックの可能性があります。
4).クエリの送信元
特定のIPアドレスから大量のリクエストが発生した場合、攻撃者の攻撃の可能性があります。
5).エラーコード
NXDOMAIN（ドメイン名が存在しない）やSERVFAIL（サーバー内部エラー）などのエラーコードが発生した場合、攻撃の可能性があります。

DNSクエリログ
--
DNSサーバーが受信したすべてのDNSクエリの情報を記録するログです。
DNSクエリは、インターネット上で名前解決を行うために使用されます。
つまり、DNSクエリは、ドメイン名をIPアドレスに変換するために送信されるメッセージです。

~~~
1.0 2017-12-13T08:16:02.130Z Z123412341234 example.com A NOERROR UDP Region 192.168.1.1 -
1.0 2017-12-13T08:15:50.235Z Z123412341234 example.com AAAA NOERROR TCP Region 192.168.3.1 192.168.222.0/24
1.0 2017-12-13T08:16:03.983Z Z123412341234 example.com ANY NOERROR UDP Region 2001:db8::1234 2001:db8:abcd::/48
1.0 2017-12-13T08:15:50.342Z Z123412341234 bad.example.com A NXDOMAIN UDP Region 192.168.3.1 192.168.111.0/24
1.0 2017-12-13T08:16:05.744Z Z123412341234 txt.example.com TXT NOERROR UDP Region 192.168.1.2 -
~~~
https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/query-logs.html

DNSクエリログには、次の情報が含まれます。

1).クエリの日付と時間
2).クエリを発行したクライアントのIPアドレス
3).問い合わせたドメイン名
4).問い合わせに使用されたクエリタイプ（例：A、MX、CNAMEなど）
5).応答の状態（成功、失敗、タイムアウトなど）

Amazon OpenSearch Service とは？
--
公式サイトによると、
1.AWS クラウドにおける OpenSearchクラスターのデプロイ、オペレーション、スケーリングを容易にする __マネージドサービス。__
2.OpenSearch はログ分析、リアルタイムのアプリケーションモニタリング、クリックストリーム分析などのユースケース向けの、完全なオープンソースの __検索および分析エンジン__ 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e4e2efce-853f-2d9a-4ea6-57fd3bedd9a9.png)
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/what-is.html

__下記のサイトで、OpenSearch を使用する理由を確認すると、次の4つが該当します。__
https://opensearch.org/docs/latest/

__1.高速でスケーラブルな全文検索__
ユーザーがアプリケーション、Web サイト、またはデータ レイク カタログ内で適切な情報を見つけられるようにします。

__2.アプリケーションとインフラストラクチャの監視__
ログ データを簡単に保存して分析し、パフォーマンス不足に対する自動アラートを設定します。	

__3.セキュリティとイベント情報管理__
ログを一元化して、リアルタイムのセキュリティ監視とフォレンジック分析を可能にします。	

__4.オペレーショナル ヘルス トラッキング__
オブザーバビリティ ログ、メトリクス、トレースを使用して、アプリケーションとビジネスをリアルタイムで監視します。

実現するための手順
--
__①OpenSearchのドメインを作成する__
--
OpenSearchのドメインを作成し、Kibanaのエンドポイントを設定します。
Amazon Elasticsearch Serviceと同様に、OpenSearchはドメインを作成して、インデックスやシャードの設定を構成することができます。

__②Route 53でDNSクエリーログを有効にする__
--
Route 53コンソールにアクセスし、「DNS query logging」を選択します。

__③DNS Query LogsをOpenSearchに送信する__
--

方法として、いくつかのパターンが考えられます。

【パターン1】
CloudWatch Logsサブスクリプションフィルターを使用
--
フィルターパターンに一致するログイベントが発生すると、アクションがトリガーされます。

__1.IAMロールを作成する__
CloudWatch Logsサブスクリプションフィルターで使用されるLambda関数にアクセスするための権限を持つロールを作成する必要があります。

__2.Lambda関数を作成する__
Lambda関数を作成し、DNS Query Logsを受信し、OpenSearchドメインに送信するコードを記述します。

__3.Lambda関数をトリガーするために、Amazon CloudWatch Logsサブスクリプションフィルターを作成します。__
CloudWatch Logsサブスクリプションフィルターを作成し、ロググループでDNS Query Logsをフィルタリングします。 Lambda関数をトリガーするようにサブスクリプションフィルターを構成し、Lambda関数で受信したログイベントをOpenSearchドメインに送信します。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_OpenSearch_Stream.html

【パターン2】
Amazon Kinesis Data Firehoseを使用
--
__1.IAMロールを作成する__
Amazon Kinesis Data FirehoseがOpenSearchにデータを転送できるようにするIAMロールを作成する必要があります。
IAMロールには、OpenSearchへのアクセスを許可するポリシーが含まれている必要があります。

※配信ストリームを設定する場合、Kinesis Data Firehose には「ワンクリック」の IAM ロールが用意されています。
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/integrations.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/9d922272-d90f-76b2-36cf-0059937497a9.png)


__2.Amazon Kinesis Data Firehoseを設定する__
Amazon Kinesis Data Firehoseコンソールにアクセスし、「Create delivery stream」を選択します。

1).Delivery stream nameを入力します。
2).Sourceを「Direct PUT or other sources」に設定します。
3).Destinationを「Amazon OpenSearch Service」に設定します。
4).OpenSearch domainを選択します。
5).Index nameとType nameを設定します。
6).Buffer conditionsを設定します。
7).Transformationを設定します。
8).設定の確認と、Delivery streamの作成を実行します。

これで、DNSクエリーログがOpenSearchに転送されます。

④最後に「Kibanaダッシュボード」を作成し、可視化します。
--
Kibanaでダッシュボードを作成する手順は次の通りです。

__1.Kibanaにアクセスする__
Kibanaのエンドポイントにアクセスします。
AWSマネジメントコンソールからKibanaダッシュボードにアクセスできます。

__2.インデックスパターンを作成する__
インデックスパターンを作成して、Elasticsearchに保存されているログをKibanaに表示できるようにします。
Kibanaのメインメニューから「Management」を選択し、「Index Patterns」をクリックします。
次に、インデックスパターンの名前を入力し、Elasticsearchに保存されているログのパターンを指定します。

__3.ダッシュボードを作成する__
Kibanaのメインメニューから「Dashboard」をクリックし、新しいダッシュボードを作成します。
次に、左側のメニューから「Visualize」をクリックし、ログのビジュアライゼーションを作成します。

__4.ビジュアライゼーションをダッシュボードに追加する__
作成したビジュアライゼーションをダッシュボードに追加します。
左側のメニューから「Dashboard」をクリックし、新しいダッシュボードを作成します。
次に、「Add」をクリックして、追加したいビジュアライゼーションを選択します。

__5.フィルタを追加する（オプション）__
必要に応じて、ダッシュボードにフィルタを追加します。
フィルタを使用すると、特定の条件に一致するログのみを表示することができます。

参考
https://aws.amazon.com/jp/blogs/news/configuring-and-authoring-kibana-dashboards/

__これらの手順を実行することで、KibanaでカスタムのDNSクエリログダッシュボードを作成することができます。__