使用网络隔离保护托管联机终结点

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

本文介绍如何使用网络隔离来提高 Azure 机器学习托管联机终结点的安全性。 网络隔离有助于保护您的终结点的入站和出站通信安全。

为了确保入站通信的安全,可以创建一个使用 Azure 机器学习工作区专用终结点的托管联机终结点。 为了仅允许经过批准的出站通信进行部署,可以使用托管虚拟网络配置工作区。 本文介绍如何执行这些步骤来提高终结点安全性。 它还演示如何创建一个使用工作区托管虚拟网络的专用终结点进行出站通信的部署。

若要使用旧方法进行网络隔离,请参阅 azureml-examples GitHub 存储库中的以下部署文件示例:

先决条件

  • 一份 Azure 订阅。 如果没有 Azure 订阅,可在开始前创建一个试用帐户。

  • 安装并配置 Azure CLI 和 Azure CLI ml 扩展。 有关详细信息,请参阅安装和设置 CLI (v2)。

    提示

    请确保已安装最新版本的 ml 扩展。 若要更新,请运行 az extension update -n ml。

  • Bash shell 或兼容的 shell,例如 Linux 系统或 适用于 Linux 的 Windows 子系统上的 shell。 本文中的 Azure CLI 示例假定你使用这种类型的 shell。

  • 您或您使用的服务主体拥有“贡献者”访问权限的 Azure 资源组。 有关创建资源组的说明,请参阅 “设置”。

  • 如果想使用托管标识来创建和管理联机终结点和联机部署,则需要一个具有适当权限的用户分配的托管标识。 有关所需权限的详细信息,请参阅 在 Azure 机器学习和其他服务之间设置身份验证。 例如,需要为 Azure 密钥保管库 授予托管标识特定的 Azure 基于角色的访问控制 (Azure RBAC) 权限。

从旧网络隔离方法迁移到工作区托管虚拟网络

如果使用 旧方法 进行托管联机终结点的网络隔离,并且想要迁移到托管虚拟网络来保护终结点,请执行以下步骤:

  1. 创建新的工作区并启用托管虚拟网络。 有关如何为工作区配置托管网络的详细信息,请参阅 工作区托管虚拟网络隔离。
  2. (可选)如果部署访问 Azure 存储、密钥保管库 和 Azure 容器注册表以外的专用资源,请将出站规则添加到工作区的网络设置。 具体而言,网络默认使用 Azure 存储、密钥保管库 和容器注册表的规则进行配置。 为使用的任何其他专用资源添加具有专用终结点的规则。
  3. (可选)如果打算使用 Azure 机器学习注册表,请配置专用终结点,以便与注册表、其存储帐户和容器注册表实例进行出站通信。
  4. 在新工作区中创建联机终结点和部署。 如果使用 Azure 机器学习注册表,可以直接从它们部署组件。 有关详细信息,请参阅在工作区中将模型从注册表部署到联机终结点。
  5. 更新调用终结点的应用程序,以便应用程序使用新联机终结点的评分 URI。
  6. 验证新终结点后,删除旧工作区中的联机终结点。

如果不需要在迁移期间避免停机,可以采用更直接的方法。 如果不需要在旧工作区中维护计算实例、联机终结点和部署,可以删除计算实例,然后更新工作区以启用托管虚拟网络。

