通过托管联机终结点进行的网络隔离
适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)
将机器学习模型部署到托管联机终结点时,可以使用专用终结点来保护与联机终结点的通信。 本文介绍如何使用专用终结点来保护与托管联机终结点的入站通信。 你还将了解如何使用工作区托管虚拟网络在部署和资源之间提供安全通信。
可以保护从客户端到 联机终结点 的入站评分请求,并保护部署、其使用的 Azure 资源和专用资源之间的出站通信。 入站和出站通信的安全性是分开配置的。 有关终结点和部署的详细信息,请参阅什么是终结点和部署。
以下体系结构图显示了通信如何通过专用终结点流向托管联机终结点。 来自客户端虚拟网络的传入评分请求通过工作区的专用终结点流向托管联机终结点。 从部署到服务的出站通信通过从工作区的托管虚拟网络到这些服务实例的专用终结点处理。
注意
- 本文重点介绍使用工作区托管虚拟网络的网络隔离。 有关用于网络隔离的旧方法的说明(其中 Azure 机器学习为终结点中的每个部署创建托管虚拟网络),请参阅附录。
- 无论本文讨论的入站和出站通信如何,每个部署都与其他部署隔离。 换句话说,即使使用允许 Internet 入站/出站的终结点/部署,部署之间也存在网络隔离,这会阻止任何部署直接连接到其他部署。
限制
必须在 Azure 机器学习工作区上禁用
v1_legacy_mode
标志 (false)。 如果启用此标志,你将无法创建托管联机终结点。 有关详细信息,请参阅使用 v2 API 配置网络隔离。如果你的 Azure 机器学习工作区具有 2022 年 5 月 24 日之前创建的专用终结点,则必须先重新创建该工作区的专用终结点,然后再将联机终结点配置为使用专用终结点。 有关为工作区创建专用终结点的详细信息,请参阅如何为 Azure 机器学习工作区配置专用终结点。
提示
若要确认何时创建了工作区,可以检查工作区属性。
在“工作室”中,转到
Directory + Subscription + Workspace
部分(“工作室”的右上角),然后选择View all properties in Azure Portal
。 从“概述”页的右上角选择 JSON 视图,然后选择最新的 API 版本。 在此页中,可以检查properties.creationTime
的值。或者,将
az ml workspace show
与 CLI 配合使用、将my_ml_client.workspace.get("my-workspace-name")
与 SDK 配合使用或对工作区将curl
与 REST API 配合使用。对联机终结点使用网络隔离时,你可以使用其他资源组(而非你的工作区中的资源组)中的工作区关联资源(Azure 容器注册表 [ACR]、存储帐户、密钥保管库和 Application Insights)。 但这些资源必须属于与工作区相同的订阅和租户。
注意
本文所述网络隔离适用于数据平面操作,即从评分请求(或模型服务)产生的操作。 控制平面操作(如创建、更新或检索身份验证密钥的请求)通过公用网络发送到 Azure 资源管理器。
保护入站评分请求
使用 Azure 机器学习工作区的专用终结点,可以保护从客户端到托管联机终结点的入站通信安全。 客户端虚拟网络上的此专用终结点与托管联机终结点的工作区通信,是托管联机终结点接收来自客户端的传入评分请求的方式。
为保护对联机终结点的评分请求,以便客户端只能通过工作区的专用终结点访问它,请将终结点的 public_network_access
标志设置为 disabled
。 创建终结点后,可以更新此设置以根据需要启用公用网络访问。
将终结点的 public_network_access
标志设置为 disabled
:
az ml online-endpoint create -f endpoint.yml --set public_network_access=disabled
当 public_network_access
为 disabled
时,将使用工作区的专用终结点接收入站评分请求,且无法从公用网络访问终结点。
或者,如果将 public_network_access
设置为 enabled
,则终结点可以接收来自 Internet 的入站评分请求。
使用工作区托管虚拟网络保护出站访问
为保护从部署到服务的出站通信,需要为 Azure 机器学习工作区启用托管虚拟网络隔离,以便 Azure 机器学习可以为工作区创建托管虚拟网络。 工作区中的所有托管联机终结点(工作区的托管计算资源,例如计算群集和计算实例)自动使用此工作区托管虚拟网络,而终结点下的部署共享托管虚拟网络的专用终结点,以便与工作区的资源通信。
使用托管虚拟网络保护工作区时,托管联机部署的 egress_public_access
标志不再适用。 避免在创建托管联机部署时设置此标志。
对于与工作区托管虚拟网络的出站通信,Azure 机器学习:
- 为托管虚拟网络创建专用终结点,以用于与工作区使用的 Azure 资源(例如 Azure 存储、Azure 密钥保管库和 Azure 容器注册表)进行通信。
- 允许部署访问 Microsoft 容器注册表 (MCR) ,这在想要使用策展环境或 MLflow 无代码部署时非常有用。
- 允许用户为专用资源配置专用终结点出站规则,并为公共资源配置出站规则(服务标记或 FQDN)。 有关如何管理出站规则的详细信息,请参阅管理出站规则。
此外,还可以为来自工作区托管虚拟网络的出站流量配置两种隔离模式,即:
- 允许 Internet 出站,以允许来自托管虚拟网络的所有 Internet 出站流量
- 仅允许批准的出站,以使用专用终结点、FQDN 出站规则和服务标记出站规则来控制出站流量。
例如,假设工作区的托管虚拟网络在托管联机终结点下包含两个部署,这两个部署都可以使用工作区的专用终结点与以下项通信:
- Azure 机器学习工作区
- 与工作区关联的 Azure 存储 BLOB
- 工作区的 Azure 容器注册表
- Azure 密钥保管库
- (可选)支持专用终结点的其他专用资源。
若要详细了解工作区托管虚拟网络的配置,请参阅托管虚拟网络体系结构。
网络隔离配置方案
Azure 机器学习工作区和托管联机终结点各有一个 public_network_access
标志,可用于配置其入站通信。 另一方面,来自部署的出站通信取决于工作区的托管虚拟网络。
与托管联机终结点的通信
假设托管联机终结点的部署使用 AI 模型,并且你想要使用应用向终结点发送评分请求。 可以决定用于托管联机终结点的网络隔离配置,如下所示:
对于入站通信:
如果应用在 Internet 上公开可用,则需要为终结点启用 public_network_access
,以便它可以从应用接收入站评分请求。
但是,假设该应用是专用的,例如组织中的内部应用。 在此方案中,你希望 AI 模型仅在组织内使用,而不是公开到 Internet。 因此,需要禁用终结点的 public_network_access
,以便它只能通过其工作区的专用终结点接收入站评分请求。
对于出站通信(部署):
假设部署需要访问专用 Azure 资源(例如 Azure 存储 blob、ACR 和 Azure 密钥保管库),或者部署无法访问 Internet。 在这种情况下,需要使用仅允许批准的出站隔离模式启用工作区的托管虚拟网络。 此隔离模式仅允许从部署到已批准目标的出站通信,从而防止数据外泄。 此外,还可以为工作区添加出站规则,以允许访问更多专用或公共资源。 有关详细信息,请参阅将托管虚拟网络配置为仅允许已批准的出站。
但是,如果希望部署访问 Internet,可以使用工作区的托管虚拟网络和允许 Internet 出站隔离模式。 除了能够访问 Internet 外,还可以使用托管虚拟网络的专用终结点来访问所需的专用 Azure 资源。
最后,如果部署不需要访问专用 Azure 资源,并且不需要控制对 Internet 的访问,则无需使用工作区托管虚拟网络。
与 Azure 机器学习工作区的入站通信
可以使用 Azure 机器学习工作区的 public_network_access
标志来启用或禁用入站工作区访问。
通常,如果要保护与工作区的入站通信(通过禁用工作区的 public_network_access
标志),还需要保护与托管联机终结点的入站通信。
下图显示了一个典型的工作流,旨在保护与 Azure 机器学习工作区和托管联机终结点的入站通信。 为了获得最佳安全性,建议禁用工作区和托管联机终结点的 public_network_access
标志,以确保两者都无法通过公共 Internet 进行访问。 如果工作区没有专用终结点,可以创建一个,确保包含正确的 DNS 解析。 然后,可以使用工作区的专用终结点访问托管联机终结点。
注意
托管联机终结点会共享工作区的专用终结点。 如果要手动将 DNS 记录添加到专用 DNS 区域 privatelink.api.azureml.ms
,则应添加带有通配符 *.<per-workspace globally-unique identifier>.inference.<region>.privatelink.api.azureml.ms
的 A 记录,以便将工作区下的所有终结点路由到专用终结点。
有关工作区和专用终结点的 DNS 解析的详细信息,请参阅如何将工作区用于自定义 DNS 服务器。
附录
使用旧式网络隔离方法保护出站访问
对于托管联机终结点,还可以通过在终结点中的每个部署中使用 Azure 机器学习托管虚拟网络来保护部署与资源之间的出站通信。 安全出站通信也使用专用终结点对这些服务实例进行处理。
注意
强烈建议利用使用工作区托管虚拟网络保护出站访问中所述的方法,而不是此旧方法。
若要限制部署与外部资源(包括它使用的 Azure 资源)之间的通信,应确保:
部署的
egress_public_network_access
标志是disabled
。 此标志确保部署所需的模型、代码和图像的下载受到专用终结点的保护。 创建部署后,无法更新(启用或禁用)egress_public_network_access
标志。 在更新部署时尝试更改该标志将会失败并出错。工作区具有专用链接,允许通过专用终结点访问 Azure 资源。
工作区具有可以启用或禁用的
public_network_access
标志,如果计划使用某个使用公共出站的托管联机部署,则还必须将工作区配置为允许公共访问。 这是因为从托管联机终结点部署发出的出站通信将进入工作区 API。 当部署配置为使用公共出站时,工作区必须能够接受该公共通信(允许公共访问)。
如果有多个部署,并且为托管联机终结点中的每个部署将 egress_public_network_access
配置为 disabled
,则每个部署都有其自己的独立 Azure 机器学习托管虚拟网络。 对于每个虚拟网络,Azure 机器学习都会创建三个专用终结点,用于与以下服务通信:
- Azure 机器学习工作区
- 与工作区关联的 Azure 存储 BLOB
- 工作区的 Azure 容器注册表
例如,如果为托管联机终结点的两个部署将 egress_public_network_access
标志设置为 disabled
,则会一共创建六个专用终结点。 每个部署将使用三个专用终结点分别与工作区、Blob 和容器注册表通信。
重要
Azure 机器学习不支持部署的托管虚拟网络与客户端虚拟网络之间的对等互连。 为了安全访问部署所需的资源,我们使用专用终结点与资源通信。
下图显示从客户端虚拟网络通过工作区的专用终结点流向托管联机终结点的传入评分请求。 此图还显示了两个联机部署,每个部署都在其自己的 Azure 机器学习托管虚拟网络中。 每个部署的虚拟网络都有三个专用终结点,分别用于与 Azure 机器学习工作区、工作区关联的 Azure 存储 Blob 以及工作区的Azure 容器注册表进行出站通信。
禁用 egress_public_network_access
并创建专用终结点:
az ml online-deployment create -f deployment.yml --set egress_public_network_access=disabled
若要确认创建专用终结点,请先检查与工作区关联的存储帐户和容器注册表(请参阅下载配置文件),从 Azure 门户查找每个资源并查看 Networking
菜单下的 Private endpoint connections
选项卡。
重要
- 如前所述,从托管联机终结点部署发出的出站通信将进入工作区 API。 如果终结点配置为使用公用出站(换言之,终结点的
public_network_access
标志设置为enabled
),则工作区必须能够接受公用通信(工作区的public_network_access
标志设置为enabled
)。 - 创建联机部署时,如果
egress_public_network_access
标志设置为disabled
,则它们只能访问受保护的资源(工作区、Blob 和容器注册表)。 例如,如果部署使用上传到其他存储帐户的模型资产,则模型下载将会失败。 请确保模型资产位于与工作区关联的存储帐户上。 - 如果
egress_public_network_access
设置为disabled
时,部署只能访问虚拟网络中受保护的与工作区关联的资源。 与之相反,如果egress_public_network_access
设置为enabled
,则部署只能访问具有公共访问权限的资源,这意味着它无法访问虚拟网络中受保护的资源。
下表列出了为联机终结点配置入站和出站通信时支持的配置:
配置 | 入站 (终结点属性) |
出站 (部署属性) |
是否支持? |
---|---|---|---|
安全入站与安全出站 | public_network_access 已禁用 |
egress_public_network_access 已禁用 |
是 |
安全入站与公共出站 | public_network_access 已禁用 |
egress_public_network_access 已启用工作区还必须允许公共访问,因为部署出站将进入工作区 API。 |
是 |
公共入站与安全出站 | public_network_access 已启用 |
egress_public_network_access 已禁用 |
是 |
公共入站与公共出站 | public_network_access 已启用 |
egress_public_network_access 已启用工作区还必须允许公共访问,因为部署出站将进入工作区 API。 |
是 |