作為 ISV 合作夥伴,您可以建置、測試、包裝並發布 Jupyter 筆記型電腦分析解決方案,並以 SaaS 服務的方式在 Microsoft 安全性 Store 上發布。 Microsoft Sentinel 資料湖支援在受控 Spark 集區上針對大型安全性資料集執行的 Jupyter Notebook。 這些筆記本非常適合用於低速且緩慢的攻擊偵測、行為基線分析、AI/ML 分析、敏感資料路徑映射、資料視覺化,以及傳統 KQL 偵測無法表達的豐富功能。
筆記型電腦平台解決方案通常設計用於歷史分析、複雜的資料轉換及重複的資料處理工作流程。 它會將輸出寫入資料湖中的自訂資料表,讓下游分析規則、搜捕查詢、Security Copilot 代理程式或 MCP 工具能利用筆記本解決方案的結果。 您提交至合作夥伴中心的 .zip 套件會宣告為 SentinelLake 類型,其中包含 Notebook,以及 Notebook 所需下游 Azure 資源的選用 ARM 範本。
本文將帶你了解如何建置、測試、打包,以及將 Microsoft Sentinel 平台筆記本解決方案發佈到 Microsoft 安全性 Store。 完成本指南後,您將獲得:
- 一台可運作的 Jupyter 筆記本,能讀取 Sentinel 資料湖的資料
- 在受控 Spark 集區上執行 Notebook 的排程作業
-
SentinelLake套件 ZIP 檔 (PackageManifest+ Notebook 資料夾) - Microsoft 安全性 Store 中的合作夥伴中心 SaaS 供應項目清單
先決條件
您的租用戶必須上線至 Microsoft Sentinel 資料湖。 請在 Defender 入口網站確認您的入職狀態。 請前往 系統>設定>Microsoft Sentinel>資料湖。 如果您的租用戶已就緒,狀態會顯示為 [已佈建]。 如需上線指示,請參閱上線至 Microsoft Sentinel 資料湖。
所需的權限
| 運作/資源 | 所需角色 |
|---|---|
| 上線至 Sentinel 資料湖 | Microsoft Entra ID - 安全性系統管理員或全域管理員 |
| 將 Sentinel 工作區上線至 Defender 入口網站 | 訂用帳戶範圍的訂用帳戶擁有者或使用者存取系統管理員,以及訂用帳戶或資源群組範圍的 Microsoft Sentinel 參與者 |
| 將 Sentinel 工作區上線至資料湖 | 訂用帳戶或資源群組範圍的訂用帳戶擁有者或 Microsoft Sentinel 參與者 |
| 在資料湖上執行 Notebook | Microsoft Sentinel 閱讀者或貢獻者 |
| Log Analytics 工作區(用於回寫至分析層級) | 指派給資料湖受控識別 msg-resources-<guid> 的 Log Analytics 參與者角色 |
| Microsoft合作夥伴中心 | Marketplace Publisher 帳戶 (一次性使用;與 Security Copilot 發佈所使用的帳戶相同) |
Note
執行一次性的資料湖導入作業時,必須具備訂用帳戶擁有者角色。 使用 Microsoft Entra Privileged Identity Management(PIM)在需要時暫時升格為此角色,完成入職後再移除存取權限。
必要工具
- Visual Studio Code。
- Microsoft Sentinel VS Code extension
- 推薦使用 GitHub Copilot VS Code 擴充功能來加速筆記本撰寫。
- Python 3.10+ 已安裝於本地。 Spark 核心在 Azure 上運行,但 VS Code 需要本地直譯器來編輯 cell。
流程概觀
發佈程序從在本機開發 Notebook 開始,最終建立可在 Microsoft 安全性 Store 中找到的已封裝 SaaS 供應項目。
- 本地筆記本開發(VS Code + Sentinel 擴充功能)
- 以互動方式針對 Sentinel 平台執行
- 使用具代表性的資料進行測試;驗證輸出資料表已填入資料
- 排程為作業 (隨選或排程)
- 封裝為 SentinelLake .zip(PackageManifest.yaml + 資料夾)
- 在 Microsoft Partner Center 建立 SaaS 方案
- 上傳套件、建立元資料、規劃與定價
- 審核與發佈、自動審核、立即上線
- 在 Microsoft 安全性 Store 中上架
安裝 Visual Studio Code 和 Microsoft Sentinel 延伸模組
所有筆記型電腦開發皆在本地 VS Code 進行,並安裝 Microsoft Sentinel 擴充功能。 Spark 核心在 Azure 中運行——VS Code 是編輯器和提交客戶端。
從
https://code.visualstudio.com/下載 Visual Studio Code,並以預設選項安裝。開啟 VS Code >擴充套件 市集(Ctrl+Shift+X 或 Cmd+Shift+X)。
搜尋 Sentinel 並安裝 Microsoft Sentinel 擴充功能(publisher:
ms-security)。安裝完成後,Microsoft Sentinel 圖示會出現在左側工具列。
(推薦)在市集搜尋 GitHub Copilot,安裝它,並在提示時登入 GitHub。
Copilot 了解
MicrosoftSentinelProviderAPI,並會自動完成 PySpark 轉換作業。在左側工具列選擇 Microsoft Sentinel 圖示。
核准登入對話方塊,然後選取在工作區中具有 Sentinel 讀取者/參與者角色的帳戶。
左側窗格會顯示 [資料湖資料表] 和 [作業],表示延伸模組已成功連線至資料湖。
Caution
如果您已登入多個來賓租用戶,在 VS Code 左下角切換帳戶會終止所有作用中的 PySpark 工作階段;切換後必須重新啟動核心。 請安排在兩次執行之間切換帳戶,不要在執行期間切換。
開發你的筆記本
筆記本採用以下撰寫模式:
- 將資料湖資料表讀取至 Spark DataFrame
- 使用 PySpark 進行轉換
- 可選擇性地加入外部資料
- 將結果寫入一個 Sentinel 可以使用的自訂資料表
探索 [資料湖資料表] 面板
要辨識筆記本使用的輸入表,請瀏覽 Lake 表格面板:
- 選擇哨兵圖示並展開 湖泊表格。
- 表格依資料庫與類別(系統、自訂、聯邦)分組。 選擇任一表格以查看其欄位定義與類型。
- 找出筆記本讀取的輸入表,並記下確切名稱。
建立新的筆記本
要為你的解決方案建立新的 Jupyter 筆記本,請完成以下步驟:
按 Ctrl+Shift+P / Cmd+Shift+P> 輸入「建立新 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)
選取執行階段集區並執行儲存格
若要針對資料湖執行此儲存格,請選取一個集區並提交:
第一次執行需要 3 至 5 分鐘才能啟動 Spark 工作階段。 後續的儲存格會在幾秒內執行完畢。
轉換並寫回自訂資料表
此 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 | 何時使用它 |
|---|---|
| 基準線 + 漂移 | 計算每位使用者或每台主機的正常行為基準;標示偏離基準的資料列。 Classic 用於登入失敗與程序執行分析。 |
| 跨資料表聯結 | 使用共用實體 (UPN、主機、IP),將您擁有的資料湖資料表與內建資料表 (SigninLogs、SecurityAlert、DeviceProcessEvents) 聯結。 |
| ML 計分 | 在筆記本中訓練或載入預訓練模型;每行計分;將頂N列的風險列寫入自訂輸出表以供下游警示。 |
| 視覺調查 | 使用 matplotlib 或 plotly 繪製時間軸、熱力圖與過程樹;將筆記本匯出成 HTML 以便交接。 |
Tip
大量使用 markdown 儲存格來記錄你的程式碼。 Security Store 的審查員——以及負責管理你筆記本的 SOC 分析師——需要在不讀程式碼的情況下,了解每個區塊的功能。 在每個程式碼區塊上方放置一個標記格,說明目的、輸入、輸出和預期輸出。 如果 Notebook 內容不清楚,檢閱者會直接判定為不合格。
測試筆記型電腦
測試需要證明筆記本能在真實數據上端到端運行,並產生可用的輸出表。
小泳池的煙霧測試
請將筆記本從頭到尾執行一遍,確認每個儲存格都能順利完成且沒有錯誤:
- 重新啟動核心以清除任何過時狀態。
- 從上到下執行所有儲存格——每個儲存格都必須在不發生錯誤的情況下完成執行。
如果某個轉換單元在 Small 下執行時間超過 5 分鐘,表示你的輸入篩選條件過於寬鬆。 在擴大規模之前,請先縮小日期範圍或欄位投影。
驗證輸出表
確認輸出表已建立並包含預期資料:
- 在 Sentinel 擴充套件的 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)
在中型或大型集區上進行規模測試
確認 Notebook 在較大的集區大小下會產生一致的結果:
- 在中型集區上重新執行 Notebook (如果資料集的規模有此需要,也請在大型集區上重新執行)。
- 確認列數和欄位分布是否與小批量相符。 如果它們出現分歧,表示存在需要進一步調查的非決定性轉換。
測試極端情況
- 空輸入:指向一個沒有列的表格或日期範圍。 Notebook 應正常處理失敗或寫入空白輸出,而不應當機。
- 結構描述漂移:如果輸入資料表新增資料行,Notebook 仍應能執行。 絕不要假設位置順序。
將 Notebook 排程為作業
大多數已發布的 Notebook 解決方案都是依排程執行,例如每小時執行基準作業、每日進行異常掃描等等。 Sentinel 擴充功能會將任何已儲存的筆記本轉換為可在受控 Spark 集區上無人值守執行的排程作業。
建立作業
要將筆記本轉換成排程工作,請完成以下步驟:
- 在 VS Code 中開啟筆記本。
- 在筆記本中選擇 建立排程工作 ,然後在提示時選擇 使用現有筆記本 。
如需詳細資訊,請參閱 建立和管理 Jupyter 筆記本任務。
設定作業
要設定排程工作,請填寫以下欄位:
- 輸入採用 kebab-case 格式且能描述 Notebook 的作業名稱 (例如
failed-signin-baseline-hourly)。 - 輸入一句話的 說明 ,涵蓋工作的目的與產出表。
- 選擇你在測試時驗證過的 Spark 池大小 。 請勿選用過大的集區,因為每次叫用作業時,都會在此集區上執行。
- 對於 排程,若要手動執行,請選擇 隨選;或者選擇 已排程,並設定重複頻率(每分鐘、每小時、每日、每週或每月)。
- 選擇 提交 以發佈職缺。
驗證作業
提交後,請確認工作是否正確執行:
Important
提交的工作會與你本地 .ipynb 檔案解耦。 編輯本地檔案並不會更新執行中的任務。 若要更新作業:在 [作業] 面板中開啟作業 > [>下載 Notebook>] 編輯 [>編輯作業>提交],以上傳更新後的版本。
請在 Defender 入口網站查看職缺
瀏覽至 [Microsoft Sentinel>資料湖探索>作業]。 你可以在這裡啟用或停用排程並查看運行歷史,但無法從入口網站編輯筆記本。
打包並發布你的筆記本解決方案
一旦你的筆記本測試完成並實體化,就打包後部署給客戶。 如需詳細的打包說明,請參閱「打包並發佈 Microsoft Sentinel 圖形與筆記本解決方案」。
故障排除
筆記本編寫
| 症狀 | 可能的原因與解決方法 |
|---|---|
MicrosoftSentinelProvider 未找到 |
擴充功能未登入,或是你開啟了非 Spark 核心。 登入 Microsoft Sentinel 擴充功能,並在提示時選擇 Microsoft Sentinel 執行環境。 |
| 儲存格停滯於「正在啟動 Spark 工作階段」 | 首次啟動需要 3 到 5 分鐘。 6分鐘後,請查看狀態列中的vCore使用率指示器——你的泳池可能已滿。 試試小一點的泳池。 |
save_as_table 在分析層因權限遭拒而失敗 |
資料湖受控身分識別msg-resources-<guid>在記錄分析工作區沒有記錄分析參與者。 依據 先決條件 指派,然後重試。 |
| 輸出表會出現在 湖表 面板,但是空的 |
.filter() 很可能移除了所有列。 在 save_as_table 前面緊接著新增資料列計數輸出,以找出問題所在。 |
更多資訊請參見 Notebooks 故障排除。
工作排程
| 症狀 | 可能的原因與解決方法 |
|---|---|
對本地 .ipynb 的編輯未反映在排程工作中 |
提交的工作會與本地檔案解耦。 從 VS Code 下載工作,編輯後再用編輯工作>提交上傳新版本。 |
| 作業執行但未產生任何輸出 | 請查看工作面板中的 「執行歷史」 標籤——執行日誌通常 會 顯示失敗的儲存格。 最常見的原因是 Notebook 從執行身分無權存取的資料表讀取資料。 |
更多資訊請參見 Notebooks 故障排除。