限制

  • 标志 v1_legacy_mode 必须设置为 false 关闭 Azure 机器学习工作区上的 v1 旧模式。 如果打开此设置,则无法创建受管在线端点。 有关详细信息,请参阅 Azure 资源管理器上的新 API 平台的网络隔离更改。

  • 如果 Azure 机器学习工作区具有在 2022 年 5 月 24 日之前创建的专用终结点,则必须在将联机终结点配置为使用专用终结点之前重新创建该专用终结点。 有关为工作区创建专用终结点的详细信息,请参阅 为 Azure 机器学习工作区配置专用终结点。

    提示

    若要查看工作区的创建日期,可以查看工作区属性。

    1. 在 Azure 机器学习工作室中,转到右上角并选择工作区的名称。
    2. 在“目录 + 订阅 + 工作区”窗口中,选择“ 查看 Azure 门户中的所有属性”。
    3. 在 Azure 门户“概述”页中,转到右上角并选择 “JSON 视图”。
    4. 在“资源 JSON”窗口中的 “API 版本”下,选择最新的 API 版本。
    5. 在 properties JSON 代码的部分中,检查 creationTime 值。

    或者,使用以下方法之一:

    • Python SDK: Workspace.get(name=<workspace-name>, subscription_id=<subscription-ID>, resource_group=<resource-group-name>).get_details()
    • REST API: curl https://management.chinacloudapi.cn/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/?api-version=2023-10-01 -H "Authorization:Bearer <access-token>"
    • PowerShell:Get-AzMLWorkspace -Name <workspace-name> -ResourceGroupName <resource-group-name>
  • 使用网络隔离来帮助保护联机终结点时,可以使用与你的工作区资源组不同的资源组中的工作区关联的资源。 但这些资源必须属于与工作区相同的订阅和租户。 与工作区关联的资源包括 Azure 容器注册表、Azure 存储、Azure 密钥保管库 和 Application Insights。

注意

本文介绍适用于数据平面操作的网络隔离。 这些操作源自评分请求或模型服务。 控制平面的操作(例如创建、更新、删除或检索身份验证密钥的请求)通过公共网络发送到 Azure 资源管理器。

准备系统

重要

如果与 Azure 机器学习 工作区关联的 Azure 密钥保管库 已禁用公共网络访问或启用了防火墙限制,则必须在密钥保管库上启用 允许受信任的 Microsoft 服务绕过此防火墙。 即使为密钥保管库配置专用终结点,此要求也适用。

Azure 机器学习通过其服务端基础结构在密钥保管库中存储和检索工作区机密。 虚拟网络或工作区托管虚拟网络中的专用终结点不会替换此服务端访问所需的受信任服务旁路。

