你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Microsoft Sentinel data lake 上运行笔记本

Jupyter 笔记本提供了一个交互式环境,用于浏览、分析和可视化 Microsoft Sentinel 数据湖中的数据。 使用笔记本,可以编写和执行代码、记录工作流和查看结果,所有这些作都位于一个位置。 这样可以轻松执行数据浏览、构建高级分析解决方案,并与其他人共享见解。 通过利用 Visual Studio Code 中的 Python 和 Apache Spark,笔记本可帮助你将原始安全数据转换为可作的智能。

本文介绍如何在 Visual Studio Code 中使用 Jupyter 笔记本浏览和与 Data Lake 数据交互。

先决条件

加入到 Microsoft Sentinel 数据湖

要在 Microsoft Sentinel 数据湖中使用 Notebooks,必须先载入到数据湖中。 如果尚未加入 Sentinel 数据湖,请参阅加入 Microsoft Sentinel 数据湖。 如果最近加入过数据湖,则可能需要一些时间才能引入足够的数据量,随后才能使用 Notebooks 来创建有意义的分析。

权限

Microsoft Entra ID 角色提供对数据湖中所有工作区的广泛访问权限。 或者,可以使用 Azure RBAC 角色授予对单个工作区的访问权限。 对 Microsoft Sentinel 工作区拥有 Azure RBAC 权限的用户可以对数据湖层中的这些工作区运行 Notebooks。 有关详细信息,请参阅 Microsoft Sentinel 中的角色和权限

若要在分析层中创建新的自定义表,必须在 Log Analytics 工作区中为 Data Lake 托管标识分配 Log Analytics 参与者 角色。

若要分配角色,请执行以下步骤:

  1. 在 Azure 门户中,导航到要向其分配角色的 Log Analytics 工作区。
  2. 在左侧导航窗格中,选择“访问控制 (IAM)”
  3. 选择“添加角色分配”。
  4. “角色”表中,选择“Log Analytics 参与者”,然后选择“下一步
  5. 选择 托管标识,然后选择 选择成员
  6. 数据湖托管标识是一个系统分配的托管标识,其名称为 msg-resources-<guid>。 选择托管身份,然后选择 选择
  7. 选择“查看并分配”

有关给托管标识分配角色的详细信息,请参阅 使用 Azure 门户分配 Azure 角色

安装 Visual Studio Code 和 Microsoft Sentinel 扩展

如果还没有 Visual Studio Code,请下载并安装 Visual Studio Code for MacLinuxWindows

Visual Studio Code 的 Microsoft Sentinel 扩展(VS Code)是从扩展市场安装的。 若要安装扩展,请执行以下步骤:

  1. 在左侧工具栏中选择“扩展市场”。
  2. 搜索 Sentinel
  3. 选择 Microsoft Sentinel 扩展,然后选择“ 安装”。
  4. 安装扩展后,Microsoft Sentinel 盾牌图标将显示在左侧工具栏中。

显示扩展市场位置的屏幕截图。

安装用于 Visual Studio Code 的 GitHub Copilot 扩展,以便在 Notebooks 中启用代码补充和建议。

  1. 在扩展市场中搜索 GitHub Copilot 并安装它。
  2. 安装后,使用 GitHub 帐户登录到 GitHub Copilot。

浏览 Data Lake 层表

安装 Microsoft Sentinel 扩展后,可以开始浏览 Data Lake 层表并创建 Jupyter 笔记本来分析数据。

登录到 Microsoft Sentinel 扩展

  1. 在左侧工具栏中选择Microsoft Sentinel 盾牌图标。

  2. 此时将显示一个对话框,显示以下文本 扩展程序“Microsoft Sentinel”想要使用 Microsoft 进行登录。 选择“允许”

    显示登录对话框的屏幕截图。

  3. 选择帐户名称以完成登录。

    显示页面顶部的帐户选择列表的屏幕截图。

查看数据湖表和作业

登录后,Sentinel 扩展会在左侧窗格中显示包含“数据湖表”和“作业”的列表。 表按数据库和类别进行分组。 选择一个表以查看列定义。

有关作业的信息,请参阅 作业和计划

显示表、作业和所选表元数据列表的屏幕截图。

