建立受控的执行环境,控制数据出口,并在启用安全机密访问时强制实施最低特权。
托管私有终结点(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)来存储和检索机密。