本页介绍如何配置和管理网络策略,以控制 Azure Databricks 中无服务器工作负荷的出站网络连接。
有关入口控件,请参阅 基于上下文的入口控件。
要求
- Azure Databricks 工作区必须位于高级层上。
- 管理网络策略的权限仅限于帐户管理员。
访问网络策略
要在帐户中创建、查看和更新网络策略,请执行以下操作:
- 在 帐户控制台中,单击“ 安全性”。
- 单击“ 网络 ”选项卡。
- 在 “策略”下,单击 “基于上下文的入口和出口”控件。
创建网络策略
单击 创建新网络策略。
输入 策略名称。
单击 “出口 ”选项卡。
若要设置入口规则,请参阅 “设置入口规则”。
选择网络访问模式:
- 允许访问所有目标:不受限制的出站 Internet 访问。 如果选择 完全访问,则出站 Internet 访问将保持不受限制。
- 对特定目标的受限访问:出站访问仅限于指定的目标。
配置网络策略
以下步骤概述了受限访问模式的可选设置。
设置出口规则
在设置出口规则之前,请注意:
- 在元存储中使用 S3 存储桶时,必须使用 REST API 将存储桶显式添加到出口允许列表中,才能成功访问。
- 支持的最大目标数为 2500。
- 可以添加为允许域的 FQDN 数限制为每个策略 100 个。
- 添加为负载均衡器专用链接条目的域在网络策略中被隐式列入允许名单。 删除域或删除专用终结点时,网络策略控制可能需要长达 24 小时才能完全强制实施更改。 请参阅 配置 VNet 中资源的专用连接。
注意
Unity Catalog 连接的隐式加入允许列表已被弃用。 对于那些包含在弃用之前使用隐式白名单的工作区的帐户,此行为将在有限的过渡期内继续有效。
要授予对其他域的无服务器计算访问权限,请单击允许的域列表上面的添加目标。
FQDN 筛选器允许访问共享同一 IP 地址的所有域。 在将网络访问设置为受限时,通过端点进行的模型服务预配可防止互联网访问。 但是,无法通过 FQDN 过滤实现精细控制。
若要允许工作区访问其他 Azure 存储帐户,请单击“允许的存储目标”列表上方的“添加目标”按钮。
注意
默认情况下,不允许从用户代码容器(如 REPLs 或 UDF)直接访问云存储服务。 若要启用此访问,请在策略中的 “允许域 ”下添加存储资源的 FQDN。 仅添加存储资源的基域可能会无意中授予对该区域中所有存储资源的访问权限。
政策执行
使用“试运行”模式可以测试策略配置并监视出站连接,而不会中断对资源的访问。 启用干运行模式后,将记录违反策略但未阻止的请求。 您可以选择以下选项:
Databricks SQL:Databricks SQL 仓库在干运行模式下运行。
AI 模型服务:为终结点提供服务的模型在干运行模式下运行。
所有产品:所有 Azure Databricks 服务都以干运行模式运行,覆盖所有其他选择。
更新默认策略
每个 Azure Databricks 帐户都包含一个 默认策略。 默认策略 与没有显式网络策略分配的所有工作区(包括新创建的工作区)相关联。 可以修改此策略,但无法将其删除。
默认策略仅适用于至少具有高级层的工作区。
将网络策略关联到工作区
如果已使用其他配置更新了默认策略,那么系统会将这些策略自动应用于没有现有网络策略的工作区。
你的工作区必须位于高级层中。
要将工作区与其他策略相关联,请执行以下操作:
- 选择工作区。
- 在 网络策略中,单击 更新网络策略。
- 从列表中选择所需的网络策略。
- 单击 “应用策略”。
应用网络策略更改
大多数网络配置更新会在 10 分钟内自动传播到无服务器计算服务。 这包括:
- 添加新的 Unity 目录外部位置或连接。
- 将工作区附加到不同的元存储。
- 更改允许的存储或 Internet 目标。
注意
如果修改 Internet 访问或干运行模式设置,则必须重启计算。
重启或重新部署无服务器工作负荷
只需在切换 Internet 访问模式或更新试运行模式时更新。
若要确定适当的重启过程,请参阅以下按产品列出的列表:
- Databricks ML 服务:重新部署 ML 服务终结点。 请参阅创建自定义模型服务终结点
- 管道:停止并重启正在运行的 Lakeflow 声明性管道。 请参阅在 Lakeflow 声明性管道中运行更新。
- 无服务器 SQL 仓库:停止并重启 SQL 仓库。 请参阅管理 SQL 仓库。
- Lakeflow 作业:触发新作业运行或重启现有作业运行时,将自动应用网络策略更改。
-
笔记本:
- 如果笔记本不与 Spark 交互,可以终止,然后重新附加无服务器计算以刷新网络策略。
- 如果笔记本与 Spark 交互,则无服务器资源会刷新并自动检测更改。 大多数更改将在 10 分钟内刷新,但切换 Internet 访问模式、更新干运行模式,或者在具有不同强制类型的附加策略之间更改最多可能需要 24 小时。 若要加快对这些特定类型的更改进行刷新,请关闭所有关联的笔记本和作业。
Databricks 资产捆绑 UI 依赖项
在将受限访问模式用于无服务器出口控制时,Databricks 资产捆绑用户界面功能需要访问特定的外部域。 如果完全限制出站访问,则使用 Databricks 资产捆绑包时,用户可能会在工作区界面中遇到错误。
要在实行受限网络策略时保持 Databricks 资产捆绑 UI 功能正常运行,请将这些域添加到策略中的允许的域列表中:
- github.com
- objects.githubusercontent.com
- release-assets.githubusercontent.com
- checkpoint-api.hashicorp.com
- releases.hashicorp.com
- registry.terraform.io
验证网络策略执行
你可以尝试从不同的无服务器工作负荷访问受限资源来验证是否正确实施了网络策略。 验证过程因无服务器产品而异。
使用 Lakeflow 声明性管道进行验证
- 创建 Python 笔记本。 可以使用 Lakeflow 声明性管道维基百科 python 教程中提供的示例笔记本。
- 创建管道:
- 在工作区中,单击边栏中的
作业和管道。
- 单击 创建,然后 ETL 管道。
- 使用以下设置配置管道:
- 管道模式:无服务器
- 源代码:选择创建的笔记本。
- 存储选项:Unity Catalog。 选择所需的目录和架构。
- 单击“创建”。
- 在工作区中,单击边栏中的
- 运行管道。
- 在管道页中,单击开始。
- 等待管道完成。
- 验证结果
- 受信任的目标:管道成功运行,并将数据写入目标。
- 不受信任的目标:管道失败并出现错误,指示网络访问被阻止。
使用 Databricks SQL 进行验证
创建 SQL 仓库。
在 SQL 编辑器中运行测试查询,该查询尝试访问由网络策略控制的资源。
验证结果:
- 受信任的目标:查询成功。
- 不受信任的目标:查询失败并出现网络访问错误。
若要使用标准 Python 库从 UDF 连接到网络,请运行以下 UDF 定义:
CREATE OR REPLACE TEMPORARY FUNCTION ping_google(value DOUBLE) RETURNS STRING LANGUAGE python AS $$ import requests url = "https://www.google.com" response = requests.get(url, timeout=5) if response.status_code == 200: return "UDF has network!" else: return "UDF has no network!" $$;
使用模型服务进行验证
在您开始之前
当创建模型服务端点时,会生成容器映像用于提供模型服务。 在此构建阶段执行网络策略。 将模型服务用于网络策略时,请考虑以下事项:
依赖项访问: 您的网络策略必须允许任何外部构建依赖项,例如来自 PyPI 和 conda-forge 的 Python 包,基础容器镜像,或者模型环境或 Docker 上下文中所需的指定外部 URL 中的文件。
- 例如,如果模型需要特定版本的 scikit-learn,需要在生成期间下载,则网络策略必须允许访问托管包的存储库。
生成失败: 如果网络策略阻止访问必要的依赖项,则提供容器生成的模型将失败。 这可以防止服务终结点成功部署,并可能导致它无法正确存储或正常运行。
请参阅 检查拒绝日志。
拒绝情况疑难解答:系统会记录构建阶段的网络访问拒绝情况。 这些日志的
network_source_type字段具有值ML Build。 此信息对于确定必须添加到网络策略中的具体阻止资源以便让构建成功完成至关重要。
验证运行时网络访问
以下步骤演示如何在运行时验证已部署模型的网络策略,特别是用于在推理期间尝试访问外部资源。 这假定已成功生成提供容器的模型,这意味着网络策略中允许任何生成时依赖项。
创建测试模型
在 Python 笔记本中,创建一个模型,该模型尝试在推理时访问公共 Internet 资源,例如下载文件或发出 API 请求。
运行此笔记本以在测试工作区中生成模型。 例如:
import mlflow import mlflow.pyfunc import mlflow.sklearn import requests class DummyModel(mlflow.pyfunc.PythonModel): def load_context(self, context): # This method is called when the model is loaded by the serving environment. # No network access here in this example, but could be a place for it. pass def predict(self, _, model_input): # This method is called at inference time. first_row = model_input.iloc[0] try: # Attempting network access during prediction response = requests.get(first_row['host']) except requests.exceptions.RequestException as e: # Return the error details as text return f"Error: An error occurred - {e}" return [response.status_code] with mlflow.start_run(run_name='internet-access-model'): wrappedModel = DummyModel() # When this model is deployed to a serving endpoint, # the environment will be built. If this environment # itself (e.g., specified conda_env or python_env) # requires packages from the internet, the build-time SEG policy applies. mlflow.pyfunc.log_model( artifact_path="internet_access_ml_model", python_model=wrappedModel, registered_model_name="internet-http-access" )
创建服务终结点
在工作区导航中,选择 “AI/ML”。
单击服务选项卡。
单击创建服务终结点。
使用以下设置配置终结点:
- 服务终结点名称:提供描述性名称。
- 实体详细信息:选择模型注册表模型。
-
模型:选择在上一步中创建的模型(
internet-http-access)。
单击“确认”。 在此阶段,模型服务容器的构建过程开始。
ML Build的网络策略将被强制实施。 如果构建由于依赖项的网络访问被阻止而失败,则端点将无法就绪。等待服务终结点达到就绪状态。 如果它无法准备就绪,请检查拒绝日志中是否有
network_source_type: ML Build条目。请参阅 检查拒绝日志。
查询终结点。
使用服务终结点页中的 “查询终结点 ”选项发送测试请求。
{ "dataframe_records": [{ "host": "[https://www.google.com](https://www.google.com)" }] }
验证运行时访问的结果:
-
在运行时启用 Internet 访问:查询成功并返回状态代码,如下所示
200。 -
Internet 访问在运行时受到限制:查询失败并出现网络访问错误,例如来自模型代码中的
try-except块的错误消息,指示连接超时或主机名解析失败。
-
在运行时启用 Internet 访问:查询成功并返回状态代码,如下所示
更新网络策略
可以在创建网络策略后随时更新它。 要更新网络策略,请执行以下操作:
- 在帐户控制台中网络策略的详细信息页上,修改策略:
- 更改网络访问模式。
- 为特定服务启用或禁用干运行模式。
- 添加或删除 FQDN 或存储目标。
- 单击“更新” 。
- 请参阅 应用网络策略更改,以验证更新是否应用于现有工作负荷。
检查拒绝日志
拒绝日志存储在 Unity Catalog 内的 system.access.outbound_network 表中。 这些日志跟踪出站网络请求被拒绝的时间。 若要访问拒绝日志,请验证是否在 Unity 目录元存储上启用了访问架构。 请参阅 Access 系统表。
使用如下所示的 SQL 查询来查看拒绝事件。 如果启用了干运行日志,查询将返回拒绝日志和干运行日志,可以使用 access_type 列进行区分。 拒绝日志显示 DROP 值,而试运行日志显示 DRY_RUN_DENIAL。
以下示例检索过去 2 小时中的日志:
SELECT *
FROM system.access.outbound_network
WHERE event_time >= CURRENT_TIMESTAMP() - INTERVAL 2 HOUR
ORDER BY event_time DESC;
对于试运行模式和外部生成式 AI 模型,以下情况属实:
- 如果网络策略已阻止访问必要的依赖项,请先检查拒绝日志
system.access.outbound_network。 此外,为容器提供服务的模型生成日志可能会提供有关哪些域被阻止的有用信息。 - 如果为容器生成提供服务的模型失败,请检查拒绝日志
system.access.outbound_network以确定哪些域被阻止。 - 即使在干运行模式下,马赛克 AI 服务对外部模型访问的强制执行仍会持续。
注意
访问时间与出现拒绝日志的时间之间可能存在可感知的延迟。
限制
-
工件上传大小:使用 MLflow 的内部 Databricks 文件系统与
dbfs:/databricks/mlflow-tracking/<experiment_id>/<run_id>/artifacts/<artifactPath>格式时,工件上传限制为 5GB,适用于log_artifact、log_artifacts和log_modelAPI。 - 模型服务:在生成模型服务的映像时不应用出口控制。
- 短生存期垃圾回收(GC)工作负载的拒绝日志传送:对于持续时间小于 120 秒的短生存期 GC 工作负载,由于日志记录的延迟,拒绝日志可能无法在节点终止之前被传送。 尽管仍强制实施访问,但可能缺少相应的日志条目。
- Databricks SQL 用户定义的函数(UDF)的网络连接:若要在 Databricks SQL 中启用网络访问,请联系 Databricks 帐户团队。
- 增量共享:除非共享表的存储位置与视图依赖项相同,否则不会自动允许视图。
- 管道事件钩子日志记录:Lakeflow 声明式管道的事件钩子如果目标是另一个工作区,将不会被记录。 这适用于为跨区域工作区及同一区域内工作区配置的 Eventhook。
- 跨云的网络访问:目前,使用 S3 存储桶作为 Unity Catalog 外部位置的 Azure 工作区不被无服务器网络策略所允许。
后续步骤
- 配置基于上下文的入口控制:根据标识、请求类型和网络源定义入站访问策略,以保护工作区访问。 请参阅 基于上下文的入口控件。
- 管理专用终结点规则:通过定义允许或拒绝连接以增强安全性的特定规则来控制传入和传出专用终结点的网络流量。 请参阅管理专用终结点。
- 为无服务器计算访问配置防火墙:实现防火墙,以限制和保护无服务器计算环境的入站和出站网络连接。 请参阅为无服务器计算访问配置防火墙。
- 了解数据传输和连接成本:了解实现无服务器工作负荷的网络安全控制和专用连接时产生的成本影响。 请参阅了解 Databricks 无服务器网络成本。