はじめに
本ブログでは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にレスポンスを返すだけで、アラートの自動クローズなどの自動化を実装することができます。