创建新笔记本

  1. 若要创建新笔记本,请使用以下方法之一。

  2. 在搜索框中输入 > 或按 Ctrl+Shift+P ,然后输入 “新建 Jupyter Notebook”。 显示如何从搜索栏中创建新笔记本的屏幕截图。

  3. 选择“文件 > 新建文件”,然后从下拉列表中选择 Jupyter Notebook
    展示如何从文件菜单创建新笔记本的屏幕截图。

  4. 在新笔记本中,将以下代码粘贴到第一个单元格中。

    from sentinel_lake.providers import MicrosoftSentinelProvider
    data_provider = MicrosoftSentinelProvider(spark)
    
    table_name = "EntraGroups"  
    df = data_provider.read_table(table_name)  
    df.select("displayName", "groupTypes", "mail", "mailNickname", "description", "tenantId").show(100,   truncate=False)  
    

该编辑器为数据湖中的 MicrosoftSentinelProvider 类和表名提供 Intellisense 代码补全功能。

  1. 选择 运行 三角形以执行笔记本中的代码。 结果显示在代码单元格下方的输出窗格中。
    显示如何运行 Notebook 单元格的屏幕截图。

  2. 从运行时池列表列表中选择 Microsoft Sentinel 显示运行时选取器的屏幕截图。

  3. 选择 “中等 ”以在中型运行时池中运行笔记本。 有关不同运行时的详细信息,请参阅 选择相应的Microsoft Sentinel 运行时 显示运行池大小选取器的屏幕截图。

注释

选择内核将启动 Spark 会话,并在笔记本中运行代码。 选择池后,可能需要 3-5 分钟才能开始会话。 后续因为会话已处于活动状态,所以运行速度会更快。

启动会话后,笔记本中的代码将运行,结果显示在代码单元格下方的输出窗格中,例如: 显示运行笔记本单元格的结果的屏幕截图。

有关演示如何与 Microsoft Sentinel data lake 交互的示例笔记本,请参阅 Microsoft Sentinel data lake 的示例笔记本

状态栏

笔记本底部的状态栏提供有关笔记本和 Spark 会话的当前状态的信息。 状态栏包含以下信息:

  • 所选 Spark 池的 vCore 利用率百分比。 将鼠标悬停在百分比上以查看使用的 vCore 数和池中可用的 vCore 总数。 百分比表示已登录帐户的交互工作负载和作业负载的当前使用情况。

  • Spark 会话的连接状态,例如 ConnectingConnectedNot Connected

显示笔记本底部的状态栏的屏幕截图。

设置会话超时

可以为交互式笔记本设置会话超时和超时警告。 若要更改超时,请在笔记本底部的状态栏中选择连接状态。 从以下选项中进行选择:

  • 设置会话超时期限:设置会话超时前以分钟为单位的时间。默认值为 30 分钟。

  • 重置会话超时期限:将会话超时重置为默认值 30 分钟。

  • 设置会话超时警告期限:设置显示会话即将超时的超时时间(以分钟为单位)。默认值为 5 分钟。

  • 重置会话超时警告期限:将会话超时警告重置为默认值 5 分钟。

    显示会话超时设置的屏幕截图。

在笔记本中使用 GitHub Copilot

使用 GitHub Copilot 帮助在笔记本中编写代码。 GitHub Copilot 根据代码的上下文提供代码建议和自动完成。 若要使用 GitHub Copilot,请确保已在 Visual Studio Code 中安装了 GitHub Copilot 扩展

Microsoft Sentinel 数据湖 示例笔记本复制代码,并将其保存在你的笔记本文件夹中,为 GitHub Copilot 提供上下文。 然后,GitHub Copilot 可以根据笔记本的上下文建议代码补全。

以下示例演示 GitHub Copilot 生成代码审查。

显示 GitHub Copilot 生成代码评审的屏幕截图。

Microsoft Sentinel 提供程序类

若要连接到 Microsoft Sentinel 数据湖,请使用类 SentinelLakeProvider 。 此类是 access_module.data_loader 模块的一部分,并提供与数据湖交互的方法。 若要使用此类,请导入它并使用会话创建类 spark 的实例。

from sentinel_lake.providers import MicrosoftSentinelProvider
data_provider = MicrosoftSentinelProvider(spark)

有关可用方法的详细信息,请参阅 Microsoft Sentinel Provider 类参考

选择适当的运行时池

可以使用三个运行时池在 Microsoft Sentinel 扩展中运行 Jupyter 笔记本。 每个池专为不同的工作负荷和性能要求而设计。 运行时池的选择会影响 Spark 作业的性能、成本和执行时间。

