为 Azure 机器学习工作区配置专用终结点

适用于:Azure CLI ml 扩展 v2(当前)

本文档介绍如何为 Azure 机器学习工作区配置专用终结点。 有关创建 Azure 机器学习虚拟网络的信息,请参阅虚拟网络隔离和隐私概述

使用 Azure 专用链接可以做到仅限通过 Azure 虚拟网络连接到工作区。 可以通过创建专用终结点,将工作区限制为仅接受来自虚拟网络的连接。 专用终结点是虚拟网络中的一组专用 IP 地址。 然后,你可以限制工作区访问权限,只允许通过专用 IP 地址访问你的工作区。 专用终结点有助于降低数据泄露风险。 若要详细了解专用终结点,请参阅 Azure 专用链接一文。

警告

使用专用终结点保护工作区本身不能确保端到端安全。 必须保护解决方案的所有组件。 例如,如果为工作区使用专用终结点,但 Azure 存储帐户不在 VNet 之后,则工作区和存储之间的流量出于安全原因不会使用 VNet。

若要详细了解如何保护 Azure 机器学习所用的资源,请参阅以下文章:

先决条件

  • 必须具有用于创建专用终结点的现有虚拟网络。

    警告

    请勿对你的 VNet 使用 172.17.0.0/16 IP 地址范围。 这是 Docker 桥接网络使用的默认子网范围,如果用于你的 VNet,则会导致错误。 其他范围可能也会根据你要连接到虚拟网络的内容而发生冲突。 例如,如果计划将本地网络连接到 VNet,并且本地网络也使用 172.16.0.0/16 范围,则会发生冲突。 最终,需要由你来规划网络基础结构。

  • 在添加专用终结点之前禁用专用终结点的网络策略

限制

  • 如果为使用专用终结点保护的工作区启用公共访问,并通过公共 Internet 使用 Azure 机器学习工作室,则设计器等某些功能可能无法访问你的数据。 如果数据存储在虚拟网络保护的服务中,则会出现此问题。 例如 Azure 存储帐户。

  • 如果使用的是 Mozilla Firefox,则在尝试访问工作区的专用终结点时可能会遇到问题。 此问题可能与 Mozilla Firefox 中基于 HTTPS 的 DNS 有关。 建议使用 Microsoft Edge 或 Google Chrome。

  • 使用专用终结点不影响 Azure 控制平面(管理操作),例如删除工作区或管理计算资源。 例如,创建、更新或删除计算目标。 这些操作像往常一样通过公共 Internet 执行。 数据平面操作(如使用 Azure 机器学习工作室)、API(包括已发布管道)或 SDK 使用专用终结点。

  • 在具有专用终结点的工作区中创建计算实例或计算群集时,计算实例和计算群集必须与工作区位于同一 Azure 区域。

  • 将 Azure Kubernetes 服务群集附加到具有专用终结点的工作区时,群集必须与工作区位于同一区域。

  • 使用具有多个专用终结点的工作区时,必须有一个专用终结点与以下依赖项服务位于同一虚拟网络:

    • 为工作区提供默认存储的 Azure 存储帐户
    • 工作区的 Azure 密钥保管库
    • 工作区的 Azure 容器注册表。

    例如,一个虚拟网络(“服务”)包含用于依赖项服务和工作区的专用终结点。 此配置使工作区能够与服务进行通信。 另一个虚拟网络(“客户端”)可能仅包含工作区的专用终结点,并且仅用于客户端开发计算机和工作区之间的通信。

创建使用专用终结点的工作区

使用以下某个方法创建具有专用终结点的工作区。 上述每种方法都需要一个现有的虚拟网络:

提示

如果要同时创建工作区、专用终结点和虚拟网络,请参阅使用 Azure 资源管理器模板创建 Azure 机器学习的工作区

适用于:Azure CLI ml 扩展 v2(当前)

使用用于机器学习的 Azure CLI 扩展 2.0 CLI 时,YAML 文档用于配置工作区。 以下示例演示如何使用 YAML 配置来创建新工作区:

提示

此配置中的 image_build_compute 属性指定用于构建 Docker 映像环境的 CPU 计算群集名称。 还可以使用 public_network_access 属性指定是否应通过 Internet 访问专用链接工作区。

