Microsoft Sentinel の SOAR 機能で色々やってみる
この記事は、【初心者優先枠】corp-engr 情シスSlack(コーポレートエンジニア x 情シス)#2 Advent Calendar 2024 の 17 日目の記事です。
やっぱ自動化だよな
今年に入ってから仕事で、前任者から運用を引継ぐ形で SIEM & SOARとして Microsoft Sentinel を触り始めました。当初、SIEM についてはログの取り込み設定やダッシュボードの構築は一通り出来上がった状態だったものの、SOAR 機能はほぼ手付かずの状態でした。
SIEM はアラート調査で使うことが多いので、ともするとセキュリティ担当者の時間を奪いがちなシステムです。一方、SOAR はオペレーションの自動化で使うので、うまく活用できれば自分が楽になれます。そんな感じで SOAR 活用のモチベーションが高まったので、色々試してみたことを紹介します。
セキュリティも自動化だ!
Sentinel の SOAR 機能
Sentinel の SOAR 機能は以下の2つです。
オートメーションルール
プレイブック
オートメーションルール
Sentinel 上に記録された特定のイベントを基に起動するルールです。トリガーは3種類だけでとってもシンプル。

アクションは以下の6つ。意外と少ない?

プレイブック
Sentinel の SOAR 機能による自動化の中身の実装は基本的にこちら。

その名の通り、インシデントやアラート発生時にどういうルールに基づいて何をするか、を記載したプレイブックですが、Sentinel におけるプレイブックの実体は Azure Logic Apps です。
実際、Sentinal とは全く関係ないところで作った Logic Apps アプリも(そんなんセキュリティと関係ないよってものも) Sentinel のプレイブックリストに表示されます。
プレイブックはテンプレートがたくさん用意されており、自動で担当者をアサインするとか Slack に通知するとかよくある感じのものは結構用意されています。
どう使い分ける?
インシデントやアラート発生時にオートメーションルールを起動させて、オートメーションルールのアクションとしてプレイブックを実行する、というのが基本的な使い方になるでしょう。
オートメーションルールだと実行順の制御やアラートの発出元(EDR なのか CASB なのか、等)による実行有無を制御できるので、インシデントやアラートの情報を基に、条件に応じた必要なプレイブックを実行する、という使い方が良さそうです。
作ったプレイブック
というわけで、いくつかプレイブックを作ってみました。
EDR アラート発生時の自動隔離
最優先でやりたかったやつ。実際にマルウェア感染とかが発生したら横展開される前に隔離したいけど、手動でやってると 24h/365d 対応とか現実的じゃないから自動化しよう。疑わしきは隔離だ!(でも本番サーバーとか簡単に隔離しないように)
やりたいことは以下。
インシデントが起きたら関連するマシンを全部隔離
隔離を実施したことを Slack へ通知
前提として、EDR は Microsoft Defender for Endpoint (MDE) です。Sentinel 導入するような組織はどうせ他のセキュリティ製品も Microsoft で固めてますよね?(暴論)
最小構成だと以下のような感じ。問答無用で全部隔離するぞ!(でも本番サーバーとか簡単に隔離ry)

まずはインシデントに関連するマシンの配列を作る。


ここからは各マシンごとの処理。まずはマシンの情報をゲット。Sentinel のインシデントをトリガーにした場合、マシン ID は各 entity 内の ['properties']?['additionalData'] 以下から取得できます。(連携元の EDR によって異なるかもしれません)
EDR がMDE の場合は、以下のプロパティでマシン ID を取得できます。
{
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"referenceName": "wdatp-1"
}
},
"method": "get",
"path": "/api/machines/@{encodeURIComponent(items('For_each_entity_in_entities')?['properties']?['additionalData']?['MdatpDeviceId'])}"
}
}
最後に隔離!完了したら Slack にメッセージを投稿。失敗することもあるので try ~ catch で失敗時用のメッセージも用意しておきます。


これでプレイブックは OK。あとは EDR から Medium 以上のアラートが発出された時にこのプレイブックを実行するようオートメーションルールを組んで完成。

これで深夜や休日に EDR のアラートが鳴っても自動で隔離されるので安心です!(でも本番サーバーとかry)
Slack に隔離解除ボタンを表示
そうは言っても休日稼働してる人が明らかな誤検知で隔離されちゃったりしたら困るよね、ということで Slack から隔離解除できるようにしてみます。
やりたいことは以下。さすがに Sentinel だけじゃ無理なので Slack アプリも実装します。
自動隔離が実行されたマシンの隔離解除用ボタンを Slack に表示させる
ボタン押したら隔離解除される
さてプレイブックですが、実は先ほどの自動隔離プレイブックに 1 アクション足すだけです。自動隔離の後に HTTP POST を入れましょう。

この実装では、事前にマシン側にユーザーが判別できるようなタグを付与しておき、そのタグを Slack へ投稿することで誰の端末が隔離されたのか分かるようにしています。
URL は Slack アプリの Webhook URL を入力します。アプリを作成して Webhook URL を取得しておきましょう。

これで Slack に隔離解除ボタンが実装されました!完成!

…これ(だけ)では、いけませんね?
ボタンはできましたが、これだと押しても何も起こりません。ちゃんと中身のロジックも作りましょう。
隔離解除機能
というわけで、「ボタンを押したら隔離解除される」の部分のプレイブックを作りました。(トリガーが Sentinel ではないので SOAR じゃなくてただの Logic Apps では?というツッコミは受け付けません)

ボタンを押したタイミングでプレイブックが起動するようにします。トリガーを「When a HTTP request is received」に設定し、request URL を Slack アプリに登録します。


リクエストボディは JSON へ変換して parse します。スキーマは長いので省略しますが、1 回テストで HTTP request を生成し、それを sample payload として生成するとよいです。データの整形ができたらステータスコードを 200 で返します。


データを整形して対象マシンがわかったら隔離解除を実施。

最後にメッセージを編集してボタンを消します。

ボタンを押すと隔離解除が実行されます。今度こそ本当に完成!

まとめ
結局 Logic Apps のサンプル紹介になってしまいましたが、SOAR の雰囲気を少しだけ感じられたのではないかと思います。
Logic Apps でプレイブックを組むことができるということはかなり色々な自動化を実装できるので、SOAR にはまだまだ使い道がありそうです。次は何を試そうか。
あと、大事なことなので何度も言いますが、くれぐれも本番稼働中のサーバーを自動隔離したりしないようにしましょうね!
