Microsoft Defender for Endpoint (MDE) で活用するハンティングクエリー例

# 1. はじめに
Microsoft Defender for Endpoint (以下MDE) はクライアント、サーバーなどのエンドポイント端末に対してセキュリティ脅威からの検知および防御といった EDR 機能や脆弱性情報を収集し、セキュリティ監査を行う用途が一般的かと思います。
MDE はセキュリティ脅威の検知防御だけでなく、OS (Windows/Linux/Mac) の様々な情報を収集してクラウド側に転送しています。これらのデータは、Microsoft 365 Defender ポータルサイトから[高度な捜索 - Advanced Hunting](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-overview?view=o365-worldwide) として検索が出来るようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/27fbf75a-a448-3117-9b97-bcdfb6b026f7.png)

本記事では、実際にどのような情報が取得できるのか、実際にどのようなクエリーを用いて運用するのか、Microsoft GitHub のサンプルからご紹介します。

# 2. 注意点
MDE の Advanced Hunting でクエリー検索できる範囲は**最大 30 日**になります。
MDE 側の保存期間（最大 180 日まで設定可能）とは異なり、ハンティングで検索出来る期間は30 日になりますのでご注意ください。

https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-overview?view=o365-worldwide

>高度なハンティングは、最大 30 日間の生データを探索できるクエリベースの脅威検出ツールです。 ネットワーク内のイベントを事前に検査して、脅威インジケーターとエンティティを見つけることができます。 データへの柔軟なアクセスにより、既知の脅威と潜在的な脅威の両方に対する制約のない捜索が可能になります。

ハンティングの画面からも分かる通り、過去の検索を行う日数は「過去 30 日」となります。
「ユーザーが設定した時間範囲」を設定しても、設定出来る範囲は過去 30 日からの範囲指定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d67a451c-8aa2-abde-4059-ba546473fed2.png)


実際に運用する場合、30 日では足りず、90 ～ 1年程度の過去履歴に対して分析、検索をかける要件が多いのではないかと思います。これらの保管・分析要件が必要な場合は、**Microsoft Sentinel** に接続し、監視することを検討して下さい。



# 3. MDE で記録する情報 / テーブル内容
Microsoft 365 Defender ポータルで収集される様々なデータのスキーマ情報は以下公式 Docs にて公開されています。
https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-schema-tables?view=o365-worldwide#learn-the-schema-tables

上記テーブルから MDE で収集されるイベントに関連するテーブルを抽出すると以下になります。
それぞれのテーブルでどのような情報が収集されているのか、またクエリーでどのような活用が出来るのかを見ていきます。

