皆さんこんにちは。国井です。
以前にMicrosoft Defender for Endpoint(以下MDE)を使って外付けディスクの利用を追跡する方法を紹介したのですが、
今回も同じことを別のクエリの書き方で実現してみたいと思います。
MDEの利用方法というよりはAdvanced Huntingの使い方を紹介するような形になりますが、お付き合いください。
MDEでデバイスの利用履歴を追跡
MDEはオンボーディングするとデバイスでのアクティビティをMDE側から追跡できるようになります。本来、これは不正アクセスが発生していないか確認するために使うものなのですが、アクティビティが記録されるのであればコンプライアンス上問題になるようなことを追跡するのにも使えるのです。
しかし、不正アクセスの場合はアラートやインシデントが出力されるので簡単に結果を参照できますが、単純にアクティビティを参照してコンプライアンス上の問題を教えてくれるような機能があるわけではありませんし、すべてのアクティビティから外付けディスクに接続されたか?なんてことを調べるのは大変。
そこで、Advanced Huntingを使うのです。
Advanced Hunting
Advanced HuntingはMicrosoft 365 Defenderで利用可能なクエリ機能で、今回利用するMDEだけでなくMicrosoft 365 Defender全体で利用することができます。
Advanced HuntingはKQLと呼ばれるクエリ言語を使って書いていきます。
1行目にはスキーマと呼ばれる、調べたい情報のジャンルを指定します。
例えばデバイス上で行われた操作を調べたい場合にはDeviceEventsというスキーマを使います。(ちなみにスキーマ一覧は画面左側に書いてあります)
実行するとこんな感じ。
画面右下に結果が表示されていますが、ここに書いてある通りに入力して実行すると大量に結果が出てしまいます。
ですので、ここから条件を追加していきます。
条件の絞り込みは2行目以降に書いていきます。例えば表示する列を絞り込むのであれば
| project と書き始めます。続けてこんな感じに列名を指定します。
DeviceEvents
| project Timestamp, DeviceName, AdditionalFields
すると表示される内容がTimestamp, DeviceName, AdditionalFieldsの3つだけに絞り込まれるのですが、
クエリの結果をクリックして詳細を参照すると、AdditionalFieldsの列に複数の値が入っていることがわかります。
この中にUSBSTORという文字列があれば、USB接続の外付けディスクを利用したことになるのですが、このままだとクエリの条件文が書きにくいのでパース処理して別々の列になるように構成します。
DeviceEvents
| extend AF = parsejson(AdditionalFields)
すると、見た目にはわかりにくいですが、AF列に値が値が入ったことがわかります。
AF列内の各項目はAF.xxxx のように指定することができます。
ですので、DeviceId列を取り出して表示する場合、
DeviceEvents
| extend AF = parsejson(AdditionalFields)
| extend AFDeviceId = AF.DeviceId
のように書いてあげます。
USB接続の外付けディスクの利用履歴を発見
やっと本題です。
USB接続の外付けディスクを利用する場合、USBSTORというデバイスドライバーを利用します。そのため、AF.DeviceIdにもUSBSTORという文字列が記録されます。
また、デバイス接続があった場合、ActionType列にPnpDeviceConnectedという値が記録されるので、以上を踏まえると次のようなクエリを書くことになります。
DeviceEvents
| where ActionType == “PnpDeviceConnected”
| extend AF = parsejson(AdditionalFields)
| extend AFDeviceId = AF.DeviceId
| where AFDeviceId startswith “USBSTOR”
| project Timestamp, DeviceName, AFDeviceId
以上で利用履歴を一覧で参照できます。