• AWS

AWS WAFのログをElasticSearch&Kibanaでチェック

はじめに

安価で手軽に導入可能なAWS WAFですが、2018年に二つの有用なアップデートが来ました。
一つは、包括的なログ(フルログ)を出力できるようになったことと、もう一つはマネージドルール内のルールを個別に無効化できる機能です。

それまでは、AWS WAFのマネージドルールはブラックボックス化されていて、挙動の確認方法や誤検知した場合の対応方法に不安がありました。
これらのアップデートによって、AWS WAFを導入しやすくなったのではないでしょうか?

フルログの出力先はいくつか選択できますが、本記事ではElasticSearchサービスにログを格納して、Kibanaでログデータを確認する方法をご紹介します。

※本記事の手順を実施するとAWSの料金が発生します。また、本記事は可能な限り検証を行っていますが、サービスのアップデート等により設定内容や仕様が変更となる場合がありますのでご了承ください。

ログや集計情報の表示

まず先に、AWS WAFのログデータをElasticSearch Serviceに流し込んだ場合のログデータとその集計情報の表示例を記載します。
(Web ACLに、マネージドルール、IPホワイトリスト、IPブラックリスト等の個別ルールを組み込んだサンプルサイトの出力です。)

AWS WAFのログを表示したい場合、ElasticSearch&Kibanaを使用するか、あるいは、S3に出力してツールを使用するか等の判断材料となれば幸いです。

ログデータの表示

Discoverメニューより、ログデータを確認することができます。
HTTPリクエストやヘッダ情報、action(判定結果)などが表示されます。

Kibana-Discover

Kibana-Discover

なお、マネージドルール内のルールを個別に無効化できるようになったアップデートですが、以下のようにruleGroupListのterminationgRule内にruleIDが表示されるようになりました。これがマネージドルール内のルールIDとなります。
もし、マネージドルールで誤検知が発生した場合には、どのルールIDでBLOCKが発生しているかを確認して、それをマネージドルールの例外に追加します。

discover-rulegrouplist

discover-rulegrouplist

集計情報の表示

取り込んだログデータに対してVisualizeでグラフ・表を作成すると、例えば、以下のような集計情報を表示することができます。

アクセス数

時間別の棒グラフで表示しています。action(判定結果)の値によってALLOWとBLOCKを区別することができます。

Visualize-アクセス数

Visualize-アクセス数

国別アクセス比率

円グラフで国別アクセス比率を表示しています。

Visualize-国別アクセス比率

Visualize-国別アクセス比率

拒否IP一覧

接続元のIPアドレス一覧です。action(判定結果)がBLOCKである項目のみに絞り込んでいます。

Visualizer-ブロックIP一覧

Visualizer-ブロックIP一覧

マネージドルールでブロックしたリクエストURI

リクエストURIの一覧です。action(判定結果)がBLOCKで、使用しているマネージドルールのIDである項目のみに絞り込んでいます。

Visuzlize-拒否したURI

Visuzlize-拒否したURI

設定手順

具体的な設定手順について記載します。
格納先(ElasticSearch)、データの中継(Kinesis)、送信元(AWS WAF)、表示(Kibana)の順に設定していきます。

1.準備

WebサーバとELB(ALB)の設定はすでに完了していて、HTTP/HTTPSでアクセスできているものとします。
また、AWS WAFのWeb ACLを設定済みで、ELBに紐づけていることを想定しています。

2.ElasticSearch Serviceの構築

まずは、ログの格納先のElasticSearch Serviceの構築を行います。
新しいドメインの作成で、作成ウィザードに従って設定します。

Step 1: ドメインの定義

Elasticsearchドメイン名を設定して、Elasticsearchのバージョン(特に理由がなければ最新)を選択します。

ドメイン名・バージョン

ドメインの定義-ドメイン名・バージョン

Step 2: クラスターの設定

検証環境のため、インスタンス数、タイプは最小限の設定としています。
EBSボリュームサイズなどのストレージ設定も環境に合わせて設定します。
(本番環境では暗号化を推奨します。)
スナップショットは、必要に応じて時間を変更しておきます。
また、詳細オプションはデフォルトとしています。

ノードの設定

クラスターの設定-ノードの設定

ストレージ

クラスターの設定-ストレージ

スナップショットの設定

クラスターの設定-スナップショットの設定

Step 3: アクセスの設定

ここでは、パブリックからのアクセスが可能で、接続元をIPアドレスで制限する設定とします。

