MSTICPyの紹介とクイックスタート

# 伝えたいこと

Microsoft社が中心となって開発しているオープンソースソフトウェア MSTICpyについて書かれているQiitaの記事がほとんどなかったため、
まずはMSTICpyで何ができるかの機能紹介をし、クイックスタート概要(Quick Start Overview)のページで紹介されている機能について、トレース実行したトラシューポイントを共有できればと思います。

`※ msticpyの「バージョン 2.4.0」を対象にテストした結果ですのでご注意ください。`

# MSTICpy 101

MSTICPyとは、「**M**icro**s**oft **T**hreat **I**ntelligence **C**enter (MSTIC) on **Py**thon and Jupyter notebooks」の略とされており、Pythonで書かれた主にJupyterノートブック上で利用できるツール集です。
情報セキュリティのための侵害調査・脅威ハンティングを行うための機能がたくさん組み込まれています。

2019年3月ごろよりGitHubに公開され、2023年4月現在も活発にアップデートされています。
またBlackHat USA 2020でも対外的に発表されています。 


# MSTICpyの機能

- 複数の情報ソースからログデータを照会
- 脅威インテリジェンス、ジオロケーション、Azureリソースデータでデータをエンリッチメント
- ログからIoA（Indicators of Activity）を抽出し、エンコードされたデータを解凍・デコード
- 異常なセッションの検出や時系列分解など、高度な分析
- インタラクティブなタイムライン、プロセスツリー、多次元モーフチャートを用いてデータを可視化

細かいところは今回の投稿では触れませんが
大きく分割すると以下の４つのジャンルに分類され、ライブラリ化されているため欲しい機能だけ断片的に利用できるのがMSTICpyのいいところです。

`データ取り込み -> データの加工(エンリッチメントやデコード) -> 機械学習での統計分析 -> グラフによる可視化`

例えば、データのエンリッチメントだけ行い、分析と可視化は別のプラットフォーム(SplunkやSentinel)でやるなどの役割分担でも実装できます。

またその逆としてSplunkやSentinelのデータをJupyterノートブックに持ってきてMSTICpyで加工し、分析・可視化したり、もしくはSplunkやSentinelに加工済みデータを返すこともできます。

# 公式リファレンス

[Githubのmsticpy公式レポジトリ](https://github.com/microsoft/msticpy)

[公式レポジトリ上のサンプルJupyterノートブック](https://github.com/microsoft/msticpy/tree/main/docs/notebooks)

[公式ドキュメント](https://msticpy.readthedocs.io/en/latest/)

## おすすめ勉強方法

これらの豊富な公式ドキュメントが公開されており、公式ドキュメント記載の一つ一つの機能についてカスタマイズをしていくと良いでしょう。

公式ドキュメントのチュートリアルに相当するものはこちらです。

https://msticpy.readthedocs.io/en/latest/getting_started/QuickStart.html

以下ではこの通りにチュートリアルを実施し、動くことを確認する目的で説明していきます。


# チュートリアル（クイックスタート）

Jupyterノートブックでノートブックファイルを作成し、実行していきます。
なお、Jupyterの機能を必要としない断片的なMSTICpyの関数利用も可能です。
しかしながらJupyterノートブックにはpandasデータフレームがデフォルト実装されており
データプロットも容易に行えることから、APIと連携させるような間接ツール以外はノートブックで実装することをお薦めします。

ここからはPythonのライブラリ名のmsticpyと小文字で表現します。

## インストール

msticpy Pythonライブラリのインストールには、Python バージョン 3.8以上が必要です。
またライブラリの最新バージョンは2023年4月17日現在において `2.4.0` です。
最新バージョンになるにつれ、バグの修正だけではなく可視化の種類や分析機能も増えていっているため、 
利用する場合は、最新バージョンを利用すると良いでしょう。

ただしバージョン 1系からバージョン 2系にアップグレードされた際に
初期化関数などの仕様が大きく異なり既存コードの修正を余儀なくされることがありました。
その点は注意が必要です。

なお、Pythonのvenvやcondaを使った仮想環境の作成も含めたインストールはこちらを参照ください。
https://msticpy.readthedocs.io/en/latest/getting_started/Installing.html


以下ではPython3.9.12に2023年4月17日での最新の`2.4.0`をインストールします。

私は IDEに[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code)に*Jupyter拡張機能*を導入して利用しています、理由はPylanceの静的な自動コードチェックが素晴らしいからです。
私の実行例では、Anacondaで"msticpy"という仮想Python環境を作って分離しています。

```
!pip install msticpy==2.4.0
```

インストールの手順と実行結果はこちらのノートブックファイルにあります。

https://github.com/Tatsuya-hasegawa/MSTICPy_utils/blob/main/msticpy_light_tutorial.ipynb

ここからは詳しくはGitHubのノートブックファイルをみていただくとして、公式ドキュメント通り行かないトラシューを書いていきます。


### トラシューポイント (1) 追加の依存モジュール

helpを表示しようとすると以下のモジュールが足りないエラーが出たのでインストールしました。

```
!pip install azure-mgmt-resource
!pip install azure-identity
!pip install msticpy\[azure]
```
**msticpy\\[azure]** のバックスラッシュはMacOSなどzsh環境において必要です。


## クイックスタートの実行テスト結果

実行結果の詳細は[こちら](https://github.com/Tatsuya-hasegawa/MSTICPy_utils/blob/main/msticpy_light_tutorial.ipynb)です。

:::note info
「Running a data query」では以下を参考に `Splunk` からのデータ取得について実行しています。利用データはSplunk内部の_internalログとbotsv2のデータです。
参考: https://msticpy.readthedocs.io/en/latest/data_acquisition/SplunkProvider.html
:::

:::note info
「Visualizing Data」の結果はgithubのipynbファイルには埋め込んでいないため、こちらに画像を貼ります。
![viz1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646242/d2296725-ab32-5904-0d65-cd0868ff9b70.png)
![viz2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646242/37170eb8-dcbd-37ae-d2e5-a3db9f506760.png)


:::

:::note info
「Enriching data with Context and Pivot Functions」では以下を参考に `Virustotal` からのルックアップのみ実行しています。
参考: https://msticpy.readthedocs.io/en/latest/data_acquisition/TIProviders.html#listing-available-providers
:::

### トラシューポイント(2) Splunkとの接続

- Splunk側のユーザーはadminかsplunk-system-roleのユーザーを選定し、REST API(通常8089ポート)への疎通がとれるようにしておくこと

### トラシューポイント (3) 組み込みクエリ関数の利用

- いくつかの組み込みクエリ関数は利用されるデータフィールド名も固定されているため、rename などでフィールド名の事前変換が必要だったりします。または組み込みクエリ関数内のオプションでフィールドを合わせましょう。

Splunkに関してはまだまだ組み込みクエリ関数が少なく、Adhocサーチ関数(exec_query)の方が使い勝手が良いと感じます。

### トラシューポイント (4) 環境のリロード

- python kernelとmsticpyの初期化をmsticpyconfig.yamlを修正するたびに念の為に行うこと。

```
# 1. restart python kernel

# 2. msticpy init again
import msticpy as mp
mp.init_notebook()
```

- もしくは、以下でmscitpyconfig.yamlのリロードができます。

```
import msticpy as mp
mp.settings.refresh_config()
```

# あとがき

今回は、MSTICpyの紹介とクイックスタートのチュートリアル実行テストを書きました。
一つ一つの機能がすごく奥深いので、時間があれば一つ一つ丁寧にQiitaに書いていきたいところです。

ご一読いただきありがとうございました！
Happy msticpying!