Sentinel でインシデント検知時に、SOAR を用いてウォッチリストに登録したホワイトリスト IP を除外する

# 1. はじめに
Microsoft Sentinel でインシデント検知運用を行うと、様々な形で誤検知チューニングを行う必要が出てきます。
誤検知チューニングの方法は幾つかの方法があるのですが、この記事では SOAR 機能と呼ばれるロジックアプリを用いて、インシデントに含まれる IP 情報から、Sentinel のウォッチリスト (DB) をチェックして自動クローズさせる手法をご紹介します。

なお、ユーザー情報をロジックアプリでウォッチリストから除外するための設定例は以下をご参照下さい。

https://qiita.com/hisnakad/items/b436d2c614f1076faf3d

# 2. [参考] 誤検知チューニングどこで行う？
本記事ですが、インシデントを検知した後にロジックアプリを起動して除外する方法になります。
誤検知チューニングの方式をまとめると、以下のイメージです。今回の投稿はこちらの青枠の箇所を試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/5effb32e-e802-5337-3513-de47cb2f0615.png)

# 3. プレイブックテンプレートを用いる
ロジックアプリ開発に慣れている方は自作出来そうな要件ですが、Sentinel ウォッチリストを取り込んでマッチングさせるテクニックが必要なので、今回 Sentinel のプレイブックテンプレートを用いることにしました。
元々は Github Azure Sentinel で公開されていたものですが、現在は Microsoft Sentinel のプレイブックテンプレート画面から選んでデプロイすることが出来るようになっています。
テンプレートを見ると、他にもウォッチリストの入出力の参考になるものがあるので、自社カスタマイズされる方は参考になるのではと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/54196460-b384-ba10-20e6-42c6c5dc1253.png)

# 4. やってみる
実際にデプロイして試してみます。対象のプレイブックテンプレートは以下です。
**「ウォッチリスト - 安全な IP を使用してインシデントを閉じる」**
## 4.1 テンプレートのデプロイ
実際にデプロイして試してみます。
テンプレートからデプロイするので、ロジックアプリを保存するリソースグループ、リージョン、プレイブック名を記入します。デフォルトでは ``Watchlist-CloseIncidentSafeIPs`` がプレイブック名になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/2b78d2e8-9aa2-483e-6eea-32421e9febd5.png)

Sentinel 側に lookup するウォッチリスト名がパラメータになっています。（この後作成する必要あり）
ホワイトリストの IP を登録して管理するウォッチリスト名を記入しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/a9fa4d44-7d23-9181-e1b5-e1edbdaecc4d.png)

ロジックアプリから Microsoft Sentinel へはマネージド ID、Azure Monitorに対して API 接続が行うテンプレートになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/56885a30-e7f2-85a3-c4ae-97b9a0da2e9d.png)

## 4.2 ウォッチリストの作成
ロジックアプリから lookup するためのホワイトリスト IP を登録するウォッチリストを作成します。
**エイリアス**がロジックアプリ側からクエリーチェックするキーワードなのでご注意下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/36777a0a-2ce0-dd6a-839e-7577652dba46.png)

ウォッチリストの登録方法は幾つかの方法があります。
大量のデータが有る場合は Azure Storage に一度アップロードしたものを用いることが出来ますが、今回は Azure Portal から CSV でアップロードを行いました。

https://learn.microsoft.com/ja-jp/azure/sentinel/watchlists#options-to-create-watchlists

今回利用したテンプレート（**「ウォッチリスト - 安全な IP を使用してインシデントを閉じる」**）では、lookup の検索キーが決まっており、``ipaddress`` でチェックしています。テンプレートの Description の前提条件に記載されているのですが、分かり難いのでご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/17ee8a0c-8671-b970-1ffe-9661dad8d48a.png)

## 4.3 ロジックアプリを編集する
次にロジックアプリを編集します。
テンプレートでデプロイしたロジックアプリを開き、ロジックアプリデザイナーを開くと、以下のような流れであることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/0b948587-aff7-5eb9-e2c0-77755ca81951.png)

フローを日本語化するとこんな感じです。