在此示例中,需要先创建 image_build_compute 引用的计算,然后再生成映像。

$schema: https://azuremlschemas.azureedge.net/latest/workspace.schema.json
name: mlw-privatelink-prod
location: chinaeast2
display_name: Private Link endpoint workspace-example
description: When using private link, you must set the image_build_compute property to a cluster name to use for Docker image environment building. You can also specify whether the workspace should be accessible over the internet.
image_build_compute: cpu-compute
public_network_access: Disabled
tags:
  purpose: demonstration
az ml workspace create \
    -g <resource-group-name> \
    --file privatelink.yml

创建工作区后,使用 Azure 网络 CLI 命令为工作区创建专用链接终结点。

az network private-endpoint create \
    --name <private-endpoint-name> \
    --vnet-name <vnet-name> \
    --subnet <subnet-name> \
    --private-connection-resource-id "/subscriptions/<subscription>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/<workspace-name>" \
    --group-id amlworkspace \
    --connection-name workspace -l <location>

若要为工作区创建专用 DNS 区域条目,请使用以下命令:

# Add privatelink.api.ml.azure.cn
az network private-dns zone create \
    -g <resource-group-name> \
    --name privatelink.api.ml.azure.cn

az network private-dns link vnet create \
    -g <resource-group-name> \
    --zone-name privatelink.api.ml.azure.cn \
    --name <link-name> \
    --virtual-network <vnet-name> \
    --registration-enabled false

az network private-endpoint dns-zone-group create \
    -g <resource-group-name> \
    --endpoint-name <private-endpoint-name> \
    --name myzonegroup \
    --private-dns-zone privatelink.api.ml.azure.cn \
    --zone-name privatelink.api.ml.azure.cn

# Add privatelink.notebooks.chinacloudapi.cn
az network private-dns zone create \
    -g <resource-group-name> \
    --name privatelink.notebooks.chinacloudapi.cn

az network private-dns link vnet create \
    -g <resource-group-name> \
    --zone-name privatelink.notebooks.chinacloudapi.cn \
    --name <link-name> \
    --virtual-network <vnet-name> \
    --registration-enabled false

az network private-endpoint dns-zone-group add \
    -g <resource-group-name> \
    --endpoint-name <private-endpoint-name> \
    --name myzonegroup \
    --private-dns-zone privatelink.notebooks.chinacloudapi.cn \
    --zone-name privatelink.notebooks.chinacloudapi.cn

向工作区添加专用终结点

使用以下方法之一将专用终结点添加到现有工作区:

警告

如果有与此工作区关联的任何现有计算目标,并且这些目标不在创建专用终结点的同一虚拟网络的后面,这些目标将不起作用。

适用于:Azure CLI ml 扩展 v2(当前)

使用用于机器学习的 Azure CLI 扩展 2.0 CLI 时,请使用 Azure 网络 CLI 命令为工作区创建专用链接终结点。

az network private-endpoint create \
    --name <private-endpoint-name> \
    --vnet-name <vnet-name> \
    --subnet <subnet-name> \
    --private-connection-resource-id "/subscriptions/<subscription>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/<workspace-name>" \
    --group-id amlworkspace \
    --connection-name workspace -l <location>

若要为工作区创建专用 DNS 区域条目,请使用以下命令:

# Add privatelink.api.ml.azure.cn
az network private-dns zone create \
    -g <resource-group-name> \
    --name 'privatelink.api.ml.azure.cn'

az network private-dns link vnet create \
    -g <resource-group-name> \
    --zone-name 'privatelink.api.ml.azure.cn' \
    --name <link-name> \
    --virtual-network <vnet-name> \
    --registration-enabled false

az network private-endpoint dns-zone-group create \
    -g <resource-group-name> \
    --endpoint-name <private-endpoint-name> \
    --name myzonegroup \
    --private-dns-zone 'privatelink.api.ml.azure.cn' \
    --zone-name 'privatelink.api.ml.azure.cn'

# Add privatelink.notebooks.chinacloudapi.cn
az network private-dns zone create \
    -g <resource-group-name> \
    --name 'privatelink.notebooks.chinacloudapi.cn'