运行时池 建议的用例 特征
小型 开发、测试和轻量级探索分析。
进行简单转换的小型工作负荷。
成本效率优先。
适用于小型工作负荷
简单转换。
成本更低,执行时间更长。
中等 ETL 作业,包括联接、聚合以及机器学习模型训练。
进行复杂转换的中等工作负荷。
改进了小型的性能。
处理并行和中等内存密集型操作。
大型 深度学习和 ML 工作负载。
大规模的数据交换、大型联接或实时处理。
关键的执行时间。
高内存和计算能力。
最小延迟。
最适合处理大型、复杂或对时间敏感的工作负载。

注释

首次访问时,内核选项可能需要大约 30 秒才能加载。
选择运行时池后,会话启动可能需要 3-5 分钟。

查看消息、日志和错误

消息日志和错误消息显示在 Visual Studio Code 的三个区域中。

  1. 输出窗格。

    1. 在“ 输出 ”窗格中,从下拉列表中选择 Microsoft Sentinel
    2. 选择 “调试” 以包含详细的日志条目。

    显示输出窗格的屏幕截图。

  2. 笔记本中的嵌入式消息提供有关代码单元执行的反馈和信息。 这些消息包括与上述单元格中的代码相关的执行状态更新、进度指示器和错误通知

  3. Visual Studio Code 右下角的通知弹出窗口(也称为 toast 消息)提供有关笔记本中和 Spark 会话中操作状态的实时警报和更新。 这些通知包括消息、警告和错误警报,例如成功连接到 Spark 会话和超时警告。

    显示 Toast 消息和内联错误消息的屏幕截图。

作业和调度

可以使用适用于 Visual Studio Code 的 Microsoft Sentinel 扩展来安排作业,以在特定时间点或以特定时间间隔运行。 作业允许自动执行数据处理任务,以汇总、转换或分析 Microsoft Sentinel 数据湖中的数据。 作业还用于处理数据并将结果写入数据湖层或分析层中的自定义表中。 有关创建和管理作业的详细信息,请参阅 创建和管理 Jupyter 笔记本作业

VS Code Notebook 的服务参数和限制

以下部分列出了使用 VS Code Notebook 时Microsoft Sentinel Data Lake 的服务参数和限制。

类别 参数/限制
分析层中的自定义表 无法从笔记本中删除分析层中的自定义表;使用 Log Analytics 删除这些表。 有关详细信息,请参阅 Azure Monitor 日志中的添加或删除表和列
网关 Web 套接字超时 2 小时
交互式查询超时 2 小时
交互式会话非活动超时 20 分钟
语言 Python
笔记本作业超时 8 小时
最大并发笔记本作业数 3,后续作业已排队
交互式查询的最大并发用户数 大型池上的 8-10
会话启动时间 Spark 计算会话大约需要 5-6 分钟才能启动。 可以在 VS Code Notebook 底部查看会话的状态。
支持的库 仅支持 Azure Synapse 库 3.4 和用于抽象函数的 Microsoft Sentinel 提供程序库来查询数据湖。 不支持 Pip 安装或自定义库。
VS Code UX 的记录显示限制 100,000 行

故障排除

下表列出了使用笔记本时可能会遇到的常见错误、其根本原因和建议的作来解决它们。