绕过不会授予对每个Azure服务的访问权限。 只有符合条件的受信任服务才能使用它,请求仍必须使用Microsoft Entra ID进行身份验证,并具有所需的 Azure RBAC 权限或密钥保管库访问策略权限。 有关详细信息,请参阅Azure 密钥保管库受信任的服务。

  1. 通过运行以下命令创建环境变量。 将 <resource-group-name> 替换为工作区的资源组。 将 <workspace-name> 替换为工作区的名称。

    export RESOURCEGROUP_NAME="<resource-group-name>"
    export WORKSPACE_NAME="<workspace-name>"
    
  2. 创建工作区。 参数 -m allow_only_approved_outbound 会为工作区配置托管虚拟网络,并阻止出站流量,但发往批准的目标的流量除外。

    az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_only_approved_outbound
    

    或者,如果你希望允许部署将出站流量发送到 Internet,请对以下代码取消注释并改为运行它。

    # az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_internet_outbound
    
    For more information about how to create a new workspace or upgrade your existing workspace to use a managed virtual network, see [Configure a managed virtual network to allow internet outbound](how-to-managed-network.md#configure-a-managed-virtual-network-to-allow-internet-outbound).
    
    
  3. 预配托管虚拟网络。 有关说明和详细信息,请参阅 手动配置托管虚拟网络。

    提示

    您可以通过在 --provision-network-now 命令中添加 az ml workspace create,将工作区创建和网络预配合并为一个步骤。

    重要

    首次为工作区设置托管虚拟网络时,不会预配该网络。 在预配托管网络之前,无法创建联机部署。

  4. 配置与工作空间关联的容器注册表,使其使用高级定价计划。 需要此设置才能通过专用终结点提供对注册表的访问权限。 有关详细信息,请参阅 Azure 容器注册表服务层级。

  5. 将工作区配置为使用计算群集或计算实例生成映像。 将 image_build_compute 属性用于此目的。 有关详细信息和说明,请参阅 “配置映像生成”。

  6. 为 Azure CLI 配置默认值,以便无需多次传入工作区和资源组的值。

    az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
    
  7. 克隆示例存储库以获取终结点和部署的示例文件,然后转到存储库的 cli 目录。

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli
    

本文中的命令位于 deploy-managed-online-endpoint-workspacevnet.sh 目录中的 cli 文件中。 YAML 配置文件位于 endpoints/online/managed/sample/ 子目录中。

创建安全的托管联机终结点

若要创建安全的托管联机终结点,请在工作区中创建终结点。 然后将终结点 public_network_access 的值设置为 disabled 控制入站通信。

此设置强制联机终结点使用工作区的专用终结点进行入站通信。 调用联机终结点的唯一方法是使用可访问虚拟网络中工作区的专用终结点。 有关详细信息,请参阅 保护入站评分请求 并为 Azure 机器学习工作区配置专用终结点。

由于工作区配置为具有托管虚拟网络,因此任何终结点部署都使用托管虚拟网络的专用终结点进行出站通信。

  1. 设置终结点的名称:

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. 创建一个终结点,并将public_network_access设置为disabled以阻止入站流量。

    注意

    引用的脚本使用克隆存储库中的 YAML 配置文件。 请确保在克隆存储库后位于正确的 cli 目录中,或者提供 YAML 文件的完整路径。 在 Azure Cloud Shell 中,在运行命令之前,请在云存储中验证文件是否可访问。

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml --set public_network_access=disabled
    

    若要允许终结点从 Internet 接收评分请求,请取消注释以下代码并改为运行它:

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

测试终结点

  1. 在工作区的托管虚拟网络中创建部署:

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    

    如果遇到有关授权失败的错误,请检查工作区存储帐户的网络配置。 可能需要调整公用网络访问设置,使工作区能够访问存储帐户。

  2. 获取部署的状态:

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  3. 通过发出评分请求测试终结点:

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  4. 获取部署日志:

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    

清理资源

  1. 如果不再需要终结点,请运行以下命令将其删除。

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  2. 如果不再需要工作区、其关联的资源以及资源组中的其他资源,请将其删除。 将 <resource-group-name> 替换为包含工作区的资源组名称。

    az group delete --resource-group <resource-group-name>
    

故障排除

联机终结点创建失败并显示一条有关 v1 旧版模式的消息

托管联机终结点是 Azure 机器学习 v2 API 平台的一项功能。 如果 Azure 机器学习工作区配置为 v1 版本旧模式,则托管的在线终结点将不起作用。 具体而言,如果 v1_legacy_mode 工作区设置设置为 true,则 v1 旧模式处于打开状态,并且不支持 v2 API。

若要了解如何关闭 v1 旧模式,请参阅 Azure 资源管理器上的新 API 平台的网络隔离更改。

重要

在将 v1_legacy_mode 设置为 false 之前,请与网络安全团队联系,因为 v1 旧模式可能是由于某种原因而被开启的。

使用基于密钥的身份验证创建联机终结点失败

使用以下命令列出工作区的 Azure 密钥保管库的网络规则。 将 <key-vault-name> 替换为你的密钥保管库名称。

az keyvault network-rule list -n <key-vault-name>

此命令的响应类似于以下 JSON 代码:

{
    "bypass": "AzureServices",
    "defaultAction": "Deny",
    "ipRules": [],
    "virtualNetworkRules": []
}

如果值bypass不是AzureServices,请使用“配置 Azure 密钥保管库 网络设置”中的指南将其设置为AzureServices。

联机部署失败并出现映像下载错误

注意

将 旧网络隔离方法用于托管联机终结点时,会出现此问题。 在此方法中,Azure 机器学习为终结点下的每个部署创建托管虚拟网络。

  1. 检查部署的 egress-public-network-access 标志值是否为 disabled。 如果此标志已启用,并且容器注册表的可见性为“专用”,则预期会发生这种失败。

  2. 使用以下命令检查专用终结点连接的状态。 请将 <registry-name> 替换为你的工作区的 Azure 容器注册表名称:

    az acr private-endpoint-connection list -r <registry-name> --query "[?privateLinkServiceConnectionState.description=='Egress for Microsoft.MachineLearningServices/workspaces/onlineEndpoints'].{ID:id, status:privateLinkServiceConnectionState.status}"
    

    在响应代码中,验证 status 字段是否设置为 Approved。 如果未指定该值 Approved,请使用以下命令批准连接。 将 `<private-endpoint-connection-ID>` 替换为上述命令返回的 ID。

    az network private-endpoint-connection approve --id <private-endpoint-connection-ID> --description "Approved"
    

无法解析评分终结点

  1. 验证发出评分请求的客户端是否为可以访问 Azure 机器学习工作区的虚拟网络。

  2. 使用 nslookup 命令在终结点主机名上以检索 IP 地址信息。

    nslookup <endpoint-name>.<endpoint-region>.inference.ml.azure.cn
    

    例如,命令可能类似于以下命令:

    nslookup endpointname.westcentralus.inference.ml.azure.com
    

    响应中包含地址,该地址应在虚拟网络提供的范围内。

    注意

    • 对于 Kubernetes 联机终结点,终结点主机名应为 Kubernetes 群集中指定的 CName (域名)。
    • 如果终结点使用 HTTP,则 IP 地址包含在可从工作室 UI 获取的终结点 URI 中。
    • 有关获取终结点 IP 地址的更多方法,请参阅 使用 FQDN 更新 DNS。
  3. 如果nslookup命令无法解析主机名,请采取以下部分之一的行动。

托管联机终结点

  1. 使用以下命令检查虚拟网络的专用域名系统(DNS)区域中是否存在 A 记录。

    az network private-dns record-set list -z privatelink.api.azureml.ms -o tsv --query [].name
    

    结果应包含类似于 *.<GUID>.inference.<region> 的条目。

  2. 如果未返回推理值,请删除工作区的专用终结点,然后重新创建它。 有关详细信息,请参阅如何配置专用终结点。

  3. 如果具有专用终结点的工作区 使用自定义 DNS 服务器,请运行以下命令以验证自定义 DNS 服务器的解析是否正常工作:

    dig <endpoint-name>.<endpoint-region>.inference.ml.azure.com
    

Kubernetes 联机终结点

  1. 请检查 Kubernetes 群集中的 DNS 配置。

  2. 检查 Azure 机器学习推理路由器 azureml-fe是否按预期工作。 若要执行此检查,请执行以下步骤:

    1. 在 azureml-fe Pod 中运行以下命令:

      kubectl exec -it deploy/azureml-fe -- /bin/bash
      
    2. 运行下列命令之一:

      curl -vi -k https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
      "Swagger not found"
      

      对于 HTTP,请使用以下命令:

      curl https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
      "Swagger not found"
      
  3. 如果 curl HTTPS 命令失败或超时,但 HTTP 命令有效,请检查证书是否有效。

  4. 如果前面的进程未能解析为 A 记录,请使用以下命令验证从 Azure DNS 虚拟公共 IP 地址 168.63.129.16 解析是否有效:

    dig @168.63.129.16 <endpoint-name>.<endpoint-region>.inference.ml.azure.com
    
  5. 如果上述命令成功,请对自定义 DNS 上的 Azure 专用链接的条件转发器进行故障排除。

无法对联机部署评分

  1. 运行以下命令以查看无法评分的部署的状态:

    az ml online-deployment show -e <endpoint-name> -n <deployment-name> --query '{name:name,state:provisioning_state}' 
    

    Succeeded字段的值为state表示部署成功。

  2. 对于成功的部署,使用以下命令检查流量是否已分配到部署:

    az ml online-endpoint show -n <endpoint-name>  --query traffic
    

    此命令的响应应列出分配给每个部署的流量百分比。

    提示

    如果在请求中使用 azureml-model-deployment 标头将此部署定为目标,则不必执行此步骤。

  3. 如果正确设置了流量分配或部署标头,请使用以下命令获取终结点的日志:

    az ml online-deployment get-logs  -e <endpoint-name> -n <deployment-name> 
    
  4. 检查日志,以了解在向部署提交请求时运行评分代码是否存在问题。