目次
- 1.はじめに
- 2.SIEM on Amazon Elasticsearch Service とは
- 3.構築時に陥りがちな失敗
- 4.国情報の取得準備
- 5.CloudFormation の実行
- 6.WafCharm 利用時のカスタム
- 7. おわりに
1. はじめに
2020 年 10 月 23 日に AWS から SIEM on Amazon Elasticsearch Service がオープンソースで公開されました。
今回は SIEM on Amazon Elasticsearch Service で AWS WAF のログを確認する方法をご紹介します。
2.SIEM on Amazon Elasticsearch Service とは
公式の説明は以下となります。
SIEM は Security Information and Event Management の略で、セキュリティ機器、ネットワーク機器、その他のあらゆる機器のデータを収集及び一元管理をして、相関分析によって脅威検出とインシデントレスポンスをサポートするためのソリューションです。
各機器からのログを集約して Amazon Elasticsearch Service を利用してモニタリングするためのソリューションとなります。
構成は各サービスから S3 にログを集めて AWS Lambda で Amazon Elasticsearch Service に渡すというシンプルなものになります。
AWS WAF のログを利用した構成

AWS CloudFormation テンプレートが用意されていますので、設定にミスがなければ約20分でデプロイが完了します。
AWS にある程度習熟されていれば、設定作業の時間を含めても1時間程度でしょう。
カスタマイズをしたい場合は AWS Cloud Development Kit (AWS CDK) でデプロイすることもできます。
その後は 各サービスで 対象の S3 にログをエクスポートするだけで完了します。
公式情報
siem-on-amazon-elasticsearch/README_ja.md
AWS サービスのログの可視化やセキュリティ分析を実現する SIEM on Amazon Elasticsearch Service 公開のお知らせ
3.構築時に陥りがちな失敗
構築自体は CloudFormation に任せることになるのですが、事前に注意すべき点を挙げます。
- 構成のために必要な権限が多く、設定の不足が発生しがち。
- CloudFormation で失敗した際に削除されずに残るリソースがある。
- S3 への配置はプレフィックスの指定を忘れずに行う必要がある。
構成のために必要な権限が多く、設定の不足が発生しがち。
作成される AWS リソースは以下の表の通りです。
CloudFormation を実行する IAM に予め必要な AWS リソースへの権限が付与されているか確認してから構成を実施してください。
AWS Resource | Resource Name | 目的 |
---|---|---|
Amazon ES 7.X | aes-siem | SIEM 本体 |
S3 bucket | aes-siem-[AWS_Account]-log | ログを集約するため |
S3 bucket | aes-siem-[AWS_Account]-snapshot | Amazon ES の手動スナップショット取得 |
S3 bucket | aes-siem-[AWS_Account]-geo | ダウンロードした GeoIP を保存 |
Lambda function | aes-siem-es-loader | ログを正規化し Amazon ES へロード |
Lambda function | aes-siem-deploy-aes | Amazon ES のドメイン作成 |
Lambda function | aes-siem-configure-aes | Amazon ES の設定 |
Lambda function | aes-siem-geoip-downloader | GeoIP のダウンロード |
Lambda function | aes-siem-BucketNotificationsHandler | ログ用 S3 バケットのイベント通知を設定 |
AWS Key Management Service (AWS KMS) CMK & Alias |
aes-siem-key | ログの暗号化に使用 |
Amazon SQS Queue | aes-siem-dlq | Amazon ES のログ取り込み失敗用Dead Ltter Queue |
CloudWatch Events | aes-siem-CwlRuleLambdaGeoipDownloader | aes-siem-geoip-downloaderを毎日実行 |
Amazon SNS Topic | aes-siem-alert | Amazon ES の Alerting の Destinations で選択 |
Amazon SNS Subscription | inputd email | Alert の送信先メールアドレス |
CloudFormation で失敗した際に削除されずに残るリソースがある。
例えば権限不足で CloudFormation での構築に失敗したとして、スタックを再作成後に実行すると、すでに同名の S3 バケットがあるとのことで、再作成したスタックが失敗します。
手動で削除が必要なものは以下の通り公式情報に案内があります。
- Amazon ES ドメイン: aes-siem
- Amazon S3 バケット: aes-siem-[AWS_Account]-log
- Amaozn S3 バケット: aes-siem-[AWS_Account]-snapshot
- Amazon S3 バケット: aes-siem-[AWS_Account]-geo
- AWS KMS カスタマーマネジメントキー: aes-siem-key
※キー削除は注意して行ってください。
ログをこのカスタマーマネジメントキーで暗号化していると、キーの削除後はそのログは読み込むことができなくなります。
S3 への配置はプレフィックスの指定を忘れずに行う必要がある。
各ログの設定方法は指定があるため確認してください。後続の Lambda が動作しない原因となります。
4.国情報の取得準備
作成されるダッシュボードは世界地図で国別の表示を行い、どこの国のデータが多いかを視覚的に認識することができるようになります。
必要な設定は、IP アドレスに国情報を付与するデータの取得です。
MaxMind 社の GeoLite2 Free をダウンロードして活用しますので、無料ライセンスを取得してください。
CloudFormation でクイックスタートする際にライセンスキーを使用します。
GeoLite2 Free Downloadable Databases
5.CloudFormation の実行
導入手順の「1. クイックスタート」の Launch stack を選択すると CloudFormation の画面が開くので対象のリージョンを選択しましょう。

