ElasticのアラートのレスポンスをSlackとTinesで自動化する方法(1)

# このブログの内容
本ブログではElasticのアラートをTinesのワークフローに連携し、ユーザーにSlackで通知、さらにはSlackからのユーザーレスポンスを受け取ってその後の処理も自動化する方法を紹介します。

この使い方はElastic社の社内セキュリティチームで実践していて、こちらの[Distributed alerting with the Elastic Stack](https://www.elastic.co/blog/distributed-alerting-with-elastic-stack)のブログに詳しく紹介されています。
従業員に関連したセキュリティイベントが検知されたら、Elastic -> Tines -> Slackというフローでその従業員に以下のような通知が届きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/37d1f84c-c544-7041-e7e4-a6a88faa453d.png)
引用：[Elasticのブログ](https://www.elastic.co/blog/distributed-alerting-with-elastic-stack)より

このSlack通知にYes, Noのボタンがついており、従業員のレスポンスをまたTinesで受け取り、 Yes(問題なし）であれば自動でElasticのアラートをクローズし、No（問題あり）であればSOCチームにSlack通知する、といった自動化がされています。

本ブログではこの仕組みの簡単なサンプルを作る方法を紹介します。

# 利用するもの
今回の手順は全て無料で実施することができます。3つのツールを使います。

## 1. Elastic Security Serverless（14日間のフリートリアルなら無料）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/d725f6f9-af68-2a47-3541-d448476a68ee.png)

## 2. Tinesの無料版 (Community Edition)
https://www.tines.com/ の右上のSign Upより無料アカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/bd8301fa-5a2f-d054-7d71-9e68aaa59609.png)

## 3. Slackのフリープラン版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/8c274b48-cdd4-58d4-9eae-923d9abdf04b.png)

# 手順概要
Tines->Slackに関する部分のサンプルは、以下のTines社のブログの内容で大体カバーされているので、この手順も使っていきます。
https://www.tines.com/blog/chatbots-for-security-and-it-teams-part-3-creating-a-slack-chatbot

これに、Elastic -> Tinesと、Tines -> Elasticの連携を追加すれば今回の簡単なサンプルのフローが完成します。

# 実施手順
### Tinesストーリーのインポート
ブログに紹介されている以下のTinesストーリーのExportをダウンロードし、自分のTinesアカウントにインポートします。
https://github.com/tines/stories/blob/main/blog/slack-chatbot.json
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/052ee01f-0d00-1a40-3c43-e86c8f79d3e7.png)

インポート後、手でアクションのボックスを綺麗に並べると下のようになります。ここはTines -> Slackのフローの部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/3520f0c5-ba77-2390-6e9e-977c97d54d57.png)

## ElasticとTinesのコネクターの設定

### Elasticからのリクエストを受け取るTinesのWebhookアクションの作成
Tinesストーリーに新しいWebhookアクションをドロップし、名前を「Alerts from Elastic」などとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/2b25b6ed-eb04-6be3-568b-3235fd419e25.png)

### Tines側のAPIキーの作成
TinesのSettings > API Keysに行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/e4cc2fd1-4d55-2c3e-ded3-0f1025c18c6c.png)

API Key typeはどれでもいいですが、今回はPersonalにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/e4844191-34ed-c02a-b06d-9446197b56a4.png)

New token secretのキーをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/85805bd2-7e3a-bb0b-1e44-cc85c6188f73.png)

### ElasticでのTinesコネクターの作成

Stack Management > ConnectorsでTinesコネクターを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/8448531d-f1d5-7485-6c5e-cc6b80cda7cb.png)

以下のように自分のTinsのドメインのURLと、自分のEメールアドレス、さきほど作成したAPI token secretを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/2e514154-9651-afe1-004a-051e42e74515.png)

正しく認証情報を入力できていれば、次の画面でTines StoryとWebhook actionを選択できるようになります。このような感じでテストしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/f91dd02c-559c-6765-b23b-c398290b4679.png)

Tinesで1つのEventが表示されるので、クリックし、Elasticからのイベントを受け取っていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/7ed01f7e-3fd5-7346-f22f-c10355a631ef.png)

## TinesからElasticのSecurity AlertエンドポイントへアクセスするHTTPリクエストアクションの作成

Elasticで、Stack Management > API KeysよりAPIキーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/5515e53a-0b60-1fa3-ac6e-85812299f12a.png)
表示されるAPIキーをコピーしてください。

Tinesに行き、新しいHTTP Requestアクションをドロップし、Elasticに対するリクエストの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/fabb0d35-a34a-f717-6d9b-cd2fd08a3662.png)

URL欄には以下のElastic Security Alertエンドポイントのステータス変更のURLを設定します。
`<自分のkibana endpoint>/api/detection_engine/signals/status`

リクエストボディのPlain codeには、以下を入力します。いまはダミーのアラートIDでテストします。
```
{
  "signal_ids": [
    "dummy-id"
  ],
  "status": "acknowledged"
}
```

さらに、以下の2つのHeadersを追加します。
- kbn-xsrf: true
- Authorization: （ApiKeyの後に空白入れて、その後ろにさきほどElastic側で作成したAPIキーの値をセット）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/5284246d-2ff9-87f0-ac5b-ce8ff3b0566a.png)

TinesアクションのRunでテストし、以下のようにレスポンス200となっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/db6688d5-45f5-84ec-adc8-44c4d84c84b6.png)

# おわり
1回目の記事では、Elastic -> Tines, Tines -> Elasticの連携部分をセットアップしました。[2回目](https://qiita.com/nobuhikosekiya/items/100ec71d07c0dd7f4b71)では、これらをTines->Slackのフローに接続して、Elasticチケットの自動クローズ処理を完成させます。