はじめに
4/8(月)にAmazon Elasticsearch Serviceのアラート通知機能が実装されたので
AWS CloudTrailのログを使って、管理コンソールへのログインがあったら通知する仕組みを
試しに作ってみました。
【参考】
・Amazon Elasticsearch Service でイベント監視およびアラートのサポートを開始
利用環境
・Amazon Elasticsearch Service (Elasticsearch 6.5)
※6.2以降のバージョンで利用可能です。
※今回は投稿時の最新版で検証しています。
【参考】
・AWS CloudTrailのログをAmazon Elasticsearch Serviceへ転送して可視化してみた
設定内容
- Destinationの設定
- Monitorの設定
- Triggerの設定
1. Destinationの設定
-
Alert検知時の通知先として、
Amazon SNS、Slack、Amazon Chime、Custom Webhookが選択できます。 -
まずは通知先を設定します。
[Alerting] > [Destination] > [Add destination]をクリックします。

-
以下の設定を行い、[Create]をクリックします。

・Name: 任意の名前を設定します (今回はmy_slack_poc_channelとします)
・Type: 通知先のタイプを設定します (今回はSlackを利用します)
・Webhook URL: Slackの通知先としてWebhook URLを入力します (以下のサイトを参照)
【参考】
・SlackのWebhook URL取得手順
2. Monitorの設定
-
次は監視内容の設定になります。
-
①グラフから閾値を指定する方法と②Elasticsearchのクエリで指定する方法の2つがあります。
前者は複雑なElasticsearchのクエリを書く必要はありませんが、複雑な監視設定ができません。 -
[Configure Monitor]として、以下の設定を行います。

・Monitor Name: 任意の名前を設定します (今回はAWS_ConsoleLoginとします)
・Frequency: By Interval、Daily、Weekly、Monthly、Custom cron Expressionから選択します (今回はBy Intervalを利用します)
・Every: By Intervalの間隔を指定します (今回は5分間隔での監視間隔とします)
【参考】
・Daily、Weekly、Monthly、Custom cron Expressionは、以下のような設定になります。




-
[Define Monitor]として、以下の設定を行います。

・How do you want to define the monitor?: 監視の定義方法を設定します (今回はDefine using extraction queryとします)
・Index: クエリ対象のElasticsearchのIndex名を指定します (今回はcwl-*とします)
・Define extraction query: 監視のクエリを記述します (今回は直近5分間のeventNameがConsoleLoginとなるログをクエリ)
【参考】
・Elasticsearchのクエリを書くのが慣れない人にはハードルになります。
なので、以下のようにKibanaのDiscoverでほしい条件を指定してからRequest Queryをコピーします。
3. Triggerの設定
-
最後は監視内容に対して、通知先とその監視トリガーを設定します。


・Trigger name: 任意の名前を設定します (今回はAWS_ConsoleLoginとします)
・Severity level: 監視イベントの重要度を5段階の中から指定します (今回は1とします)
・Extraction query response: 実行したクエリのレスポンスを記述します (今回はデフォルトのまま)
・Trigger condition: 上記のレスポンスに対して、どういう条件で通知するかを設定します。 (今回は検索結果の件数が0件以上としています) -
[Configure Actions]を以下のように設定し、[Create]をクリックします。

・Action name: 任意の名前を設定します (今回はAWS_ConsoleLoginとします)
・Destination name: 作成したSlackの通知先を指定します。
・Message subject: Slackに通知されるメッセージの件名を入力します (今回はAWS_ConsoleLoginとします)
検知すると
まとめ
いかがでしたでしょうか^^
意外と簡単にサーバレスなAWS環境のセキュリティ監視が色々と設定できそうですね!
今回はCloudTrailのログをCloudWatchLogs経由でAmazon Elasticsearch Serviceに取り込みました。
時刻情報として、@timestampとeventTimeという2つのFieldを持っています。
・@timestamp: Amazon Elasticsearch ServiceにIndexされた時刻
・eventTime: 実際にCloudTrailのイベントが発生した時刻
上記時刻の差として10分ほどあります。イベント発生から取り込みまで遅延時間ですね。
今回のような5分間隔での監視の場合、発生時刻のeventTimeを指定していまうとトリガー発動時には
まだイベントが取り込まれていない可能性が高く検知出来ないため、@timestampを利用しています。
今後、Open Distro for Elasticsearchで実装された機能が順次Amazon Elasticsearch Serviceに
導入されると思いますが、それも非常に楽しみですね。









