Microsoft Sentinel用のノートブック ソリューションを開発する

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 オファーにローカル ノートブック開発を移行することから始まります。

  1. ローカル ノートブック開発 (VS Code + Sentinel 拡張機能)
  2. Sentinel プラットフォームに対して対話形式で実行する
  3. 代表的なデータでテストし、出力テーブルに正しく入力されていることを検証する
  4. ジョブとしてのスケジュール (オンデマンドまたはスケジュール済み)
  5. SentinelLake .zip としてパッケージ化 (PackageManifest.yaml + folder)
  6. Microsoft Partner Centerで SaaS オファーを作成する
  7. パッケージのアップロード、メタデータの作成、計画、および価格
  8. レビューと発行、自動レビュー、運用開始
  9. Microsoft Security ストアでのライブ

Visual Studio Code と Microsoft Sentinel 拡張機能をインストールする

すべてのノートブック開発は、Microsoft Sentinel拡張機能がインストールされた VS Code でローカルに行われます。 Spark カーネルはAzureで実行されます。VS Code はエディターおよび申請クライアントです。

  1. https://code.visualstudio.com/からVisual Studio Codeをダウンロードし、既定のオプションでインストールします。

  2. VS Code >Extensions Marketplace を開きます (Ctrl + Shift + X または Cmd + Shift + X)。

  3. Sentinel を検索し、Microsoft Sentinel拡張機能 (publisher: ms-security) をインストールします。

    インストール後、左側のツール バーにMicrosoft Sentinel アイコンが表示されます。

  4. (推奨)マーケットプレースでGitHub Copilotを検索してインストールし、メッセージが表示されたらGitHubにサインインします。

    Copilot は MicrosoftSentinelProvider API を理解し、PySpark の変換を自動補完します。

  5. 左側のツール バーのMicrosoft Sentinel アイコンを選択します。

  6. サインイン ダイアログを承認し、ワークスペースで Sentinel 閲覧者/共同作成者を持つアカウントを選択します。

左側のウィンドウには 、Lake テーブル と ジョブが表示され、拡張機能が Data Lake に到達したことを確認します。

Microsoft Sentinel VS Code 拡張機能のスクリーンショット。Lake のテーブル、ジョブ、グラフのセクションが表示されています。

Caution

複数のゲスト テナントがサインインしている場合、VS Code の左下にあるアカウントを切り替えると、アクティブな PySpark セッションが強制終了します。切り替えた後にカーネルを再起動する必要があります。 プラン アカウントは、実行中ではなく、実行と実行の間で切り替わります。

ノートブックを開発する

ノートブックでは、次の作成パターンが使用されます。

  • Spark DataFrame への Data Lake テーブルの読み取り
  • PySpark を使用した変換
  • 必要に応じて外部データを使用してエンリッチする
  • Sentinel で使用できるカスタム テーブルに結果を書き込む

Lake テーブル パネルを確認する

ノートブックで使用する入力テーブルを識別するには、[Lake tables]\(レイク テーブル\) パネルを調べます。

  1. Sentinel アイコンを選択し、 Lake テーブルを展開します。
  2. テーブルは、データベースとカテゴリ (システム、カスタム、フェデレーション) ごとにグループ化されます。 任意のテーブルを選択すると、その列の定義と型が表示されます。
  3. ノートブックが読み取る入力テーブルを特定し、正確な名前をメモします。

新しいノートブックを作成する

ソリューションの新しい Jupyter Notebook を作成するには、次の手順を実行します。

  1. Ctrl+Shift+P / Cmd+Shift+P>を押して Create New Jupyter Notebook と入力するか、ファイル>新しいファイル>Jupyter Notebook を選択します。

    [新規作成] Jupyter Notebook コマンドを示す VS Code のスクリーンショット。

  2. わかりやすい名前 ( 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)

ランタイム プールを選択してセルを実行する

データ レイクに対してセルを実行するには、プールを選択して送信します。

  1. セル上の Run の三角形を選択します。

  2. メッセージが表示されたら、ランタイムとしてMicrosoft Sentinelを選択します。

    ランタイムの選択を示す VS Code のスクリーンショット。

  3. プールサイズを選択します: 探索には 小、変換には 中、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 アナリストは、コードを読まずに各セクションの機能を理解する必要があります。 目的、入力、出力、予想される出力を説明するすべてのコード ブロックの上にマークダウン セルを配置します。 レビュアーは、内容が不明確なノートブックは即不合格と見なします。

