ISV パートナーは、Jupyter Notebook 分析ソリューションを構築、テスト、パッケージ化し、SaaS オファーとしてMicrosoft Security ストアに発行できます。 Microsoft Sentinel Data Lake では、大規模なセキュリティ データセットに対してマネージド Spark プールで実行される Jupyter Notebook がサポートされています。 これらのノートブックは、低速度および低速の攻撃検出、行動の基本線付け、AI/ML ベースの分析、機密データ パス マッピング、データ視覚化、従来の KQL 検出では表現できないエンリッチメントに最適です。
ノートブックプラットフォームのソリューションは、通常、履歴分析、複雑なデータ変換、定期的なデータ処理ワークフロー向けに設計されています。 出力はデータレイク内のカスタムテーブルに書き込まれ、下流の解析ルール、ハンティングクエリ、Security Copilotエージェント、またはMCPツールがノートブックのソリューションの結果を消費できます。 パートナー センターに送信する.zip パッケージはSentinelLake型として宣言され、ノートブックと、必要に応じて、ノートブックに必要なダウンストリーム Azure リソース用の ARM テンプレートが含まれています。
この記事では、Microsoft Sentinelプラットフォームノートブックソリューションの構築、テスト、パッケージング、そしてMicrosoft Securityストアへの公開方法を解説します。 このガイドを完了すると、次の情報が表示されます。
- Sentinel データレイクからデータを読み取る動作する Jupyter ノートブック
- マネージド Spark プールでノートブックを実行するスケジュール済みのジョブ
-
SentinelLakeパッケージ ZIP (PackageManifest+ ノートブック フォルダー) - Microsoft Security ストアのパートナー センター SaaS オファーの一覧
前提条件
テナントは、Microsoft Sentinel Data Lake にオンボードされている必要があります。 Defender ポータルでオンボードの状態を確認します。 System>Settings>> に移動します。 テナントの準備ができている場合、状態は プロビジョニング済み と表示されます。 オンボード手順については、Microsoft Sentinel Data Lake へのオンボードに関する記事を参照してください。
必要なアクセス許可
| 運用/リソース | 必要な役割 |
|---|---|
| Sentinel データ レイクへのオンボーディング | Microsoft Entra ID - セキュリティ管理者またはグローバル管理者 |
| Sentinel ワークスペースをDefenderポータルにオンボードする | サブスクリプションの所有者、またはサブスクリプション スコープのユーザー アクセス管理者と、サブスクリプションまたはリソース グループ スコープの Microsoft Sentinel 共同作成者 |
| Sentinel ワークスペースをData Lakeにオンボードする | サブスクリプションまたはリソース グループ スコープでのサブスクリプション所有者または Microsoft Sentinel 共同作成者 |
| データ レイクでノートブックを実行する | Microsoft Sentinel閲覧者または共同作成者 |
| Log Analytics ワークスペース (分析レベルへの書き戻し用) | データ レイク マネージド ID に割り当てられている Log Analytics 共同作成者 msg-resources-<guid> |
| Microsoft パートナー センター | Marketplace Publisherアカウント(一度きり;Security Copilotエージェントの公開にも同じアカウント) |
Note
サブスクリプション所有者ロールは、1 回限りの Data Lake オンボード タスクに必要です。 Microsoft Entra Privileged Identity Management (PIM) を使用して、必要な場合にのみこのロールに一時的に昇格してから、オンボードの完了後にアクセスを削除します。
必要なツール
- Visual Studio Code。
- Microsoft Sentinel の VS Code 拡張機能
- ノートブック作成のスピードアップにはGitHub Copilot VS Code拡張機能が推奨されています。
- Python 3.10 以降がローカルにインストールされています。 Spark カーネルはAzureで実行されますが、VS Code にはセル編集用のローカル インタープリターが必要です。
プロセスの概要
発行プロセスは、Microsoft Security ストアで検出可能なパッケージ SaaS オファーにローカル ノートブック開発を移行することから始まります。
- ローカル ノートブック開発 (VS Code + Sentinel 拡張機能)
- Sentinel プラットフォームに対して対話形式で実行する
- 代表的なデータでテストし、出力テーブルに正しく入力されていることを検証する
- ジョブとしてのスケジュール (オンデマンドまたはスケジュール済み)
- SentinelLake .zip としてパッケージ化 (PackageManifest.yaml + folder)
- Microsoft Partner Centerで SaaS オファーを作成する
- パッケージのアップロード、メタデータの作成、計画、および価格
- レビューと発行、自動レビュー、運用開始
- Microsoft Security ストアでのライブ
Visual Studio Code と Microsoft Sentinel 拡張機能をインストールする
すべてのノートブック開発は、Microsoft Sentinel拡張機能がインストールされた VS Code でローカルに行われます。 Spark カーネルはAzureで実行されます。VS Code はエディターおよび申請クライアントです。
https://code.visualstudio.com/からVisual Studio Codeをダウンロードし、既定のオプションでインストールします。VS Code >Extensions Marketplace を開きます (Ctrl + Shift + X または Cmd + Shift + X)。
Sentinel を検索し、Microsoft Sentinel拡張機能 (publisher:
ms-security) をインストールします。インストール後、左側のツール バーにMicrosoft Sentinel アイコンが表示されます。
(推奨)マーケットプレースでGitHub Copilotを検索してインストールし、メッセージが表示されたらGitHubにサインインします。
Copilot は
MicrosoftSentinelProviderAPI を理解し、PySpark の変換を自動補完します。左側のツール バーのMicrosoft Sentinel アイコンを選択します。
サインイン ダイアログを承認し、ワークスペースで Sentinel 閲覧者/共同作成者を持つアカウントを選択します。
左側のウィンドウには 、Lake テーブル と ジョブが表示され、拡張機能が Data Lake に到達したことを確認します。
Caution
複数のゲスト テナントがサインインしている場合、VS Code の左下にあるアカウントを切り替えると、アクティブな PySpark セッションが強制終了します。切り替えた後にカーネルを再起動する必要があります。 プラン アカウントは、実行中ではなく、実行と実行の間で切り替わります。
ノートブックを開発する
ノートブックでは、次の作成パターンが使用されます。
- Spark DataFrame への Data Lake テーブルの読み取り
- PySpark を使用した変換
- 必要に応じて外部データを使用してエンリッチする
- Sentinel で使用できるカスタム テーブルに結果を書き込む
Lake テーブル パネルを確認する
ノートブックで使用する入力テーブルを識別するには、[Lake tables]\(レイク テーブル\) パネルを調べます。
- Sentinel アイコンを選択し、 Lake テーブルを展開します。
- テーブルは、データベースとカテゴリ (システム、カスタム、フェデレーション) ごとにグループ化されます。 任意のテーブルを選択すると、その列の定義と型が表示されます。
- ノートブックが読み取る入力テーブルを特定し、正確な名前をメモします。
新しいノートブックを作成する
ソリューションの新しい Jupyter Notebook を作成するには、次の手順を実行します。
Ctrl+Shift+P / Cmd+Shift+P>を押して Create New Jupyter Notebook と入力するか、ファイル>新しいファイル>Jupyter Notebook を選択します。
わかりやすい名前 (
failed-signin-baseline.ipynbなど) でノートブックを保存します。
テーブルの読み取り
このテンプレートを最初のセルに貼り付け、テーブル名を自分の名前に置き換えます。
from sentinel_lake.providers import MicrosoftSentinelProvider
data_provider = MicrosoftSentinelProvider(spark)
# Read a table from the data lake
table_name = "EntraGroups"
df = data_provider.read_table(table_name)
# Quick sanity check—show 100 rows
df.select("displayName", "groupTypes", "mail", "tenantId").show(100, truncate=False)
ランタイム プールを選択してセルを実行する
データ レイクに対してセルを実行するには、プールを選択して送信します。
セル上の Run の三角形を選択します。
メッセージが表示されたら、ランタイムとしてMicrosoft Sentinelを選択します。
プールサイズを選択します: 探索には 小、変換には 中、ML または数千万行規模の集計には 大 を選択します。
最初の実行では、Spark セッションの起動に 3 分から 5 分かかります。 後続のセルは秒単位で実行されます。
カスタム テーブルの変換と書き戻し
save_as_table() メソッドは、DataFrame をレイク層 (または分析層) のカスタム テーブルに書き込みます。 変換先テーブルは、最初の書き込み時に作成されます。
df_transformed = (
df.filter(df.mail.isNotNull())
.select("displayName", "groupTypes", "mail", "mailNickname", "description", "tenantId")
)
write_options = {"mode": "overwrite"}
data_provider.save_as_table(
df_transformed,
"EntraGroups_Processed_SPRK",
write_options=write_options,
)
ノートブックの作成パターン
次のパターンでは、最も一般的なシナリオについて説明します。
| Pattern | いつ使用するか |
|---|---|
| ベースライン + ドリフト | ユーザーごとまたはホストごとの通常の動作を計算する。ベースラインから逸脱する行にフラグを設定します。 失敗したサインインとプロセス実行の分析向けのクラシック。 |
| テーブル間結合 | 共有エンティティ (UPN、ホスト、IP) 上の組み込みテーブル (SigninLogs、SecurityAlert、DeviceProcessEvents) を使用して、所有するレイク テーブルを結合します。 |
| ML スコアリング | ノートブックで事前トレーニング済みモデルをトレーニングまたは読み込みます。各行にスコアを付けます。上位 N 個の危険な行をカスタム出力テーブルに書き込み、ダウンストリーム アラートを生成します。 |
| 視覚的な調査 | matplotlibやplotlyでタイムライン、ヒートマップ、プロセスツリーを作成し、ノートをHTMLとしてエクスポートして引き継ぎます。 |
ヒント
マークダウン セルを自由に使用してコードを文書化します。 セキュリティ ストアのレビュー担当者、およびノートブックを実行する SOC アナリストは、コードを読まずに各セクションの機能を理解する必要があります。 目的、入力、出力、予想される出力を説明するすべてのコード ブロックの上にマークダウン セルを配置します。 レビュアーは、内容が不明確なノートブックは即不合格と見なします。
ノートブックをテストする
テストでは、ノートブックが現実的なデータで最初から最後まで正常に実行され、実用的な出力テーブルを生成することを実証する必要があります。
小規模プールでのスモーク テスト
ノートブックをエンドツーエンドで実行して、すべてのセルがエラーなしで完了することを確認します。
- カーネルを再起動して、古い状態をクリアします。
- すべてのセルを上から下に実行します。すべてのセルはエラーなしで完了する必要があります。
変換セルが Small で 5 分を超える場合、入力フィルターが緩すぎます。 スケールアップする前に、日付範囲または選択する列を絞り込んでください。
出力テーブルを検証する
出力テーブルが作成され、予想されるデータが含まれていることを確認します。
- Sentinel 拡張機能の [Lake tables ]\(Lake テーブル\) パネルで、出力テーブルが予想されるスキーマと共に表示されたことを更新して確認します。
- 検証セルを実行します。
verify_df = data_provider.read_table("EntraGroups_Processed_SPRK")
print("Row count:", verify_df.count())
verify_df.printSchema()
verify_df.show(5, truncate=False)
中または大のプールでのスケール テスト
ノートブックが、より大きなプールサイズでも一貫性のある結果を生成することを確認します。
- ノートブックを Medium で再実行してください(データセットの規模に応じて必要であれば Large でも)。
- 行数と列の分布が Small run と一致するようにします。 それらが分岐する場合は、調査を必要とする非決定論的な変換があります。
エッジケースをテストする
- 空の入力: 0 行のテーブルまたは日付範囲をポイントします。 ノートブックは、クラッシュするのではなく、適切に失敗するか、空の出力を書き込む必要があります。
- スキーマ ドリフト: 入力テーブルに列が追加された場合でも、ノートブックは引き続き実行できるはずです。 位置指定順序を想定しないでください。
ノートブックをジョブとしてスケジュールする
発行されたほとんどのノートブック ソリューションは、時間単位のベースライン、毎日の異常スキャンなど、スケジュールに従って実行されます。 Sentinel 拡張機能は、保存されたノートブックを、マネージド Spark プールで無人で実行されるスケジュールされたジョブに変換します。
ジョブを作成する
ノートブックをスケジュールされたジョブに変換するには、次の手順を実行します。
- VS Code でノートブックを開きます。
- ノートブックで [スケジュール ジョブの作成 ] を選択し、メッセージが表示されたら [ 既存のノートブックを使用 する] を選択します。
詳細については、「 Jupyter ノートブック ジョブの作成と管理」を参照してください。
ジョブを構成する
スケジュールされたジョブを構成するには、次のフィールドに入力します。
- ノートブックを記述する kebab-case ジョブ名を入力します (例:
failed-signin-baseline-hourly)。 - ジョブの目的と出力テーブルをカバーする 1 文の 説明 を入力します。
- テスト中に検証した Spark プールのサイズ を選択します。 大きなサイズは避けてください。ジョブは、呼び出しごとにこのプールで実行されます。
- [スケジュール] で、手動実行のオンデマンドを選択するか、繰り返し頻度 (分、毎時、毎日、毎週、または毎月) でスケジュールを選択します。
- 送信 を選択して、ジョブを公開します。
ジョブを検証する
送信後、ジョブが正しく実行されていることを確認します。
Sentinel 拡張機能の [ジョブ ] パネルに切り替えると、ジョブが表示されます。
すぐに検証を実行するには、ジョブ >今すぐ実行 を選択します。
実行が完了したら、[ 実行履歴 ] タブに切り替えて、ログとタイミングを調べます。
Important
送信されたジョブは、ローカル .ipynb ファイルから切り離されます。 ローカル ファイルを編集しても、実行中のジョブは更新されません。 ジョブを更新するには、[ジョブ] パネルでジョブを開き>ノートブックをダウンロード>>編集ジョブ>Submit を編集して、更新されたバージョンをアップロードします。
Defender ポータルでジョブを表示する
Microsoft Sentinel>Data lake exploration>Jobs に移動します。 スケジュールを有効または無効にして、ここで実行履歴を表示することはできますが、ポータルからノートブックを編集することはできません。
ノートブック ソリューションをパッケージ化して発行する
ノートブックをテストして具体化したら、顧客への展開用にパッケージ化します。 パッケージ化の詳細な手順については、Microsoft Sentinelグラフおよびノートブック ソリューションのパッケージ化と発行に関するページを参照してください。
Troubleshooting
ノートブックの作成
| 症状 | 考えられる原因と修正 |
|---|---|
MicrosoftSentinelProvider 見つかりません |
拡張機能がサインインしていないか、Spark 以外のカーネルを開いた。 Microsoft Sentinel拡張機能にサインインし、メッセージが表示されたらMicrosoft Sentinelランタイムを選択します。 |
| "Spark セッションを開始しています" でセルがハングする | 最初のセルの起動には 3 ~ 5 分かかります。 6 分後、ステータス バーで仮想コア使用率インジケーターを確認します。プールの容量が不足している可能性があります。 プール サイズを小さくしてみてください。 |
save_as_table 分析レベルでアクセス許可が拒否されて失敗する |
データ レイクのマネージド ID msg-resources-<guid> には、Log Analytics ワークスペースに対する Log Analytics 共同作成者ロールがありません。
前提条件に従って割り当てて再試行します。 |
| [Lake tables]\( レイク テーブル \) パネルに出力テーブルが表示されますが、空です |
.filter()はすべての行を削除した可能性があります。 問題を特定するために、save_as_table の直前に行数の出力を追加します。 |
詳細については、「 ノートブックのトラブルシューティング」を参照してください。
ジョブのスケジューリング
| 症状 | 考えられる原因と修正 |
|---|---|
スケジュールされたジョブに反映されないローカル .ipynb への編集 |
送信されたジョブは、ローカル ファイルから切り離されます。 VS Code からジョブをダウンロードし、編集してから、 ジョブの編集>Submit を使用して新しいバージョンをアップロードします。 |
| ジョブは実行されますが、出力は生成されません | [ジョブ] パネルの [実行履歴] タブを確認します。通常、実行ログには失敗したセルが表示されます。 最も一般的な原因としては、ノートブックが、実行中の ID にアクセス権のないテーブルを読み取ろうとしていることが挙げられます。 |
詳細については、「 ノートブックのトラブルシューティング」を参照してください。