ネットワーク構成・Kibana認証

アクセスの設定-ネットワーク構成・Kibana認証

ドメインアクセスポリシーの設定で、以下のように「特定のIPからのドメインへのアクセスを許可」を選択して、許可するIPアドレスを登録します。

アクセスポリシー

アクセスの設定-アクセスポリシー

3.Kinesisの構築

次に、ログをWAFからElasticSearchに中継するKinesisの構築を行います。

Amazon Kinesis の使用を開始

「Kinesis Firehose配信ストリームを使用してストリーミングデータを配信する」を選択して、配信ストリームを作成します。

Kinesis Firehose配信ストリーム

Amazon Kinesis の使用を開始-Kinesis Firehose配信ストリーム

Step 1: Name and source

配信ストリーム名を設定します。WAFのログとわかるような名前がよいと思います。

配信ストリーム名

Name and source-New delivery stream

デフォルトの「Direct PUT or other sources」を選択します。

Choose source

Name and source-Choose source

Step 2: Process records

そのままデータを流し込むため、レコードの処理方法はどちらもDisabledとします。

Process records

Process records

Step 3: Choose destination

送信先として、ElasticSearch Serviceを選択します。

Select destination

Choose destination-Select destination

Domainには先ほど作成したElasticSearch Serviceのドメイン名を設定します。
また、Indexとそのローテーションタイミング(ここでは月単位)を設定します。
Typeの名前も設定しておきます。
※実運用では、ログの集計方法に合わせて、Index/Typeの命名ルールを決定しておくと良いと思います。

Elasticsearch Service destination

Choose destination-Elasticsearch Service destination

データ配信失敗時のみ、S3に保管するように設定します。
必要に応じて、Create newで新しいS3バケットを作成して選択します。

S3 backup

Choose destination-S3 backup

Step 4: Configure settings

ElasticSearchのバッファを設定します。

Elasticsearch buffer conditions

Configure settings-Elasticsearch buffer conditions

S3に格納したログは、必要に応じて圧縮・暗号化を設定します。

S3 compression and encryption

Configure settings-S3 compression and encryption

エラーログは有効としておきます。

Error logging

Configure settings-Error logging

初めての設定時には、Create new or chooseを選択します。

IAM role

Configure settings-IAM role

以下の画面で許可を選択して、新しいIAMロールを作成します。

新しいIAMロールの作成

IAM role-新しいIAMロールの作成

4.AWS WAFの設定

WAF & ShieldからAWS WAFの設定画面を開いて、以下のようにログの出力設定を行います。

Full Loggingの有効化

Web ACLのLoggingの設定で、Enable Loggingを有効化します。

Full Logging

AWS WAF-Full Logging

Amazon Kinesis Data Firehoseの選択では、先ほど作成した配信ストリームの名前を指定します。
Redacted fieldsはマスクしたいデータ(パスワードが含まれるフィールド等)があれば指定します。

Enable Logging

AWS WAF-Enable Logging

5.Kibanaの設定

Kibanaの初期設定を行います。

KibanaのURL

ElasticSearch Serviceの概要ページで、KibanaのURLが表示されますので、そのページを開きます。

Kibana URL

Kibana URL

Create index pattern

初めてアクセスしたときに、Indexパターンの設定画面となります。

Define index pattern

Create index pattern-Define index pattern

Configure settings

Create index pattern-Configure settings

ログの確認

Discoverのページで、ログを確認できれば設定完了です。

Discover

Kibana-Discover

timestampの値について

そのままの状態では、timestampの値が数字になってしまい、日付として登録されていません。
例えば、ElasticSearchのIndex Templateでdate型に変更しておくと便利です。

まとめ

AWS WAF・マネージドルールを使用していると、どの程度効果があったのか、なぜブロックされたかを知りたくなります。
フルログの出力データを活用することで、基本的な情報は見えるようになってきたと思います。
公開Webサーバが含まれるサービスであれば、標準でWAFを組み込んではいかがでしょうか?

弊社の仮想サーバ運用代行では、AWS WAFも含めた対応を行なっております。
ルールやマネージドルールの選択、本記事のようなログの出力設定や、Kibanaの集計情報もお客様に合わせて設定いたします。

AWSの運用代行をご検討のお客様は、ぜひお問い合わせください。

最近の記事

カテゴリー

アーカイブ

本サイトはTLS/SSLにより通信を暗号化しております。