ノートブックをテストする

テストでは、ノートブックが現実的なデータで最初から最後まで正常に実行され、実用的な出力テーブルを生成することを実証する必要があります。

小規模プールでのスモーク テスト

ノートブックをエンドツーエンドで実行して、すべてのセルがエラーなしで完了することを確認します。

  1. カーネルを再起動して、古い状態をクリアします。
  2. すべてのセルを上から下に実行します。すべてのセルはエラーなしで完了する必要があります。

変換セルが Small で 5 分を超える場合、入力フィルターが緩すぎます。 スケールアップする前に、日付範囲または選択する列を絞り込んでください。

出力テーブルを検証する

出力テーブルが作成され、予想されるデータが含まれていることを確認します。

  1. Sentinel 拡張機能の [Lake tables ]\(Lake テーブル\) パネルで、出力テーブルが予想されるスキーマと共に表示されたことを更新して確認します。
  2. 検証セルを実行します。
verify_df = data_provider.read_table("EntraGroups_Processed_SPRK")
print("Row count:", verify_df.count())
verify_df.printSchema()
verify_df.show(5, truncate=False)

中または大のプールでのスケール テスト

ノートブックが、より大きなプールサイズでも一貫性のある結果を生成することを確認します。

  1. ノートブックを Medium で再実行してください(データセットの規模に応じて必要であれば Large でも)。
  2. 行数と列の分布が Small run と一致するようにします。 それらが分岐する場合は、調査を必要とする非決定論的な変換があります。

エッジケースをテストする

  • 空の入力: 0 行のテーブルまたは日付範囲をポイントします。 ノートブックは、クラッシュするのではなく、適切に失敗するか、空の出力を書き込む必要があります。
  • スキーマ ドリフト: 入力テーブルに列が追加された場合でも、ノートブックは引き続き実行できるはずです。 位置指定順序を想定しないでください。

ノートブックをジョブとしてスケジュールする

発行されたほとんどのノートブック ソリューションは、時間単位のベースライン、毎日の異常スキャンなど、スケジュールに従って実行されます。 Sentinel 拡張機能は、保存されたノートブックを、マネージド Spark プールで無人で実行されるスケジュールされたジョブに変換します。

ジョブを作成する

ノートブックをスケジュールされたジョブに変換するには、次の手順を実行します。

  1. VS Code でノートブックを開きます。
  2. ノートブックで [スケジュール ジョブの作成 ] を選択し、メッセージが表示されたら [ 既存のノートブックを使用 する] を選択します。

詳細については、「 Jupyter ノートブック ジョブの作成と管理」を参照してください。

ノートブックでスケジュールされたジョブを作成する方法を示すスクリーンショット。

ジョブを構成する

スケジュールされたジョブを構成するには、次のフィールドに入力します。

  1. ノートブックを記述する kebab-case ジョブ名を入力します (例: failed-signin-baseline-hourly)。
  2. ジョブの目的と出力テーブルをカバーする 1 文の 説明 を入力します。
  3. テスト中に検証した Spark プールのサイズ を選択します。 大きなサイズは避けてください。ジョブは、呼び出しごとにこのプールで実行されます。
  4. [スケジュール] で、手動実行のオンデマンドを選択するか、繰り返し頻度 (分、毎時、毎日、毎週、または毎月) でスケジュールを選択します。
  5. 送信 を選択して、ジョブを公開します。

ジョブを検証する

送信後、ジョブが正しく実行されていることを確認します。

  1. Sentinel 拡張機能の [ジョブ ] パネルに切り替えると、ジョブが表示されます。

  2. すぐに検証を実行するには、ジョブ >今すぐ実行 を選択します。

  3. ノートブック ジョブをすぐに実行する方法を示すスクリーンショット。

  4. 実行が完了したら、[ 実行履歴 ] タブに切り替えて、ログとタイミングを調べます。

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 にアクセス権のないテーブルを読み取ろうとしていることが挙げられます。

詳細については、「 ノートブックのトラブルシューティング」を参照してください。