1. Sentinel のインシデント作成時にアプリ起動
1. コード（ロジックアプリ）上のパラメータ情報から、ウォッチリスト名を GET
1. 安全かNGかを入れ込む JSON アレイを作成 (safeIPs / NotSafeIPs)
1. インシデント情報からエンティティを GET
1. For Each 繰り返し処理
    - Sentinel Log Analytics ワークスペースに対して、クエリーを実施
        - ウォッチリスト内に IP アドレスがエンティティの IP アドレスにマッチするか Kusto クエリーを実施
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/93c9b224-1bce-07ce-f6c0-1e5902b89755.png)
1. Condition 条件 - クエリー結果があれば
    - **[Yes]** SafeIPs の配列に IP を入れる
    - **[No]** NotSafeIPs の配列に IP を入れる
1. HTML のテーブル作成 (SafeIPs / NotSafeIPs)
1. 対象インシデントにコメントを追加
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/ecf3356d-a066-e3dd-cba0-e7f0c6825cbf.png)
1. Condition 条件 - クエリー結果があれば
    - **[Yes]** インシデントを自動クローズして、コメントを追記する
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/f5233946-505b-da23-b3e3-e0d9c25d507b.png)
    - **[No]** なし

## 4.4 ロジックアプリ API の承認と権限設定
このテンプレートは API 接続を行っています。Sentinel コネクタはマネージド ID で承認されますが、Azure Monitor に対しては AAD 承認を行う必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/69e0d4bf-8ad5-3707-bda7-9b2fc6d8eb51.png)

また、Sentinel のウォッチリストを読み取るための権限が必要です。
そのままだと Unautorized エラーが出ていたので、Sentinel レスポンダーロールを付与してあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/3632653a-4ee0-2669-3ceb-35daa77780c5.png)

# 5. 最後にオートメーションで対象のインシデントや分析ルールを指定する
ロジックアプリとウォッチリストの設定が終わりましたら、起動するためのオートメーション設定を Sentinel で行います。
オートメーション設定では多数の設定を行うケースがほとんどなので、このルールを起動するための順番には注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/bcd1dc21-ac67-7141-033f-1441f018e6c3.png)

# 6. テスト結果例
このテンプレートが実行され、成功すると以下のようなアクションになります。

- エンティティにホワイトリストの IP が含んだインシデントが生成される（誤検知）
- ロジックアプリが起動して、ウォッチリストをチェックして自動クローズする
    - クローズ時にコメント追加

``All the IPs in the incident were found in safe Ips watchlist ～``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d6dd8893-a0d6-d846-44bd-0ba284dbadcf.png)

ロジックアプリ側で見ると、成功・失敗の履歴だけでなく、どのフローがどのように処理されたのかチェックすることが出来ます。デバッグに使えて便利！ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/4018aa24-3f36-a201-9593-a8f4539613ec.png)

# 7. 応用例 ～ サブネットでも検知出来るようにカスタマイズ ～
本テンプレートのロジックアプリで用いられているクエリーでは、ウォッチリストに対して IP アドレスの完全文字マッチングのルールになっており、企業で用いるサブネット指定ではクエリー検知が出来ないようになっています。このまま使う場合、企業側でホワイトリストの IP サブネットが有る場合、レンジ分の IP アドレスを登録するような無駄な作業が発生してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/341252df-ead7-0b86-04b0-563f131ac881.png)

調べてみたところ、``ipv4_is_in_range`` 関数を用いると、ウォッチリストに IP サブネットや IP アドレスを入れてもマッチングしてくれることが分かりました。

https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/ipv4-is-in-range-function

この関数はとても便利で、``ip_range``側の指定は IP アドレスでもサブネット範囲でも true を返してくれます。

```sql
| extend result = ipv4_is_in_range(ip_address, ip_range)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/6347252e-77e9-0509-a5d2-bd688151337e.png)

実際に KQL で打つと以下のような結果になります。
これを用いてロジックアプリのテンプレートをカスタマイズしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/2dead2de-1937-48f6-7804-101a5938d561.png)

ロジックアプリのカスタマイズ箇所を張り付けておきます。
**クエリ**部分を ``ipv4_is_in_range`` で判定出来るように修正するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/40ace5b2-b4f4-540f-456e-9023136f0db8.png)

上記で試してみたところ、無事動作することが出来ました。
これで、企業側のホワイトリストの IP 範囲、IP アドレスをウォッチリストにまとめて投入出来ますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/e2ecdc1d-d73b-fe16-ae9e-b3b3f23935c1.png)

# 8. まとめ
Sentinel のプレイブックテンプレートは様々なものが提供されているのですが、ロジックアプリの中身まで見ないとどのような処理が行われて何が出来るのか分かり難いと思いました。誤検知チューニングの方法の一例になりますが、どなたかの参考になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。