Fabric Spark 安全性

建立受控的执行环境,控制数据出口,并在启用安全机密访问时强制实施最低特权。

托管私有终结点(MPE)

场景:你是在 Fabric Spark 中处理敏感数据的数据工程师。 安全团队要求在网络隔离环境中运行所有代码,以提高安全性。
  • 启用托管虚拟网络(VNet)。 若要启用托管 VNet,请参阅 公共文档。 Microsoft Fabric 为每个 Fabric 工作区创建和管理 托管虚拟网络 (VNet)。 它们为 Fabric Spark 工作负载提供网络隔离,这意味着Microsoft Fabric 在每个工作区的专用网络中部署计算群集,并将其从共享虚拟网络中删除。

  • 在生产环境中,使用托管 VNet 安全地执行 Spark Notebook。

  • 创建托管专用终结点(MPE)时,默认情况下会在工作区级别创建该终结点。

  • 在租户级别启用专用链接(PL)时,系统会为租户中的所有工作区启用托管 VNet。 启用 PL 设置后,系统会在运行第一个 Spark 作业(Notebook 或 Spark 作业定义)时为工作区创建托管虚拟网络。 系统在执行与 Lakehouse 相关的操作时,例如加载到表或进行表维护操作(优化或清理),也会创建虚拟网络。

注释

启用托管 VNet 时,初学者池将变得不可用,因为它们在共享网络中运行。

工作区出站访问保护 (WS OAP)

场景:你担心有人可能会意外地使用 Spark 笔记本将生产数据写出到未经授权的目标,并且你希望控制这些数据。

启用工作区出站访问保护(WS OAP)。 这可确保 Spark 的出站互联网连接只能通过托管专用终结点到达已批准的目标。 

  • 阻止公共库:这也会阻止从 PyPi、Maven 等安装公共库。 因此,需要将库打包为 JAR 或 Wheel 文件,并将自定义库上传到环境或资源中,然后在 Notebooks 中使用 %pip install 命令进行安装。 需要注意的一点是,如果将它添加到资源并使用内联 %pip 安装进行安装,则环境发布时间会减少。 这对于快速开发和测试非常有用。 若要在各种笔记本中重复使用包,建议发布到环境。 另一种方法是连接到专用存储库。 有关更多详细信息,请参阅 工作区出站访问保护的数据工程工作负载文档
方案:是否应在开发环境中启用 WS OAP?

请考虑不要在开发或更低工作区中打开 WS OAP,因为它会影响开发过程。 使用公共库测试完笔记本或 Spark 作业定义(SJD)后,再用自定义库测试同一个笔记本。 在进行适当的代码评审后,部署到较高环境,然后打开 WS OAP。 如果想要保护即使是开发环境,也可以启用 WS OAP,但它可能会阻碍开发过程。 启用 WS OAP 时,初学者池不可用。

从 Notebook 访问 Azure Key Vault (AKV)

方案:你是数据工程师,想要使用 Spark Notebook 中的安全凭据连接到多个数据源。

将凭据安全地存储在 Azure Key Vault 中(AKV)。 不要保留单个密钥保管库来存储所有机密。 相反,请根据项目/域使用多个密钥保管库(如果可能)。

从 Notebook 访问 Azure Key Vault (AKV)

  • 网络: 建议使用防火墙规则保护 AKV,以便仅允许从已知网络进行访问。 但是,可以在防火墙规则中允许 Fabric Spark 的 IP 地址。 若要安全地从 Fabric Spark Notebook 连接到受保护的 Azure 密钥保管库 (AKV),我们建议创建一个至 AKV 的托管专用终结点。 一个 AKV 最多只能支持 64 个专用终结点(Azure 订阅和服务限制、配额和约束)。 

  • 认证: 系统在提交作业/笔记本的用户的上下文中执行 Fabric Spark Notebook 和 SJD。 若要访问 AKV,提交用户应有足够的访问权限来检索机密(“Key Vault 机密官员”)。 请参阅 AKV 最佳做法: 向应用程序授予使用 Azure RBAC 访问 Azure 密钥保管库的权限

    • 可以使用 notebookutils(以前称为 mssparkutils),通过运行 Notebook/SJD 用户的凭据来访问 AKV。

    notebookutils.credentials.getSecret('<AKV URL>', 'Secret Name')

  • 在生产环境中,我们不建议在生产环境中提供对 AKV 的用户访问权限。 而是使用服务帐户访问 Key Vault(KV)。 使用服务帐户提交笔记本/作业。 

  • 在某些情况下,提交作业的服务帐户有权从 AKV 读取机密。 

  • 在某些情况下,该服务帐户通常是一个 DevOps 帐户,可能无法访问 AKV 中的机密信息。 在这种情况下,凭据创建器有助于通过不同的服务主体名称(SPN)访问 Azure Key Vault(AKV)。

下面是示例 Scala 代码片段:

val clientSecretCredential: ClientSecretCredential = new ClientSecretCredentialBuilder()
  .clientId("<client id here>")
  .clientSecret("<client secret here>")
  .tenantId("<tenant id here>")
  .build()

val secretClient: SecretClient = new SecretClientBuilder()
  .vaultUrl("<vault url here>")
  .credential(clientSecretCredential)
  .buildClient()

val secretName = "<your value>"
val retrievedSecret = secretClient.getSecret(secretName)
println(s"Retrieved secret: ${retrievedSecret.getValue}")

注释

不要在代码中以纯文本形式硬编码任何机密或密码。 始终使用安全保管库(如 Azure Key Vault)来存储和检索机密。