| No.| テーブル名 | 内容 | 公式 Docs |
| --- | --- | --- | --- |
| 1 | DeviceInfo | マシン情報 (OS 情報を含む) |[Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-deviceinfo-table?view=o365-worldwide) |
| 2 | DeviceNetworkInfo | マシンのネットワーク プロパティ | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-devicenetworkinfo-table?view=o365-worldwide) |
| 3 | DeviceProcessEvents | プロセスの作成と関連イベント | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-deviceprocessevents-table?view=o365-worldwide) |
| 4 | DeviceNetworkEvents | ネットワーク接続と関連イベント | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-devicenetworkevents-table?view=o365-worldwide) |
| 5 | DeviceFileEvents | ファイルの作成、変更、その他のファイル システムイベント | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-devicefileevents-table?view=o365-worldwide) |
| 6 | DeviceRegistryEvents | レジストリ エントリの作成と変更 | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-deviceregistryevents-table?view=o365-worldwide) |
| 7 | DeviceLogonEvents | サインインとその他の認証イベント | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-devicelogonevents-table?view=o365-worldwide) |
| 8 | DeviceImageLoadEvents | DLL 読み込みイベント | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-deviceimageloadevents-table?view=o365-worldwide) |
| 9 | DeviceEvents | 追加のイベントの種類 | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-deviceevents-table?view=o365-worldwide) |
| 10 | DeviceFileCertificateInfo | 署名されたファイルの証明書情報 | [Docs](https://docs.microsoft.com/ja-jp/microsoft-365/security/defender/advanced-hunting-devicefilecertificateinfo-table?view=o365-worldwide) |

# 4. 各テーブル詳細とクエリー例
## 1. DeviceInfo - 	マシン情報 (OS 情報を含む)
### 1.1 DeviceInfo 概要
DeviceInfo テーブルには MDE を通じて OS バージョン、アクティブユーザー、コンピューター名など、企業内のデバイスに関する情報が含まれています。なお、**15 分毎に Heartbeat としてクラウド側に情報更新が行われる**仕様であるため、イベントは時系列に蓄積されます。
DeviceInfo に含まれる field 情報で使えそうなキーを拾ってみました。

| ``field`` 例 | 内容 |
| --- | --- |
| ``DeviceName`` | デバイス名 (FQDN |
| ``DeviceId`` | デバイス ID (固有識別情報) |
| ``OSPlatform`` | OS 情報 |
| ``PublicIP`` | パブリック IP アドレス（MDE に接続するために用いた IP |
| ``LoggedOnUsers`` | イベント発生時にマシンにログオンしているすべてのユーザーの一覧 |
| ``MachineGroup`` | マシンのマシン グループ |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/37df6a34-bbcc-e661-11df-a0336735af82.png)

用途として、デバイス名や OS 情報をクエリーするシンプルな使い方であったり、

```sql
DeviceInfo
| take 100
| project DeviceId, DeviceName, OSPlatform
```

``join`` を用いて他テーブル（以下例では DeviceLogonEvents）を読み込んだりすることが出来ます。

```sql
DeviceInfo
| where OSPlatform == 'Windows10'
| join DeviceLogonEvents on DeviceId 
| distinct DeviceId, DeviceName, AccountDomain, AccountName, AccountSid
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/ce09af63-9ec4-71f2-d3e7-1b1bafc1fdaa.png)

### 1.2 DeviceInfo クエリー実践
そのままでは 15 分間隔のポーリング情報が全て出力されてしまうため、**最新のステータス情報のみ**抽出する場合は以下のクエリーで抽出することが出来ます（公式Docsより）

```sql
// 最新のデバイス登録情報をリストする
DeviceInfo
| where isnotempty(OSPlatform)
| summarize arg_max(Timestamp, *) by DeviceId 
```

最新のステータス情報に加えて、各OS毎のデバイスリストを配列で追加したクエリー例です。
こちらを使うことで、現 MDE 導入環境のアセット情報を抽出することが出来ます。

```sql
// 最新のデバイス登録情報を OS 毎にデバイス情報も含めて抽出する
DeviceInfo
| where isnotempty(OSPlatform)
| summarize arg_max(Timestamp, *) by DeviceId 
| summarize Devices = count(), DeviceList = make_set(DeviceName) by OSPlatform
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/e526fb61-e437-6c6f-44df-47689855ce8a.png)

もし、最新の OS 毎のデバイスリストだけを抽出する場合は、以下のクエリーで抽出が出来ます。