错误类别 错误名称 错误代码 错误消息 建议的操作
DatabaseError 数据库未找到 2001 找不到数据库 {DatabaseName}。 验证数据库是否存在。 如果数据库为新数据库,请等待元数据刷新。
DatabaseError 模糊数据库名称 2002 多个数据库(ID:{DatabaseID1}、{DatabaseID2}、...)共享名称 {DatabaseName}。 提供特定的数据库 ID。 当多个数据库具有相同名称时,请指定数据库 ID。
DatabaseError 数据库ID不匹配 2003 找不到数据库 ({DatabaseName}, ID {DatabaseID})。 检查数据库名称和 ID。 若要获取数据库 ID,请列出所有数据库。
DatabaseError ListDatabasesFailure(列出数据库失败) 2004 无法提取数据库。 重启会话,然后重试。 重启会话,并稍后重试该操作。
表错误 TableDoesNotExist 2100年 在数据库 {DatabaseName} 中找不到表 {TableName}。 验证该表是否存在于数据库中。 如果表或数据库是新的,请等待几分钟,然后重试。
表错误 配置未完成 2101 表 {TableName} 尚未准备就绪。 请等待几分钟后重试。 此表正在进行预配。 请等待几分钟后重试。
表错误 DeltaTableMissing 2102 表 {TableName} 为空。 新表可能需要几个小时才能准备就绪。 可能需要几个小时才能将分析表完全同步到数据湖中。 对于仅位于 Data Lake 中的表,请检查数据是否需要加载或还原。
表错误 表不存在,无法删除 2103 无法删除表。 找不到表 {TableName}。 验证该表是否存在于数据库中。 如果表或数据库是新的,请等待几分钟,然后重试。
AuthorizationFailure 缺少SAS令牌 (MissingSASToken) 2201 无法访问表。 重启会话,然后重试。 尝试获取表的访问令牌时,授权失败。 重启会话,然后重试。
AuthorizationFailure InvalidSASToken 2202 无法访问表。 重启会话,然后重试。 尝试获取表的访问令牌时,授权失败。 重启会话,然后重试。
AuthorizationFailure 令牌过期 2203 无法访问表。 重启会话,然后重试。 尝试获取表的访问令牌时,授权失败。 重启会话,然后重试。
AuthorizationFailure TableInsufficientPermissions 2204 数据库 {DatabaseName} 中表 {TableName} 所需的访问权限。 请联系管理员请求访问表或数据库(工作区)。
AuthorizationFailure 内部表访问被拒绝 2205 对表 {TableName} 的访问受到限制。 只能从笔记本访问系统或用户定义的表。
AuthorizationFailure 表授权失败 2206 无法将数据保存到表中。 重启会话,然后重试。 尝试将数据保存到表时,授权失败。 重启会话,然后重试。
配置错误(ConfigurationError) HadoopConfigFailure 2301 无法更新会话配置。 重启会话,然后重试。 此问题是暂时性的,可以通过重启会话并重试来解决。 如果此问题仍然存在,请联系支持人员。
DataError JSON解析失败 2302 表元数据已损坏。 请与支持部门联系获取帮助。 请与支持部门联系获取帮助。 提供租户 ID、表名称和数据库名称。
TableSchemaError TableSchemaMismatch 2401 目标表中未找到列。 将 DataFrame 架构与目标表对齐,或者使用覆盖模式。 更新 DataFrame 架构以匹配目标数据库中的表。 在覆盖模式下,你还可以完全替换该表。
TableSchemaError MissingRequiredColumns 2402 DataFrame 中缺少列 {ColumnName}。 检查 DataFrame 架构,并将其与目标表保持一致。 更新 DataFrame 架构以匹配目标数据库中的表。 在覆盖模式下,你还可以完全替换该表。
TableSchemaError 不允许更改列类型 2403 无法更改列 {ColumnName} 的数据类型。 不允许对列更改数据类型。 检查目标表中的现有列,并对齐 DataFrame 中的所有数据类型。
TableSchemaError ColumnNullabilityChangeNotAllowed 2404 无法更改列 {ColumnName} 的可为 null 性。 无法更新列的可为空性设置。 检查目标表,并将设置与 DataFrame 对齐。
IngestionError 文件夹创建失败 2501 无法为表 {TableName} 创建存储。 此问题是暂时性的,可以通过重启会话并重试来解决。 如果此问题仍然存在,请联系支持人员。
IngestionError 子任务请求失败 2502 无法为表 {TableName} 创建引入作业。 此问题是暂时性的,可以通过重启会话并重试来解决。 如果此问题仍然存在,请联系支持人员。
IngestionError 子任务创建失败 2503 无法为表 {TableName} 创建引入作业。 此问题是暂时性的,可以通过重启会话并重试来解决。 如果此问题仍然存在,请联系支持人员。
InputError 无效写入模式 2601 写入模式无效。 使用追加或覆盖。 保存数据帧之前,请指定有效的写入模式(追加或覆盖)。
InputError 不允许分区 2602 无法对分析表进行分区。 删除分析表中所有列的任何分区。
InputError MissingTableSuffixLake 2603 自定义表名称无效。 Data Lake 中自定义表的所有名称都必须以_SPRK结尾。 将_SPRK作为后缀添加到表名称,然后再将其写入 Data Lake。
InputError MissingTableSuffixLA 2604 自定义表名称无效。 自定义分析表的所有名称都必须以_SPRK_CL结尾。 将_SPRK_CL作为后缀添加到表名称,然后再将其写入分析存储。
未知错误 内部服务器错误 2901 出现错误。 重启会话,然后重试。 此问题是暂时性的,可以通过重启会话并重试来解决。 如果此问题仍然存在,请联系支持人员。