テンプレートが指定された状態なので、そのまま「次へ」を選択します。

以下の情報を入力し、「次へ」を選択します。
- AllowedSourceIpAddresses: Amazon ES へのアクセスを許可する送信元IPのリストをスペース区切りで入力
- GeoLite2LicenseKey: 4. 国情報の取得準備 で取得したライセンスキー
- SnsEmail: アラート送信先のメールアドレス(承認メールが来るため受信できるアドレス)
※ AllowedSourceIpAddresses は設定が足りなかった場合、後から AWS マネージメントコンソールを利用して変更することが可能です。

オプションは特に設定せずに「次へ」を選択します。

確認ページでは先ほど入力した値に間違いがないか確認します。
専用のロールが作成されるため IAM についての注意事項に同意して「スタックの作成」を行います。

作成が終わると「CREATE_COMPLETE」のステータスに変わります。

先ほど設定したメールアドレスに認証メールが届いていますので承認しましょう。
次に実際のダッシュボード画面にログインします。
CloudFormation の「出力」タブで確認できるためアクセスしログインします。


ログイン後にパスワードを変更しましょう。

次に用意されているダッシュボードのテンプレートをインポートします。
画面左の「Management」から「Saved Objects」を開きます。

画面上部の「import」からファイルをインポートできます。


インポートするファイルは公式情報の「3. Kibana の設定」のダウンロードリンクからダウンロードして解凍したものです。
今回は WAF のダッシュボードのみ使用したいので「waf.ndjson」のみインポートします。

画面左の「Dashboards」を開くとインポートした内容を選択できます。

最後にデータを S3 に配置します。
公式手順の「8. AWS WAF」を参考に対象の Web ACL の WAF ログを設定してください。
すでに S3 に出力設定をしている場合でも Kinesis Data Firehose の出力先の S3 について、 「8-1. AWS WAF 共通設定」を参考に bucket , prefix , error prefix を公式手順の指定に合わせてください。
ログが読み込まれたダッシュボードは以下になります。

6.WafCharm 利用時のカスタム
WAF 用のダッシュボードのテンプレートは Web ACL 直下にルールが紐づいている想定での出力となります。
WafCharm ではルールグループを利用しているため Web ACL にはルールグループが紐付きルールグループの配下に実際のルールがある状態となります。
つまり、テンプレートの検知ルールに表示されるものは WafCharm を利用した場合ルールグループが表示されることになります。
ルールグループの構成(イメージ)
そこで検知ルールの割合が表示されたグラフを例に、ルールグループ内のルールの検知割合をグラフで追加する例のご紹介をします。
画面左の「Visualize」を開くとダッシュボードでまとめて表示されている各グラフの情報がわかります。
「AWSWAF – Executed WAF Rules」を開いてみるとどのデータを利用しているかがわかります。
「rule.name」を割合で表示しているのみなのでこの情報を参考にルールグループ内のルールに変えて作成します。

「rule.name」を「ruleGroupList.terminatingRule.ruleId」に変更しました。
これでルールグループ内のルールでの割合が表示できます。

作成したものをダッシュボード画面の上部の「edit」から編集して、新しいグラフの追加や不要なものを削除して、専用のダッシュボードに変えていきましょう。
一部変更した例

7.おわりに
構築が非常に簡単で、出来合いのダッシュボードを参考にしながらカスタマイズすることも容易です。
AWS WAF を利用している方は一度触ってみるとそのポテンシャルを実感できるでしょう。