Amazon Elasticsearch ServiceのAlertingを使ってAWS ConsoleLoginを監視してみた

## はじめに
4/8(月)にAmazon Elasticsearch Serviceのアラート通知機能が実装されたので
AWS CloudTrailのログを使って、管理コンソールへのログインがあったら通知する仕組みを
試しに作ってみました。

**【参考】**
・[Amazon Elasticsearch Service でイベント監視およびアラートのサポートを開始][00]

## 利用環境
・Amazon Elasticsearch Service (Elasticsearch 6.5)
　※6.2以降のバージョンで利用可能です。
　※今回は投稿時の最新版で検証しています。

**【構成図】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/1da6a444-8366-6ce7-c454-7b280da5077d.png)

**【参考】**
・[AWS CloudTrailのログをAmazon Elasticsearch Serviceへ転送して可視化してみた][01]

## 設定内容
1. Destinationの設定
2. Monitorの設定
3. Triggerの設定

#### 1. Destinationの設定
- Alert検知時の通知先として、`Amazon SNS`、`Slack`、`Amazon Chime`、`Custom Webhook`が選択できます。
- まずは通知先を設定します。  
[Alerting] > [Destination] > [Add destination]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/93c3f1b7-873d-f4e5-24ea-556fc64557e8.png)

- 以下の設定を行い、[Create]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/c1accb3c-8367-f139-f417-5c08b67b9c96.png)
・`Name`: 任意の名前を設定します (今回はmy_slack_poc_channelとします)
・`Type`: 通知先のタイプを設定します (今回はSlackを利用します)
・`Webhook URL`: Slackの通知先としてWebhook URLを入力します (以下のサイトを参照)

**【参考】**
・[SlackのWebhook URL取得手順][02]

- これでDestinationの設定は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/44d398c2-8185-eccd-87a8-267b94cc7932.png)

#### 2. Monitorの設定
- 次は監視内容の設定になります。
- ①グラフから閾値を指定する方法と②Elasticsearchのクエリで指定する方法の2つがあります。  
前者は複雑なElasticsearchのクエリを書く必要はありませんが、複雑な監視設定ができません。
- [Dashboard] > [Create Monitor]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/946c420b-2655-3248-32a4-d8970b5feece.png)

- [Configure Monitor]として、以下の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/c4306b4b-d544-54d4-d907-472f4b5daedd.png)
・`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は、以下のような設定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2822b9b1-20de-fc29-6cd9-aff1cc2207cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/f53e4eec-f08a-d39a-3c54-5eef8c74e8c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5473f3d8-1e69-9d15-1379-fd8429a2ce70.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/65559059-b4b3-b1f3-54cd-78d2e812d306.png)

- [Define Monitor]として、以下の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/fb1e29af-c443-de5a-a5b6-8e9e6290edd4.png)
・`How do you want to define the monitor?`: 監視の定義方法を設定します (今回はDefine using extraction queryとします)
・`Index`:  クエリ対象のElasticsearchのIndex名を指定します (今回はcwl-*とします)
・`Define extraction query`: 監視のクエリを記述します (今回は直近5分間のeventNameがConsoleLoginとなるログをクエリ)

- 最下部の[Create]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/9ce98f74-5377-eba8-f7a2-52d064f1b259.png)

**【参考】**
・Elasticsearchのクエリを書くのが慣れない人にはハードルになります。
　なので、以下のようにKibanaのDiscoverでほしい条件を指定してからRequest Queryをコピーします。

- `eventName:ConsoleLogin`でフィルタした上で[Inspect]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/7cd281c3-45ba-0167-f451-c125d6a64b9f.png)

- [New Saved Search]画面の[Request]タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2ea814d6-5b63-7e3b-cbd4-d5a5cd836182.png)

- するとDiscoverで表示されている結果の検索クエリを表示できますので、`query.bool.must`配下のほしい部分をコピーして、`Define extraction query`に利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/af7ff4b8-31e6-6edb-499f-043241675963.png) 

#### 3. Triggerの設定
- 最後は監視内容に対して、通知先とその監視トリガーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/b1802d0f-cf79-804e-6021-7c84582b6011.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/3a2b0d4e-dff6-46f2-e5b0-7ef331cced9d.png)
・`Trigger name`: 任意の名前を設定します (今回はAWS_ConsoleLoginとします) 
・`Severity level`:  監視イベントの重要度を5段階の中から指定します (今回は1とします) 
・`Extraction query response`: 実行したクエリのレスポンスを記述します (今回はデフォルトのまま)
・`Trigger condition`: 上記のレスポンスに対して、どういう条件で通知するかを設定します。 (今回は検索結果の件数が0件以上としています)  

- [Configure Actions]を以下のように設定し、[Create]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/ae997e49-b431-e68f-7cc6-fc1eae9929f4.png)
・`Action name`: 任意の名前を設定します (今回はAWS_ConsoleLoginとします) 
・`Destination name`: 作成したSlackの通知先を指定します。
・`Message subject`: Slackに通知されるメッセージの件名を入力します (今回はAWS_ConsoleLoginとします) 

- 以上で設定完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/e8127d4a-856f-5608-b2e2-1ca3f4a83366.png)

## 検知すると
- 検知すると該当時間に`Triggerd`の赤いバーが表示されます。
- 下部の[Alerts]にもイベントが記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/a1e723b6-0334-027e-a53b-e225cde1a008.png)

- Slackに通知されるメッセージはこんな感じです。(デフォルトのままです。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/b079584c-f2e3-0311-9edb-bc51bac910ce.png)

## まとめ
いかがでしたでしょうか^^
意外と簡単にサーバレスな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に
導入されると思いますが、それも非常に楽しみですね。

[00]: https://aws.amazon.com/jp/about-aws/whats-new/2019/04/amazon-elasticsearch-service-adds-event-monitoring-and-alerting-support/ "Amazon Elasticsearch Service でイベント監視およびアラートのサポートを開始"
[01]: https://dev.classmethod.jp/cloud/aws/cloudtrail2elasticsearch/ "AWS CloudTrailのログをAmazon Elasticsearch Serviceへ転送して可視化してみた"
[02]: https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008 "SlackのWebhook URL取得手順"