```sql
// 最新のデバイス登録情報を OS 毎にグループで抽出する
DeviceInfo
| where isnotempty(OSPlatform)
| distinct DeviceId, OSPlatform
| summarize count() by OSPlatform
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/b21b4981-e3f0-3945-169e-74dd3089e282.png)




## 2. DeviceNetworkInfo - マシンのネットワークプロパティ
### 2.1 DeviceNetworkInfo 概要
DeviceNetworkInfo テーブルは、ネットワーク アダプター、IP と MAC アドレス、接続されたネットワークまたはドメインなど、コンピューターのネットワーク構成に関する情報が含まれています。
こちらはインシデント発生時の端末側 I/F のチェック用途といったところになると思います。

| ``field`` 例 | 内容 |
| --- | --- |
| ``NetworkAdapterName`` | ネットワーク アダプターの名前 |
| ``MacAddress`` | ネットワーク アダプターの MAC アドレス |
| ``IPAddresses`` | アダプターに割り当てられたすべての IP アドレス |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/fe23e017-39cf-bac6-1659-b767a47ffb01.png)

## 3. DeviceProcessEvents - プロセスの作成と関連イベント
### 3.1 DeviceProcessEvents 概要
DeviceProcessEvents テーブルは、OS のプロセスの作成と関連イベントに関する情報が含まれています。
マルウェア感染時にありがちなプロセスの作成や、プロセス作成の元となったコマンド情報が記録される重要なテーブルです。

| ``field`` 例 | 内容 |
| --- | --- |
| ``ProcessCommandLine`` | 新しいプロセスの作成に使用されるコマンド ライン |
| ``FileName`` | 記録されたアクションが適用されたファイルの名前 |
| ``FolderPath`` | 記録されたアクションが適用されたファイルを含むフォルダー |
| ``AccountName`` | アカウントのユーザー名 |
| ``ProcessTokenElevation`` | 	新しく作成されたプロセスに適用されるトークン昇格の種類を示します。<BR>使用可能な値:<BR>TokenElevationTypeLimited (restricted)、TokenElevationTypeDefault (standard)、TokenElevationTypeFull (管理者特権) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/31b2e3cb-4e91-f330-b9a6-dc69c7fd37a6.png)

### 3.2 DeviceProcessEvents クエリー実践
用途例として、```ProcessCommandLine```といったプロセスを作成する元となったコマンド情報が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/64872e9d-d427-f808-980f-97be3f336814.png)

例として、以下のようにマルウェアが混入されたドキュメントファイルや機密情報ファイルが含まれているコマンドを指定し、プロセスが作成されているかどうかを確認するようなハンティングが考えられます。

```sql
// 特定ファイルを実行してプロセスが作られたかを確認する
DeviceProcessEvents
| where Timestamp > ago(19d) 
and ProcessCommandLine contains 'UpdatedPolicy_SOW_07182020.doc'
and AccountObjectId == 'ab653b2a-d23e-49df-9493-c26590f8f319'
```

## 4. DeviceNetworkEvents - ネットワーク接続と関連イベント
### 4.1 DeviceNetworkEvents 概要
ネットワーク接続と関連するイベントに関する情報が含まれています。
プロセスが外部宛てに行う通信履歴の確認に使える情報が多いです。

| ``field`` 例 | 内容 |
| --- | --- |
| ``RemoteIP`` | 接続されていた IP アドレス |
| ``RemotePort`` | 接続先のリモート デバイス上の TCP ポート |
| ``RemoteUrl`` | 接続されていた URL  |
| ``Protocol`` | 通信プロトコル |
| ``InitiatingProcessFileName`` | イベントを開始したプロセスの名前 |

特定の端末で絞り込んだクエリー例を以下に示します。
https 通信については原則非表示（なぜか microsoftonline.com だけ表示されている）です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/cd4a8ec7-45ac-400e-b57a-36366485de7a.png)


### 4.2 DeviceNetworkEvents クエリー実践
GitHub 公式クエリーサンプルで紹介されていた [SMB 共有を検索するクエリー例](https://github.com/microsoft/Microsoft-365-Defender-Hunting-Queries/blob/master/Discovery/SMB%20shares%20discovery.txt)です。

```sql
DeviceNetworkEvents
| where RemotePort == 445 and Timestamp > ago(7d) 
    // Exclude Kernel processes, as they are too noisy in this query
    and InitiatingProcessId !in (0, 4)
