BLOG

2020/01/23

Amazon Elasticsearch Service を使用して AWS WAF のログを分析

【目次】
1.はじめに
2.Amazon Elasticsearch Service とは
3.Kinesis Data Firehose とは
4.Amazon Elasticsearch Service の準備
5.Kinesis Data Firehose の設定
6.AWS WAF の設定
7.Kibana の設定
8.Kibana ダッシュボードの設定
9.おわりに

1.はじめに
今回は AWS WAF の特徴で紹介されている「リアルタイムの可視性」を
AWS の以下のブログを利用して確認していきます。
主に使用する機能は Amazon Elasticsearch Service と Kinesis Data Firehose となります。
https://aws.amazon.com/jp/blogs/security/how-to-analyze-aws-waf-logs-using-amazon-elasticsearch-service/

※AWS WAF はバージョンが分かれています。今回は AWS WAF Classic のログを使用しました。

2.Amazon Elasticsearch Service とは
Amazon Elasticsearch Service はダウンタイムなしで、Elasticsearch を大規模かつ
簡単にデプロイ、保護、運用する完全マネージド型サービスです。
このサービスは、オープンソースの Elasticsearch API、マネージド Kibana を
提供するほか、Logstash およびその他の AWS のサービスとの統合で、いかなる
ソースからもデータを安全に取り込み、リアルタイムに検索、分析、可視化できます。

公式情報
https://aws.amazon.com/jp/elasticsearch-service/
https://aws.amazon.com/jp/elasticsearch-service/features/

3.Kinesis Data Firehose とは
WafCharm をご利用のユーザー様は設定いただいたことがあるかと思いますが、
WafCharm では、Kinesis Data Firehoseを「レポート機能/通知機能」で利用しています。
公式情報は以下となります。
https://aws.amazon.com/jp/kinesis/data-firehose/
https://aws.amazon.com/jp/kinesis/data-firehose/features/

機能としてはほぼリアルタイムにストリーミングデータをデータストアや分析ツールに
ロードすることができるものとなります。
Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Kinesis Data Analytics、Splunk にロードできます。

4.Amazon Elasticsearch Service の準備
まずは Amazon Elasticsearch Service の環境を準備します。
4-1.「新しいドメインの作成」を押下します。

今回はテスト用の最小構成で進めます。
バージョンは公式のブログ通り6.3を選択します。
※7.1を使用した場合、この後出てくるマッピングの設定が公式ブログ通りでは対応できませんでした。

4-2.ドメイン名は公式ブログ通り「awswaf-logs」を入力します。
4-3.インスタンスタイプはテストのため「t2.small.elasticsearch」を選択します。
4-4.その他はデフォルトで進めます。

4-5.ネットワーク構成は「パブリック構成」を選択し、アクセスポリシーでIPを制限しました。
4-6.その他の設定はデフォルトで進めます。

4-7.最後に確認画面が出てくるので「確認」を押下します。

4-8.起動すると Kibana へのアクセスポイントが出てきますのでアクセスします。

4-9.Kibana にアクセス後、画面左の「Dev Tools」を選択します。

4-10.公式ブログのマッピング内容を貼り付け、上にある実行ボタンを押下します。
 
※ここで実施していることは事前にインデックスの内容を宣言する処理となります。
具体的には httpRequest.clientIp フィールドがIPアドレスを使用していることと
timestamp がデフォルトで UNIX 時間で表記されていることを変換する内容となります。
※先にログを読み込ませてしまうとインデックスが自動で作成されてしまうので、ログを
読み込ませるよりも先にこの処理を実施する必要があります。

5.Kinesis Data Firehose の設定
Delivery stream name は AWS WAF を使用する際に命名規則があるため、「aws-waf-logs-」で始まる
必要があります。今回は「aws-waf-logs-kibana」で進めます。その他はデフォルトです。

次のページはデフォルトで進めます。

Destination で Amazon Elasticsearch Service を選択します。
入力項目については公式ブログ通り入力します。
S3 部分は任意の設定をしてください。

次のページで Buffer size / Buffer interval の指定ができます。
今回はテストなので最小値 1MB / 60seconds に変更します。
S3の使用料をできるだけ下げるため S3 compression で GZIP を選択します。
※ Buffer size / Buffer interval がログが送られるタイミングとなります。

IAMの設定については以下の公式ブログでご確認ください。
https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html

最後に確認ページがあり完了です。

6.AWS WAF の設定
AWS WAF の設定から作成した Kinesis Data Firehose をログ出力の設定として選択します。

これでログが送付されますので Kibana の画面に戻ります。

7.Kibana の設定
Kibana の画面にログインすると awswaf- という新しいインデックスが表示されます。
awswaf ログエントリを網羅するインデックスパターンを定義する必要があるため
「awswaf- *」と構成し、次の画面で timestamp フィルターを適用します。

これでようやくログを読み込む設定は完了です。

8.Kibana ダッシュボードの設定
今回は公式ブログのテンプレートをインポートしてそのまま使用してみます。
Management から Saved Objects を開きます。

import ボタンがあるので公式ブログで公開されている sample dashboard と sample visualizations を
それぞれファイルに保存してインポートします。

Dashboard からインポートされたテンプレートを選択すると確認ができます。


右下の表示を円グラフに変えた結果はこちらです。

グラフの作成は様々な情報が公開されているので調べれば比較的簡単に作成できました。
ヒートマップも作成できるので攻撃が多い時間帯の可視化もできそうでした。

9.おわりに
様々な機能が連動しているので設定は大変な印象でした。ただ、Elasticsearch Service と Kinesis Data Firehose の
設定さえ完了してしまえば、あとは Kibana で可視化するだけなので色々と分析できそうです。データも
ほぼリアルタイムで来るので運用上でリアルタイムでの確認の必要性を感じるのであれば導入することを
お勧めします。

※ブログ中で記載はしましたが、公式ブログ通り設定する際に注意すべきポイントは Elasticsearch Service のバージョンとログを
読み込ませる前のマッピングかと思います。
Elasticsearch Service をすでにご利用されている方は簡単な内容かもしれません。