az network private-dns link vnet create \
    -g <resource-group-name> \
    --zone-name 'privatelink.notebooks.chinacloudapi.cn' \
    --name <link-name> \
    --virtual-network <vnet-name> \
    --registration-enabled false

az network private-endpoint dns-zone-group add \
    -g <resource-group-name> \
    --endpoint-name <private-endpoint-name> \
    --name myzonegroup \
    --private-dns-zone 'privatelink.notebooks.chinacloudapi.cn' \
    --zone-name 'privatelink.notebooks.chinacloudapi.cn'

删除专用终结点

可以删除工作区的一个或全部专用终结点。 删除某个专用终结点会从与该终结点关联的 Azure 虚拟网络中删除工作区。 删除专用终结点可能会防止工作区访问该虚拟网络中的资源,或防止虚拟网络中的资源访问工作区。 例如,虚拟网络不允许访问公共 Internet 或从公共 Internet 进行访问。

警告

删除工作区的专用终结点不会使其可公开访问。 若要使工作区可公开访问,请使用启用公共访问部分中的步骤。

若要删除专用终结点,请使用以下信息:

适用于:Azure CLI ml 扩展 v2(当前)

使用用于机器学习的 Azure CLI 扩展 2.0 CLI 时,请使用以下命令删除专用终结点:

az network private-endpoint delete \
    --name <private-endpoint-name> \
    --resource-group <resource-group-name> \

启用公共访问

在某些情况下,可能希望允许某人通过公共终结点(而不是通过虚拟网络)连接到受保护的工作区。 或者,你可能想要从虚拟网络中删除工作区,并重新启用公共访问。

重要

启用公共访问不会删除任何存在的专用终结点。 专用终结点连接到的 VNet 后面的组件之间的所有通信仍然是安全的。 除了通过任何专用终结点进行专用访问以外,还可实现仅对工作区的公共访问。

警告

当工作区使用专用终结点与其他资源通信时,通过公共终结点进行连接时:

  • 工作室的某些功能将无法访问你的数据。 如果数据存储在受 VNet 保护的服务中,则会出现此问题。 例如 Azure 存储帐户。 若要解决此问题,请将客户端设备的 IP 地址添加到 Azure 存储帐户的防火墙
  • 不支持在计算实例(包括正在运行的笔记本)上使用 Jupyter、JupyterLab、RStudio 或 Posit Workbench(以前称为 RStudio Workbench)。

若要启用公共访问,请使用以下步骤:

提示

可以配置两个可能的属性:

  • allow_public_access_when_behind_vnet - 由 Python SDK v1 使用
  • public_network_access - 由 CLI 和 Python SDK v2 使用。每个属性都可替代另一个。 例如,设置 public_network_access 将替代之前对 allow_public_access_when_behind_vnet 的任何设置。

Azure 建议使用 public_network_access 来启用或禁用对工作区的公共访问。

适用于:Azure CLI ml 扩展 v2(当前)

在使用用于机器学习的 Azure CLI 扩展 2.0 CLI 时,请使用 az ml update 命令来为工作区启用 public_network_access

az ml workspace update \
    --set public_network_access=Enabled \
    -n <workspace-name> \
    -g <resource-group-name>

还可以通过使用 YAML 文件来启用公共网络访问。 有关详细信息,请参阅工作区 YAML 参考

仅从 Internet IP 范围启用公共访问

可以通过创建 IP 网络规则来使用 IP 网络规则允许从特定的公共 Internet IP 地址范围访问工作区和终结点。 每个 Azure 机器学习工作区最多支持 200 条规则。 这些规则向基于 Internet 的特定服务和本地网络授予访问权限,阻止一般 Internet 流量。

警告

适用于:Azure CLI ml 扩展 v2(当前)

使用 az ml workspace network-rule Azure CLI 命令从 IP 地址或地址范围管理公共访问:

提示

选定 IP 地址的配置存储在工作区属性的 network_acls 下:

properties:
  # ...
  network_acls:
    description: "The network ACLS for this workspace, enforced when public_network_access is set to Enabled."
    $ref: "3/defintions/networkAcls"
  • 列出 IP 网络规则az ml workspace network-rule list --resource-group "myresourcegroup" --workspace-name "myWS" --query ipRules
  • 为单个 IP 地址添加规则az ml workspace network-rule add --resource-group "myresourcegroup" --workspace-name "myWS" --ip-address "16.17.18.19"
  • 为 IP 地址范围添加规则az ml workspace network-rule add --resource-group "myresourcegroup" --workspace-name "myWS" --ip-address "16.17.18.0/24"
  • 删除单个 IP 地址的规则az ml workspace network-rule remove --resource-group "myresourcegroup" --workspace-name "myWS" --ip-address "16.17.18.19"
  • 删除 IP 地址范围的规则az ml workspace network-rule remove --resource-group "myresourcegroup" --workspace-name "myWS" --ip-address "16.17.18.0/24"

还可以使用 Azure 机器学习 Python SDK 中的 Workspace 类来定义允许入站访问的 IP 地址:

Workspace( 
  public_network_access = "Enabled", 
  network_rule_set = NetworkRuleSet(default_action = "Allow", bypass = "AzureServices", resource_access_rules = None, ip_rules = yourIPAddress,)

IP 网络规则的限制

以下限制适用于 IP 地址范围:

  • IP 网络规则仅适用于公共 Internet IP 地址。

    IP 规则中不允许使用保留 IP 地址范围,例如以 10、172.16 到 172.31 和 192.168 开头的专用地址。

  • 必须使用 CIDR 表示法以 16.17.18.0/24 形式提供允许的 Internet 地址范围,或使用单独的 IP 地址(如 16.17.18.19)来这样做。

  • 仅支持使用 IPv4 地址配置存储防火墙规则。

  • 启用此功能后,可以使用任何客户端工具(如 Curl)测试公共终结点,但门户中的终结点测试工具不受支持。

  • 只能在创建工作区后设置工作区的 IP 地址。

安全连接到工作区

若要连接到 VNet 后面保护的工作区,请使用以下方法之一:

  • Azure VPN 网关 - 通过专用连接将本地网络连接到 VNet。 通过公共 Internet 建立连接。 可以使用两种类型的 VPN 网关:

    • 点到站点:每台客户端计算机使用 VPN 客户端连接到 VNet。
    • 站点到站点:VPN 设备将 VNet 连接到本地网络。
  • ExpressRoute - 通过专用连接将本地网络连接到云。 通过连接提供商建立连接。

  • Azure Bastion - 在此方案中,你将在 VNet 内部创建 Azure 虚拟机(有时称作 Jump Box)。 然后使用 Azure Bastion 连接到 VM。 Bastion 允许在本地 Web 浏览器中使用 RDP 或 SSH 会话连接到 VM。 然后使用 Jump Box 作为开发环境。 由于 Jump Box 位于 VNet 中,因此它可以直接访问工作区。 有关使用 Jump Box 的示例,请参阅教程:创建安全工作区

重要

使用“VPN 网关”或“ExpressRoute”时,需要规划本地资源与 VNet 中资源之间名称解析的工作方式 。 有关详细信息,请参阅使用自定义 DNS 服务器

如果在连接到工作区时遇到问题,请参阅排查安全工作区连接问题

多个专用终结点

Azure 机器学习支持对一个工作区使用多个专用终结点。 如果你希望不同的环境相互保持独立,则通常会使用多个专用终结点。 下面是可以使用多个专用终结点实现的一些方案:

  • 客户端开发环境放在单独的虚拟网络中。

  • Azure Kubernetes 服务 (AKS) 群集放在单独的虚拟网络中。

  • 单独的虚拟网络中的其他 Azure 服务。 例如,Azure Synapse 和 Azure 数据工厂可以使用 Azure 托管的虚拟网络。 无论采用哪种方案,都可以将工作区的专用终结点添加到这些服务使用的托管虚拟网络。 有关将托管虚拟网络与这些服务结合使用的详细信息,请参阅以下文章:

    重要

    Azure 机器学习不支持 Synapse 的数据外泄保护

重要

每个包含工作区专用终结点的 VNet 还必须能够访问该工作区使用的 Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表。 例如,可为每个 VNet 中的服务创建一个专用终结点。

添加多个专用终结点的过程使用将专用终结点添加到工作区部分中所述的相同步骤。

方案:隔离的客户端

若要隔离开发客户端,使其无法直接访问 Azure 机器学习使用的计算资源,请使用以下步骤:

注意

这些步骤假设你具备现有的工作区、Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表。 其中的每个服务在现有 VNet 中有一个专用终结点。

  1. 为客户端创建另一个虚拟网络。 此虚拟网络可以包含充当客户端的 Azure 虚拟机,或者可以包含由本地客户端用来连接虚拟网络的 VPN 网关。
  2. 为工作区使用的 Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表添加新的专用终结点。 这些专用终结点应存在于客户端虚拟网络中。
  3. 如果工作区使用其他存储,请为该存储添加新的专用终结点。 专用终结点应存在于客户端虚拟网络中,并已启用专用 DNS 区域集成。
  4. 将新的专用终结点添加到工作区。 此专用终结点应存在于客户端虚拟网络中,并已启用专用 DNS 区域集成。
  5. 要使 Azure 机器学习工作室能够访问存储帐户,请访问虚拟网络中的工作室一文。

下图演示了此配置。 “工作负载”虚拟网络包含工作区为训练和部署创建的计算资源。 “客户端”虚拟网络包含客户端或客户端 ExpressRoute/VPN 连接。 这两个 VNet 都包含用于工作区、Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表的专用终结点。

隔离的客户端 VNet 示意图

方案:隔离的 Azure Kubernetes 服务

若要创建工作区使用的隔离 Azure Kubernetes 服务,请使用以下步骤:

注意

这些步骤假设你具备现有的工作区、Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表。 其中的每个服务在现有 VNet 中有一个专用终结点。

  1. 创建 Azure Kubernetes 服务实例。 在创建过程中,AKS 会创建包含 AKS 群集的虚拟网络。
  2. 为工作区使用的 Azure 存储帐户、Azure 密钥保管库和 Azure 容器注册表添加新的专用终结点。 这些专用终结点应存在于客户端虚拟网络中。
  3. 如果工作区使用其他存储,请为该存储添加新的专用终结点。 专用终结点应存在于客户端虚拟网络中,并已启用专用 DNS 区域集成。
  4. 将新的专用终结点添加到工作区。 此专用终结点应存在于客户端虚拟网络中,并已启用专用 DNS 区域集成。
  5. 将 AKS 群集附加到 Azure 机器学习工作区。 有关详细信息,请参阅创建并附加 Azure Kubernetes 服务群集

隔离的 AKS VNet 示意图

方案:具有选定 IP 地址访问权限的托管联机终结点

从选定 IP 地址启用入站访问会受到托管联机终结点上的入口设置的影响。 如果在托管联机终结点上启用了公共入口,则无法在工作区上启用选定 IP 地址。

下表显示了工作区和托管联机终结点网络配置的可能配置,以及它对这两者的影响。 有关详细信息,请参阅托管联机终结点的网络隔离

工作区
公用网络访问
托管联机终结点
公用网络访问
工作区是否
遵循选定 IP?
联机终结点是否
遵循选定 IP?
已禁用 已禁用 否(拒绝所有公共流量)
已禁用 Enabled 否(拒绝所有公共流量)
已从选定 IP 启用 已禁用
已从选定 IP 启用 已启用

注意

如果工作区公用网络访问配置已从选定 IP 更改为“已禁用”,则托管联机终结点将继续遵循选定 IP。 如果不希望选定 IP 应用于联机终结点,请在为 Azure 门户中的工作区选择“已禁用”之前删除该地址。 Python SDK 和 Azure CLI 在选择前后均支持此操作。

方案:具有选定 IP 地址访问权限的批处理终结点

批处理终结点不支持选定 IP 的配置。 批处理终结点上没有公用网络访问标志。 如果 Azure 机器学习工作区已禁用,并且启用了专用链接,则批处理终结点也是专用终结点。 如果工作区的公用网络访问从禁用更改为启用,则批处理终结点将保持专用状态,不会成为公用终结点。 有关详细信息,请参阅保护批处理终结点