はじめに
本ブログではElasticのアラートをTinesのワークフローに連携し、ユーザーにSlackで通知、さらにはSlackからのユーザーレスポンスを受け取ってその後の処理も自動化する方法を紹介します。
まだ読んでいない方は第一回の記事からご覧ください。
第二回では、Tinesのワークフローを完成させていきます。
SlackとTinesの連携の手順はTinesのブログを参考にしています。
Slackアプリのセットアップ
https://api.slack.com/apps の自分のアカウントのアプリのリスト画面に行き、Create New Appを押します。

Slack: Slash Commandsの作成
Tinesのブログの手順に沿って、Slash Commandsの/analyzedomainというコマンドを作りましょう。以下、作った結果の画面です。

Request URLには、Tinesのreceieve commandsアクションに設定されているWebhook URLを設定することで、このコマンドでそのアクションをトリガーできます。

このコマンド/analyzedomain tines.ioをSlackから実行すると、Tinesのワークフローreceive commandsからワークフローがこのように実行されます。

最後のHTTP RequestでSlackにメッセージを送るところでイベントが終わっていますが、これは次の手順で示す設定が必要なためです。
Slack: OAuth & Permissions
上で作成したSlackアプリのメニューのOAuth & Permissionsに行き、OAuthを設定します。以下のようにBot TokenとUser TokenのScopesが分かれているので、それぞれにchat:writeの権限を設定します。(Bot Tokenだけでも動くかもしれません)

上の方にあるBot User OAuth Tokenのキーをコピーしましょう。次のステップで使います。
Tines: Slackに投稿するCredentialsの作成
TinesのCredentialsに行き、+NewでSlackを選択します。

ここでは、今回はUse my own Slack appを選択します。

さきほどのBot User OAuth Tokenのキーを入力します。

作成後、Credentialsの名前をSlackからslack_chatbotに変更します。以下の図のように、Tinesのストーリーがこの名前で参照するようになっているためです。

Slack: 投稿先チャンネルにアプリを追加
投稿先のチャンネルをここでは新たに作成します。そしてそのチャンネルの設定のインテグレーションからアプリを追加するで、今回のSlackアプリを追加しましょう。これをしないと、Tinesからのメッセージがこのチャンネルに届きません。

Slack: 投稿先チャンネルからSlackコマンドを再度テスト
投稿先のSlack#elastic-alertsチャンネルからコマンド/analyzedomain tines.ioを実行すると、今度はボタン入りメッセージが返ってきました。どちらかのボタンを押してみましょう。

(もしメッセージが返ってこない場合、Tinesのフローは、コマンド実行元のSlackチャンネルにこのメッセージを通知するので、そのチャンネルにインテグレーションでアプリを追加していたかを確認しましょう。)
このように、押されたボタンの反応がTinesに伝えられていることがわかります。

Tines: Elastic アラートの接続
この後のステップでElasticからTinesに送るアラートはこのようなデータです。これを受け取れるようにTinesを設定します。

以下のようにTrigger if Analyze Domainからextract domainsへの接続を消して、第1回で作成していたAlerts from Elasticから接続します。また、extract domainsのPathをalerts_from_elastic.body.context.alerts[0].url.domainとして、Elasticのアラートの中のフィールドの値をドメイン値として使うように変更します。

アラートの内容を元に通知先Slackチャンネルを設定
現在の設定だと、通知先のSlackチャンネルは、Slashコマンド実行元のチャンネルが使われるようになっているので、ここではElasticアラートの内容に応じてチャンネルを変更できるようにします。
新しくEvent Transformアクションをドロップし、以下の図のようにbuild resultsとSend Rich Slack Responseの間に挿入します。

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>>に変更し、上の値を参照するようにします。

Elastic アラートへの返しの接続
以下のように第1回で作成したclose Elastic Security alertに対して、trigger to whitelistから接続を作ります。close Elastic Security alertの中のsignal_idsの設定を前回のダミーのIDからalerts_from_elastic.body.context.alerts[0]._idに変更し、トリガーとなったアラートのステータスを変えるように変更します。

最後!Elastic Securityアラートを発行させてテスト。
Elastic SecurityのRulesより、以下のExternal AlertsをInstallし、Enableにしてください。

KibanaのConsoleから以下のようにPOSTコマンドを実行します。タイムスタンプの時刻は現在時刻に変更してください。

External Alertsのアラートルールがこのイベントをトリガーにアラートを作成します。ルールは5分おきに実行されるので、最大5分待つ必要があります。

ワークフローが全てうまくいけば、#elastic-alertsチャンネルにメッセージが届きます。

whitelistボタンを押すと、自動的にアラートがAcknowlegedのステータスに変わりました!

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


