使用虚拟网络保护 Azure 机器学习工作区 (v1)
适用于:Azure CLI ml 扩展 v1Python SDK azureml v1
本文中介绍如何在 Azure 虚拟网络中保护 Azure 机器学习工作区及其关联资源。
提示
Azure 机器学习还提供托管虚拟网络(预览版)。 使用托管虚拟网络,Azure 机器学习可处理工作区和托管计算的网络隔离作业。 还可以为工作区所需的资源(例如 Azure 存储帐户)添加专用终结点。 有关详细信息,请参阅工作区托管网络隔离。
本文是介绍如何保护 Azure 机器学习工作流系列文章的一部分。 请参阅本系列中的其他文章:
有关创建安全工作区的教程,请参阅教程:创建安全工作区或教程:使用模板创建安全工作区。
本文介绍如何在虚拟网络中启用以下工作区资源:
- Azure 机器学习工作区
- Azure 存储帐户
- Azure 机器学习数据存储和数据集
- Azure Key Vault
- Azure 容器注册表
先决条件
阅读网络安全概述一文,了解常见的虚拟网络方案和总体虚拟网络体系结构。
请阅读 Azure 机器学习之企业安全最佳实践一文,了解最佳做法。
用于计算资源的现有虚拟网络和子网。
重要
不建议对 VNet 使用 172.17.0.0/16 IP 地址范围。 这是 Docker 桥网络使用的默认子网范围。 其他范围可能也会根据你要连接到虚拟网络的内容而发生冲突。 例如,如果计划将本地网络连接到 VNet,并且本地网络也使用 172.16.0.0/16 范围,则会发生冲突。 最终,需要由你来规划网络基础结构。
若要将资源部署到虚拟网络或子网中,你的用户帐户必须在 Azure 基于角色的访问控制 (Azure RBAC) 中具有以下操作的权限:
- 虚拟网络资源上的“Microsoft.Network/*/read”。 对于 Azure 资源管理器 (ARM) 模板部署,不需要此权限。
- “Microsoft.Network/virtualNetworks/join/action”(在虚拟网络资源上)。
- "Microsoft.Network/virtualNetworks/subnets/join/action"(在子网资源上)。
若要详细了解如何将 Azure RBAC 与网络配合使用,请参阅网络内置角色
Azure 容器注册表
Azure 容器注册表必须是高级版。 若要详细了解如何升级,请参阅更改 SKU。
如果 Azure 容器注册表使用专用终结点,则它必须与用于训练或推理的存储帐户和计算目标位于同一虚拟网络中。 如果它使用服务终结点,则它必须与存储帐户和计算目标在同一虚拟网络和子网中。
Azure 机器学习工作区必须包含 Azure 机器学习计算群集。
限制
Azure 存储帐户
如果计划使用 Azure 机器学习工作室并且存储帐户也在 VNet 中,则存在额外的验证要求:
- 如果存储帐户使用服务终结点,则工作区专用终结点和存储服务终结点必须位于 VNet 的同一子网中。
- 如果存储帐户使用专用终结点,则工作区专用终结点和存储专用终结点必须位于同一 VNet 中。 在这种情况下,它们可以位于不同的子网中。
Azure 容器实例
使用专用终结点配置 Azure 机器学习工作区时,不支持部署到 VNet 中的 Azure 容器实例。 相反,请考虑使用具有网络隔离的托管联机终结点。
Azure 容器注册表
如果 ACR 位于虚拟网络后面,Azure 机器学习无法使用它来直接生成 Docker 映像。 而是使用计算群集来生成映像。
重要
用于构建 Docker 映像的计算群集需要能够访问用于训练和部署模型的包存储库。 你可能需要添加允许访问公用存储库、使用专用 Python 包,或使用已包含该包的自定义 Docker 映像的网络安全规则。
警告
如果 Azure 容器注册表使用专用终结点或服务终结点来与虚拟网络通信,则不能将托管标识用于 Azure 机器学习计算群集。
Azure Monitor
警告
Azure Monitor 支持使用 Azure 专用链接连接到 VNet。 但是,你必须在 Azure Monitor 中使用开放专用链接模式。 有关更多信息,请参阅专用链接访问模式:专用与开放。
所需的公共 Internet 访问权限
Azure 机器学习需要对公共 Internet 进行入站和出站访问。 下表概述了需要的访问权限及其用途。 对于以 .region
结尾的服务标记,请将 region
替换为包含你的工作区的 Azure 区域。 例如,Storage.chinanorth
:
提示
“必需”选项卡列出了必需的入站和出站配置。 “视情况”选项卡列出了你可能希望启用的特定配置所需的可选入站和出站配置。
方向 | 协议 & ports |
服务标记 | 目的 |
---|---|---|---|
出站 | TCP:80、443 | AzureActiveDirectory |
使用 Azure AD 进行身份验证。 |
出站 | TCP:443、18881 UDP:5831 |
AzureMachineLearning |
使用 Azure 机器学习服务。 笔记本中的 Python Intellisense 使用端口 18881。 创建、更新和删除 Azure 机器学习计算实例时使用端口 5831。 |
出站 | 任何:443 | BatchNodeManagement.region |
与 Azure 机器学习计算实例/群集的 Azure Batch 后端通信。 |
出站 | TCP:443 | AzureResourceManager |
使用 Azure 机器学习、Azure CLI 和 Azure 机器学习 SDK 创建 Azure 资源。 |
出站 | TCP:443 | Storage.region |
访问存储在 Azure 存储帐户中、用于计算群集和计算实例的数据。 有关防止数据通过此出站外泄的信息,请参阅数据外泄保护。 |
出站 | TCP:443 | AzureFrontDoor.FrontEnd * 在 Azure 中国区域不需要。 |
Azure 机器学习工作室的全球入口点。 为 AutoML 存储图像和环境。 有关防止数据通过此出站外泄的信息,请参阅数据外泄保护。 |
出站 | TCP:443 | MicrosoftContainerRegistry.region 注意:此标记依赖于 AzureFrontDoor.FirstParty 标记 |
访问由 Microsoft 提供的 docker 映像。 为 Azure Kubernetes 服务设置 Azure 机器学习路由器。 |
提示
如果需要 IP 地址而不是服务标记,请使用下列选项之一:
- 从 Azure IP 范围和服务标记下载列表。
- 使用 Azure CLI az network list-service-tags 命令。
- 使用 Azure PowerShell Get-AzNetworkServiceTag 命令。
IP 地址可能会定期改变。
可能还需要允许出站流量发往 Visual Studio Code 和非 Microsoft 站点,以便安装机器学习项目所需的包。 下表列出了用于机器学习的常用存储库:
主机名 | 目的 |
---|---|
anaconda.com *.anaconda.com |
用于安装默认包。 |
*.anaconda.org |
用于获取存储库数据。 |
pypi.org |
用于列出默认索引的依赖项(如果有),索引不会被用户设置覆盖。 如果索引被覆盖,则还必须允许 *.pythonhosted.org 。 |
cloud.r-project.org |
在安装用于 R 开发的 CRAN 包时使用。 |
*.pytorch.org |
由基于 PyTorch 的一些示例使用。 |
*.tensorflow.org |
由基于 Tensorflow 的一些示例使用。 |
code.visualstudio.com |
下载和安装 Visual Studio Code 桌面时需要。 Visual Studio Code Web 不需要。 |
update.code.visualstudio.com *.vo.msecnd.net |
用于检索通过安装脚本安装在计算实例上的 Visual Studio Code 服务器位。 |
marketplace.visualstudio.com vscode.blob.core.chinacloudapi.cn *.gallerycdn.vsassets.io |
下载和安装 Visual Studio Code 扩展时需要。 这些主机会启用与适用于 Visual Studio Code 的 Azure ML 扩展提供的计算实例的远程连接。 有关详细信息,请参阅在 Visual Studio Code 中连接到 Azure 机器学习计算实例。 |
raw.githubusercontent.com/microsoft/vscode-tools-for-ai/master/azureml_remote_websocket_server/* |
用于检索安装在计算实例上的 websocket 服务器位。 websocket 服务器用于将来自 Visual Studio Code 客户端(桌面应用程序)的请求传输到计算实例上运行的 Visual Studio Code 服务器。 |
注意
使用 Azure 机器学习 VS Code 扩展时,远程计算实例需要访问公共存储库才能安装该扩展所需的包。 如果计算实例需要代理来访问这些公共存储库或 Internet,则需要在计算实例的 ~/.bashrc
文件中设置和导出 HTTP_PROXY
和 HTTPS_PROXY
环境变量。 可以使用自定义脚本在预配时自动执行此过程。
将 Azure Kubernetes Service (AKS) 与 Azure 机器学习一起使用时,请允许将以下流量发送到 AKS VNet:
- AKS 的一般入站/出站要求,如限制 Azure Kubernetes 服务中的出口流量一文中所述。
- 发往 mcr.microsoft.com 的出站流量。
- 将模型部署到 AKS 群集时,请遵循将 ML 模型部署到 Azure Kubernetes 服务一文中的指导。
有关使用防火墙解决方案的信息,请参阅在 Azure 机器学习中使用防火墙。
通过专用终结点保护工作区
使用 Azure 专用链接,可以通过专用终结点连接到工作区。 专用终结点是虚拟网络中的一组专用 IP 地址。 然后,你可以限制工作区访问权限,只允许通过专用 IP 地址访问你的工作区。 专用终结点有助于降低数据泄露风险。
有关为工作区配置专用终结点的信息,请参阅如何配置专用终结点。
警告
使用专用终结点保护工作区本身不能确保端到端安全。 必须按照本文其余部分的步骤和 VNet 系列中的步骤进行操作,以确保解决方案中各个组件的安全。 例如,如果为工作区使用专用终结点,但 Azure 存储帐户不在 VNet 之后,则工作区和存储之间的流量出于安全原因不会使用 VNet。
保护 Azure 存储帐户
Azure 机器学习支持将存储帐户配置为使用专用终结点或服务终结点。
在 Azure 门户中,选择 Azure 存储帐户。
使用 Azure 存储的专用终结点中的信息,为以下存储资源添加专用终结点:
- Blob
- 文件
- 队列:仅计划在 Azure 机器学习管道中使用 ParallelRunStep 时需要。
- 表:仅计划在 Azure 机器学习管道中使用 ParallelRunStep 时需要。
提示
配置不是默认存储的存储帐户时,请选择与要添加的存储帐户对应的“目标子资源”类型 。
为存储资源创建专用终结点后,请在“存储帐户”的“网络”下选择“防火墙和虚拟网络”选项卡。
选择“所选网络”,然后在“资源实例”下选择 Microsoft.MachineLearningServices/Workspace 作为资源类型。 使用“实例名称”选择工作区。 有关更多信息,请参阅基于系统分配的托管标识的受信任访问。
提示
或者,可以选择“允许受信任服务列表中的 Azure 服务访问此存储帐户”,以便更广泛地允许来自受信任服务的访问。 有关详细信息,请参阅配置 Azure 存储防火墙和虚拟网络。
选择“保存” 以保存配置。
提示
使用专用终结点时,还可以禁用公共访问。 有关详细信息,请参阅禁止公共读取访问。
保护 Azure Key Vault
Azure 机器学习使用关联的 Key Vault 实例存储以下凭据:
- 关联的存储帐户连接字符串
- Azure 容器存储库实例的密码
- 数据存储的连接字符串
可以将密钥保管库配置为使用专用终结点或服务终结点。 若要在虚拟网络的后面将 Azure 机器学习试验功能与 Azure Key Vault 配合使用,请执行以下步骤:
提示
无论使用专用终结点还是服务终结点,密钥保管库都必须与工作区的专用终结点位于同一网络中。
有关将专用终结点与 Azure Key Vault 结合使用的信息,请参阅将密钥保管库与 Azure 专用链接集成。
启用 Azure 容器注册表 (ACR)
提示
如果在创建工作区时未使用现有的 Azure 容器注册表,说明可能不存在。 默认情况下,工作区不会创建 ACR 实例,除非需要。 若要强制创建,请在使用此部分中的步骤之前使用工作区训练或部署一个模型。
可以将 Azure 容器注册表配置为使用专用终结点。 使用以下步骤将工作区配置为在虚拟网络中时使用 ACR:
请使用以下方法之一查找工作区的 Azure 容器注册表的名称:
如果安装了 Azure CLI 的机器学习扩展 v1,可以运行
az ml workspace show
命令来显示工作区信息。az ml workspace show -w yourworkspacename -g resourcegroupname --query 'containerRegistry'
此命令会返回类似于
"/subscriptions/{GUID}/resourceGroups/{resourcegroupname}/providers/Microsoft.ContainerRegistry/registries/{ACRname}"
的值。 此字符串的最后一部分是工作区的 Azure 容器注册表的名称。按照以私有方式连接到 Azure 容器注册表中的步骤,限制对虚拟网络的访问权限。 添加虚拟网络时,为 Azure 机器学习资源选择虚拟网络和子网。
将工作区的 ACR 配置为允许受信任的服务进行访问。
创建 Azure 机器学习计算群集。 当 ACR 位于 VNet 后面时,将使用此群集生成 Docker 映像。 有关详细信息,请参阅创建计算群集。
使用以下方法之一配置工作区,以使用计算群集生成 Docker 映像。
重要
在对映像生成使用计算群集时,将适用以下限制:
- 仅支持 CPU SKU。
- 如果使用配置为无公共 IP 地址的计算群集,则必须为群集提供某种方法来访问公共 Internet。 访问存储在 Microsoft 容器注册表上的映像、安装在 Pypi、Conda 等上的包时,需要 Internet 访问。需要配置用户定义的路由 (UDR) 才能访问公共 IP 以访问 Internet。 例如,可以使用防火墙的公共 IP,也可以将虚拟网络 NAT 与公共 IP 配合使用。 有关详细信息,请参阅如何安全地在 VNet 中训练。
可以使用
az ml workspace update
命令设置生成计算。 对于机器学习的 v1 和 v2 Azure CLI 扩展,此命令的功能相同。 在以下命令中,将myworkspace
替换为工作区名称,将myresourcegroup
替换为包含工作区的资源组,将mycomputecluster
替换为计算群集名称:az ml workspace update --name myworkspace --resource-group myresourcegroup --image-build-compute mycomputecluster
提示
当 ACR 位于 VNet 后面时,还可以禁用对它的公共访问。
数据存储和数据集
下表列出了需要跳过验证的服务:
服务 | 是否需要跳过验证? |
---|---|
Azure Blob 存储 | 是 |
Azure 文件共享 | 是 |
Azure Data Lake Store Gen1 | 否 |
Azure Data Lake Store Gen2 | 否 |
Azure SQL 数据库 | 是 |
PostgreSQL | 是 |
注意
Azure Data Lake Store 第一代和 Lake Store 第二代默认跳过验证,因此无需执行任何操作。
下面的代码示例创建一个新的 Azure Blob 数据存储并设置 skip_validation=True
。
blob_datastore = Datastore.register_azure_blob_container(workspace=ws,
datastore_name=blob_datastore_name,
container_name=container_name,
account_name=account_name,
account_key=account_key,
skip_validation=True ) // Set skip_validation to true
使用数据集
对于下列数据集类型,用于跳过数据集验证的语法是类似的:
- 带分隔符的文件
- JSON
- Parquet
- SQL
- 文件
下面的代码创建一个新的 JSON 数据集并设置 validate=False
。
json_ds = Dataset.Tabular.from_json_lines_files(path=datastore_paths,
validate=False)
保护 Azure Monitor 和 Application Insights
若要为 Azure Monitor 和工作区的 Application Insights 实例启用网络隔离,请执行以下步骤:
在 Azure 门户中打开 Application Insights 资源。 “概述”选项卡可能具有工作区属性,也可能没有。 如果它没有该属性,请执行步骤 2。 如果有,则可以直接转到步骤 3。
提示
默认情况下,新工作区会创建基于工作区的 Application Insights 资源。 如果工作区是最近创建的,则无需执行步骤 2。
升级工作区的 Application Insights 实例。 有关如何升级的步骤,请参阅迁移到基于工作区的 Application Insights 资源。
创建 Azure Monitor 专用链接范围,并将步骤 1 中的 Application Insights 实例添加到该范围。 有关如何执行此操作的步骤,请参阅配置 Azure Monitor 专用链接。
安全连接到工作区
若要连接到 VNet 后面保护的工作区,请使用以下方法之一:
Azure VPN 网关 - 通过专用连接将本地网络连接到 VNet。 通过公共 Internet 建立连接。 可以使用两种类型的 VPN 网关:
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 机器学习工作室或 Python SDK 中,可以在工作区上运行诊断。 运行诊断后,将返回检测到的任何问题的列表。 此列表包含指向可能的解决方案的链接。 有关详细信息,请参阅如何使用工作区诊断。
后续步骤
本文是介绍如何保护 Azure 机器学习工作流系列文章的一部分。 请参阅本系列中的其他文章: