Amazon Elasticsearch Service で Alarm (Open Distro)

# やること

Amazon ESにCloudTrailのログを流し、test_user1のログイン成功を検知したらアラートを飛ばします

これをOpenDistroのAlartingを使ってやる

https://opendistro.github.io/for-elasticsearch/features/alerting.html

# 事前準備

Amazon ESはv6.5でセットアップし、CloudTrailのログを流し込んでいます。
Slackを用意してWebhook URLを控えておく

* Amazon ES: v6.5

画面はKibanaで「eventType: AwsConsoleSignIn AND userIdentity.userName: test_user1 AND responseElements.ConsoleLogin: Success」でフィルタをして"test_user1"というIAMユーザーでログインに成功したデータを検索しています。

<img width="1188" alt="スクリーンショット 0031-05-14 17.28.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/15503a5b-b526-61ba-d843-a4520effac8a.png">

# OpenDistro Alarmの設定

### Destination

Kibanaの左側メニューで"Alerting"をクリックし、[Add Destination]をクリックします。

<img width="1189" alt="スクリーンショット 0031-05-14 17.32.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/9804ece9-b779-7045-cae4-95d1e3ff59e8.png">

今回は通知先をSlackとします。以下の情報いれて[Create]をクリック

* Name: test_trigger
* Type: Slack
* Webhook URL: 自身のSlackのやつ

![スクリーンショット 0031-05-14 17.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/56a7e0d3-9b7d-0e9e-421a-9e041970b81f.png)

カスタムWebhook含め送り先は選べます

<img width="579" alt="スクリーンショット 0031-05-14 17.34.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/50de4a98-9728-b5e0-bff7-db24b8c32a58.png">

これでDestinationは完成

### Monitor

"Monitor"をクリックし[Create monitor]をクリック

<img width="1193" alt="スクリーンショット 0031-05-14 17.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/2011cf9f-c9bf-6899-2459-69b7c0314817.png">

以下を入力

* Monitor name: test_monitor
* Every: 5

<img width="760" alt="スクリーンショット 0031-05-14 17.38.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/81dacee2-dbf2-96fe-a7a5-8d46fcd1c60d.png">

以下を入力し、右下の[Create]をクリックする

* How do you want to define the monitor?: Define using extraction query
* Index: cwl-2019.05.14
* Define extraction query: 以下のクエリを入力

```json:
{
    "size": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "eventType": {
                            "query": "AwsConsoleSignIn",
                            "operator": "AND",
                            "prefix_length": 0,
                            "max_expansions": 50,
                            "fuzzy_transpositions": true,
                            "lenient": false,
                            "zero_terms_query": "NONE",
                            "auto_generate_synonyms_phrase_query": true,
                            "boost": 1
                        }
                    }
                },
                {
                    "match": {
                        "userIdentity.userName": {
                            "query": "test_user1",
                            "operator": "AND",
                            "prefix_length": 0,
                            "max_expansions": 50,
                            "fuzzy_transpositions": true,
                            "lenient": false,
                            "zero_terms_query": "NONE",
                            "auto_generate_synonyms_phrase_query": true,
                            "boost": 1
                        }
                    }
                },
                {
                    "match": {
                        "responseElements.ConsoleLogin": {
                            "query": "Success",
                            "operator": "AND",
                            "prefix_length": 0,
                            "max_expansions": 50,
                            "fuzzy_transpositions": true,
                            "lenient": false,
                            "zero_terms_query": "NONE",
                            "auto_generate_synonyms_phrase_query": true,
                            "boost": 1
                        }
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "@timestamp": {
                            "from": "now-10m",
                            "to": null,
                            "include_lower": true,
                            "include_upper": true,
                            "boost": 1
                        }
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
    "aggregations": {}
}
```

<img width="1168" alt="スクリーンショット 0031-05-14 17.40.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a086634f-37e0-fec7-88db-ab9029f3d449.png">

### Trigger

Create Trigger の画面になるので、以下の値を入力する

* Trigger name: test_trigger1

<img width="786" alt="スクリーンショット 0031-05-14 17.45.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/57894514-e3d1-f40c-3fab-3d9c23df59e2.png">

Trigger conditionがhit件数>0となっている。右下の[Run]をクリックしfalseであることを確認(今は10分以内のログインがなく０件なのでfalse)

<img width="924" alt="スクリーンショット 0031-05-14 17.47.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/d1eb51ca-f238-ea7a-92d8-1deccfe8e830.png">

### Action

以下を入力し、[Add action]をクリックする

* Action name: test_action1
* Destination name: test_general - (Slack)
* Message subject: login success! test_user1

※入力が終わったら、右下の"Send test message"でWebhookの確認をしてもよい

<img width="907" alt="スクリーンショット 0031-05-14 17.52.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/c45a13c7-90f1-d81a-9564-4dd17eac2ca5.png">

右下の"Send test message"でWebhookの確認をした結果のSlack画面

<img width="717" alt="スクリーンショット 0031-05-14 18.09.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/7fdba0f0-16c3-07b8-2a76-404c4792d49a.png">


アクションができたら右下の[Create]をクリックする

<img width="962" alt="スクリーンショット 0031-05-14 17.54.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/c5b42339-cf8a-bcd0-7243-73659da15bed.png">

作成した"test_monitor1"

<img width="1184" alt="スクリーンショット 0031-05-14 17.56.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/2aa2e43d-19d9-9573-aa4e-c857f1dce9c3.png">

# テスト

test_user1でAWSに２回ほどログイン/ログアウトを行いしばらく待つ


test_monitor1の画面でアラートが発生したことがわかる

<img width="1017" alt="スクリーンショット 0031-05-14 18.13.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/b81f0fac-92e0-dfcf-028e-db443e246f0d.png">


Slackにも飛んできた

<img width="702" alt="スクリーンショット 0031-05-14 18.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/6c1d45c0-bf07-de54-052a-68ad4eda6a03.png">

KibanaのDiscoverでも確認できる

<img width="1193" alt="スクリーンショット 0031-05-14 18.11.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/71f57875-0901-28d6-9037-e78e8375162a.png">

今回だとDefine extraction queryを直近10分でクエリしているので、10分経つとAlertのStateはCompletedとなる

Dashboardの画面

<img width="1058" alt="スクリーンショット 0031-05-14 18.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/f3532844-fbad-8171-98b9-d4d05db7237c.png">

Monitor側の画面

<img width="1009" alt="スクリーンショット 0031-05-14 18.22.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/68c98bb0-b6b1-2bbe-58e6-dc37f27b26c3.png">