| summarize RemoteIPCount=dcount(RemoteIP) by DeviceName, InitiatingProcessFileName, InitiatingProcessId, InitiatingProcessCreationTime
| where RemoteIPCount > 10
```

ネットワーク履歴のため、[P2P(Torrent) を検知するような検索クエリー](https://github.com/microsoft/Microsoft-365-Defender-Hunting-Queries/blob/master/Discovery/DetectTorrentUse.txt)も可能です。

```sql
//Custom detection to find use of torrenting software or browsing related to torrents
DeviceNetworkEvents 
| where Timestamp > ago(7d)
| where RemoteUrl has "torrent" or RemoteUrl has "vuze" or RemoteUrl has "azureus" or RemoteUrl endswith ".tor" or InitiatingProcessFileName has "torrent" or InitiatingProcessFileName has "vuze" or InitiatingProcessFileName contains "azureus" 
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, RemoteUrl , RemoteIP , RemotePort  
```

## 5. DeviceFileEvents
### 5.1 DeviceFileEvents 概要
ファイルの作成、変更、およびその他のファイル システム イベントに関する情報が含まれています。
DeviceProcessEvents がプロセス作成の情報を取得しているのに対して、DeviceFileEvents はプロセスによって作成されたファイルを監視することが出来るようになります。
以下 field 情報を見ると、外部からダウンロードしたファイルを監視するのに向いていることが分かります。

| ``field`` 例 | 内容 |
| --- | --- |
| ``FileName`` | 記録されたアクションが適用されたファイルの名前 |
| ``FolderPath`` | 記録されたアクションが適用されたファイルを含むフォルダー |
| ``FileOriginUrl`` | ファイルのダウンロード元の URL |
| ``FileOriginReferrerUrl`` | ダウンロードしたファイルにリンクする Web ページの URL |
| ``FileSize`` | ファイルのサイズ (バイト単位) |
| ``RequestProtocol`` | ネットワーク プロトコル (該当する場合) は、アクティビティの開始に使用されます(不明、ローカル、SMB、または NFS) |

DeviceFileEvents の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/3bd60d79-0db5-5cb2-21aa-1954e95ad601.png)

## 6. DeviceRegistryEvents
### 6.1 DeviceRegistryEvents 概要
レジストリ エントリの作成と変更に関する情報が含まれています。
レジストリの記録、書き換えなどの情報を調査する場合に用いることが考えられます。

| ``field`` 例 | 内容 |
| --- | --- |
| ``RegistryKey`` | 記録されたアクションが適用されたレジストリ キー |
| ``RegistryValueType`` | 記録されたアクションが適用されたレジストリ値のデータ型 (バイナリや文字列など) |
| ``RegistryValueName`` | 記録されたアクションが適用されたレジストリ値の名前 |
| ``RegistryValueData`` | 記録されたアクションが適用されたレジストリ値のデータ |
| ``PreviousRegistryKey`` | 変更前のレジストリ値の元のレジストリ キー |
| ``PreviousRegistryValueName`` | 変更前のレジストリ値の元の名前 |


## 7. DeviceLogonEvents
### 7.1 DeviceLogonEvents 概要
デバイス上のユーザー ログオンやその他の認証イベントに関する情報が含まれています。
ログオンに関する様々なフィールドが表示されますが、``ActionType`` でフィルターしたり、``LogonType`` に対する監査を行ったり、失敗した理由を調査するなどの活用が考えられます。

| ``field`` 例 | 内容 |
| --- | --- |
| ``ActionType`` | イベントをトリガーしたアクティビティの種類 |
| ``LogonType`` | ログオン セッションの種類が表示されます。<BR>**対話型** - ユーザーがローカル キーボードと画面を使用してコンピューターと物理的に対話する<BR>**リモート 対話型 (RDP) ログオン** - ユーザーは、リモート デスクトップ、ターミナル サービス、リモート アシスタンス、またはその他の RDP クライアントを使用してリモートでコンピューターと対話します。<BR>**ネットワーク** - PsExec を使用してマシンにアクセスしたとき、またはコンピューター上の共有リソース (プリンターや共有フォルダーなど) にアクセスしたときに開始されるセッション<BR>**Batch** - スケジュールされたタスクによって開始されるセッション<BR>サービス - 開始時にサービスによって開始されるセッション |
| ``AccountDomain`` | アカウントのドメイン |
| ``AccountName`` | アカウントのユーザー名 |
| ``FailureReason`` | 記録されたアクションが失敗した理由 |

### 7.2 DeviceLogonEvents クエリー実践
デバイスのログオン情報を活用して、特定ホストの時系列のアカウントログオンを時系列で表示するクエリー例です。ここでは ```where``` operator で内部システム ID　の情報（driver host / window manager など）を除外してクエリーをかけています。

```sql
DeviceLogonEvents
| where DeviceName == 'xxx.xxx.xxx' and Timestanmp > ago(30d) and ActionType == 'LogonSuccess'
| where AccountDomain !in ('font driver host', 'window manager'( // Ignoring internal system identities at the moment
| extend Account = stract(AccountDomain, '\\', AccountName )
| summarize count() by Account, bin(timestamp, 1h)
| render timechart
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/ed24438d-bdab-6357-90e4-aa88aa4d1dbd.png)


## 8. DeviceImageLoadEvents
### 8.1 DeviceImageLoadEvents 概要
DLL 読み込みイベントに関する情報が含まれています。 

## 9. DeviceEvents
### 9.1 DeviceEvents 概要
DeviceEventsテーブルには、Microsoft Defender ウイルス対策やエクスプロイト保護などのセキュリティ制御によってトリガーされるイベントなど、さまざまなイベントの種類に関する情報が含まれています。
デバイスの動きを検索したり、監視する用途に用いることが出来るため、様々なユースケースが考えられます。

| ``field`` 例 | 内容 |
| --- | --- |
| ``ActionType`` | イベントをトリガーしたアクティビティの種類 |
| ``FileName`` | 記録されたアクションが適用されたファイルの名前 |
| ``FolderPath`` | 記録されたアクションが適用されたファイルを含むフォルダー |
| ``FileSize`` | ファイルのサイズ (バイト単位) |
| ``AccountDomain`` | アカウントのドメイン |
| ``AccountName`` | アカウントのユーザー名 |
| ``RemoteUrl`` | 接続されていた URL または完全修飾ドメイン名 (FQDN) |
| ``LogonId`` | ログオン セッションの識別子 |
| ``FileOriginUrl`` | ファイルのダウンロード元の URL |
| ``FileOriginIP`` | ファイルのダウンロード元の IP アドレス |


### 9.2 DeviceEvents クエリー実践
実際に ``ActionType`` でグループ化(summarize)すると、MDE 導入端末の動きが分かります。

```sql
DeviceEvents
| summarize count() by ActionType
| order by count_ asc
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/50c1f8b8-8e1f-0c3c-570c-cc1dc545b424.png)

WindowsDefender 側によるアンチウイルス検知のイベントであれば、``ActionType == "AntivirusDetection"``でフィルターすればよいことが分かります。

```sql
DeviceEvents
| where ActionType == "AntivirusDetection"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/f6b50c32-39e0-f741-7654-ff7986d8cdb6.png)

