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

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

まだ読んでいない方は[第一回の記事](https://qiita.com/nobuhikosekiya/items/93d6308b52bd471c3e9b)からご覧ください。

第二回では、Tinesのワークフローを完成させていきます。

SlackとTinesの連携の手順は[Tinesのブログ](https://www.tines.com/blog/chatbots-for-security-and-it-teams-part-3-creating-a-slack-chatbot/)を参考にしています。

### Slackアプリのセットアップ
https://api.slack.com/apps の自分のアカウントのアプリのリスト画面に行き、`Create New App`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/e1a7f922-14fc-bb3e-f5b9-b3ad5dc8dc1b.png)

From scratchを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/2192da59-1280-8c46-2838-0abcee620c08.png)

App Nameとworkspaceを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/ce96e51b-5006-2bbb-7e03-938d6fbc95a6.png)

### Slack: Slash Commandsの作成
[Tinesのブログ](https://www.tines.com/blog/chatbots-for-security-and-it-teams-part-3-creating-a-slack-chatbot/)の手順に沿って、`Slash Commands`の`/analyzedomain`というコマンドを作りましょう。以下、作った結果の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/a45527bc-bdce-dbf0-0c1a-0641c7aedf9b.png)

Request URLには、Tinesの`receieve commands`アクションに設定されているWebhook URLを設定することで、このコマンドでそのアクションをトリガーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/f797aeaf-9a24-5e87-34af-e60642b82b32.png)

このコマンド`/analyzedomain tines.io`をSlackから実行すると、Tinesのワークフローreceive commandsからワークフローがこのように実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/169579b4-ba36-3827-b46f-6e869945c493.png)

最後のHTTP RequestでSlackにメッセージを送るところでイベントが終わっていますが、これは次の手順で示す設定が必要なためです。

### Slack: OAuth & Permissions
上で作成したSlackアプリのメニューの`OAuth & Permissions`に行き、OAuthを設定します。以下のようにBot TokenとUser TokenのScopesが分かれているので、それぞれにchat:writeの権限を設定します。(Bot Tokenだけでも動くかもしれません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/4218cb94-bc16-4eae-b365-496d4170862d.png)

上の方にある`Bot User OAuth Token`のキーをコピーしましょう。次のステップで使います。

### Tines: Slackに投稿するCredentialsの作成
TinesのCredentialsに行き、`+New`でSlackを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/46cdb2e0-f92c-6bd1-e287-985639f223bf.png)

ここでは、今回は`Use my own Slack app`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/b5e6dc70-717b-a9e9-9f29-2ee1bcdd6813.png)

さきほどの`Bot User OAuth Token`のキーを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/617dec35-5249-9490-cd8a-8f79115ff608.png)

作成後、Credentialsの名前を`Slack`から`slack_chatbot`に変更します。以下の図のように、Tinesのストーリーがこの名前で参照するようになっているためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/23e99311-212e-3da6-a00d-07232b63d039.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/1d9ae125-ce47-fc23-1575-6fd4636715af.png)

### Slack: 投稿先チャンネルにアプリを追加
投稿先のチャンネルをここでは新たに作成します。そしてそのチャンネルの設定の`インテグレーション`から`アプリを追加する`で、今回のSlackアプリを追加しましょう。これをしないと、Tinesからのメッセージがこのチャンネルに届きません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/e95ff47a-d28c-a3f6-a188-ca6918e1e8c4.png)

### Slack: 投稿先チャンネルからSlackコマンドを再度テスト
投稿先のSlack`#elastic-alerts`チャンネルからコマンド`/analyzedomain tines.io`を実行すると、今度はボタン入りメッセージが返ってきました。どちらかのボタンを押してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/f23c0f96-4a95-a72a-be9c-3ad9253e471a.png)
(もしメッセージが返ってこない場合、Tinesのフローは、コマンド実行元のSlackチャンネルにこのメッセージを通知するので、そのチャンネルに`インテグレーション`でアプリを追加していたかを確認しましょう。)

このように、押されたボタンの反応がTinesに伝えられていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/54ceee99-e42e-c301-fe66-aa61efc0d430.png)

### Tines: Elastic アラートの接続
この後のステップでElasticからTinesに送るアラートはこのようなデータです。これを受け取れるようにTinesを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/82123ce6-c303-d3e0-6e45-6dcdb370ea8d.png)

以下のように`Trigger if Analyze Domain`から`extract domains`への接続を消して、第1回で作成していた`Alerts from Elastic`から接続します。また、`extract domains`の`Path`を`alerts_from_elastic.body.context.alerts[0].url.domain`として、Elasticのアラートの中のフィールドの値をドメイン値として使うように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/b8938c17-1cc8-9b2b-bf58-a50ad50ec701.png)

### アラートの内容を元に通知先Slackチャンネルを設定
現在の設定だと、通知先のSlackチャンネルは、Slashコマンド実行元のチャンネルが使われるようになっているので、ここではElasticアラートの内容に応じてチャンネルを変更できるようにします。

新しく`Event Transform`アクションをドロップし、以下の図のように`build results`と`Send Rich Slack Response`の間に挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/0bca47b2-8fa7-f873-b4ed-aef539ef765b.png)

Modeを`Message only`にして、`Plain Code`として以下を入力します。Elasticのアラートルール名に応じてチャンネル名を変更しています。
```
{
  "channel_id": "<%if alerts_from_elastic.body.alertName = \"External Alerts\"%>elastic-alerts<%else%>general<%endif%>"
}
```

そして`Send Rich Slack Response`のchannelの値を`<<set_target_slack_channel.channel_id>>`に変更し、上の値を参照するようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/94cc7f7e-6cde-04ad-7b37-4ff460dcae12.png)


### Elastic アラートへの返しの接続
以下のように第1回で作成した`close Elastic Security alert`に対して、`trigger to whitelist`から接続を作ります。`close Elastic Security alert`の中のsignal_idsの設定を前回のダミーのIDから`alerts_from_elastic.body.context.alerts[0]._id`に変更し、トリガーとなったアラートのステータスを変えるように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/4cd28d84-1f6b-a50f-d658-c82074ef8de7.png)

### 最後！Elastic Securityアラートを発行させてテスト。
Elastic SecurityのRulesより、以下のExternal AlertsをInstallし、Enableにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/8142d8f1-9dca-de05-90b7-045b207a3601.png)

KibanaのConsoleから以下のようにPOSTコマンドを実行します。タイムスタンプの時刻は現在時刻に変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/a78a9856-86ad-3984-d48d-83a368348714.png)

External Alertsのアラートルールがこのイベントをトリガーにアラートを作成します。ルールは5分おきに実行されるので、最大5分待つ必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/47965ba1-c929-f770-ba74-3fa077ad321d.png)

ワークフローが全てうまくいけば、`#elastic-alerts`チャンネルにメッセージが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/9dea27a1-c509-a9fa-7876-fa536fffe8f3.png)

whitelistボタンを押すと、自動的にアラートが`Acknowleged`のステータスに変わりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/04beebe2-2926-ebff-0e0f-1640409d2320.png)

 # おわり
TinesとSlackを使うと、Elasticのアラートをしかるべきユーザーに通知し、またそのユーザーがSlackにレスポンスを返すだけで、アラートの自動クローズなどの自動化を実装することができます。