USB デバイス監視のクエリー例です。
``ActionType == UsbDriveMounted`` を用いて、拡張情報（Additionnal Field）を正規化すると以下のようなクエリーになります。

```sql
DeviceEvents
| where ActionType == "UsbDriveMounted"
| extend ParsedFields=parse_json(AdditionalFields)
| project Timestamp, DeviceId, DeviceName, ActionType, ProductName=ParsedFields.ProductName,SerialNumber=ParsedFields.SerialNumber,Manufacturer=ParsedFields.Manufacturer
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/5964e9cb-939f-112c-62ac-b56b5dd09e6b.png)



## 10. DeviceFileCertificateInfo
### 10.1 DeviceFileCertificateInfo 概要
ファイル署名証明書に関する情報が含まれています。エンドポイント端末上のファイルで定期的に実行される証明書検証アクティビティが表示されます。
イベントとしては、以下のような Windows 証明書の情報が主体になるため、参考テーブルといったところになるのではと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/749d2ab7-e163-735c-466d-b109e203c61a.png)


# 5. 参考文献
今回、以下 Microsoft 公式サイトの GitHub Repository の Hunting クエリーを参考にしました。
様々なクエリー応用例が紹介されていますので、ご興味がある方はご参照下さい。 
Microsoft 365 Defender Advanced Hunting GitHub Repository
https://github.com/microsoft/Microsoft-365-Defender-Hunting-Queries


# 6. まとめ
MDE は EDR だけでなく端末の様々な情報を収集しており、インシデント発生時や監査用途としてハンティングクエリーを活用できます。どなたかの参考になれば幸いです。

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