使用 SDK v1 为 Azure 机器学习资源和工作流设置身份验证

适用于:Python SDK azureml v1

了解如何对 Azure 机器学习工作区设置身份验证。 在大多数情况下,Azure 机器学习工作区的身份验证基于 Azure Active Directory (Azure AD)。 通常,在连接到工作区时可使用 4 种身份验证工作流:

  • 交互式:你可以使用 Azure Active Directory 中的帐户直接进行身份验证,或者使用它来获取用于身份验证的令牌。 在试验和迭代开发期间,使用交互式身份验证。 借助交互式身份验证,可基于每位用户控制对资源(例如 Web 服务)的访问。

  • 服务主体:在 Azure Active Directory 中创建一个服务主体帐户,并使用它来进行身份验证或获取令牌。 当需要使用自动化过程向服务进行身份验证时,将使用服务主体,无需用户交互。 例如连续集成和部署脚本,它可以在训练代码每次发生更改时对模型进行训练和测试。

  • Azure CLI 会话:使用活动 Azure CLI 会话进行身份验证。 在试验和迭代开发期间使用 Azure CLI 身份验证,或者当你需要使用预先认证的会话来对服务自动完成身份验证过程时也可以使用 Azure CLI 身份验证。 你可以通过本地工作站上的 Azure CLI 登录到 Azure,而无需在 Python 代码中存储凭据,也无需提示用户进行身份验证。 同样,你可以在持续集成和部署管道中重复使用相同的脚本,同时使用服务主体标识对 Azure CLI 进行身份验证。

  • 托管标识:在 Azure 虚拟机上使用 Azure 机器学习 SDK 时,可使用 Azure 的托管标识。 此工作流允许 VM 使用托管标识连接到工作区,无需在 Python 代码中存储凭据或提示用户进行身份验证。 训练模型时,还可配置 Azure 机器学习计算群集和计算实例来使用托管标识访问工作区。

无论使用何种身份验证工作流,都可使用 Azure 基于角色的访问控制 (Azure RBAC) 来限定允许拥有的资源访问权限(授权)级别。 例如,管理员或自动化过程可能具有创建计算实例的权限,但不使用它,而数据科学家可能会使用它,但不能删除或创建它。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问权限

Azure AD 条件访问可用于进一步控制或限制对每个身份验证工作流的工作区的访问。 例如,管理员可以仅允许从托管设备访问工作区。

先决条件

Azure Active Directory

工作区的所有身份验证工作流都依赖于 Azure Active Directory。 如果希望用户使用个人帐户进行身份验证,这些用户必须在 Azure AD 中有帐户。 如果希望使用服务主体,这些主体必须位于 Azure AD 中。 托管标识也是 Azure AD 的一项功能。

有关 Azure AD 的详细信息,请参阅什么是 Azure Active Directory 身份验证

创建 Azure AD 帐户后,请参阅管理对 Azure 机器学习工作区的访问权限,了解如何在 Azure 机器学习中授予帐户对工作区和其他操作的访问权限。

配置服务主体

若要使用服务主体 (SP),必须首先创建 SP。 然后授予它访问工作区的权限。 如前文所述,将使用 Azure 基于角色的访问控制 (Azure RBAC) 来控制访问,因此你还必须确定要授予 SP 的访问权限。

重要

使用服务主体时,请向它授予它所用于的任务所需的最低访问权限。 例如,如果服务主体仅用于读取 Web 部署的访问令牌,则不要向服务主体授予所有者或参与者访问权限。

授予最低访问权限的原因是服务主体使用密码进行身份验证,并且该密码可以存储为自动化脚本的一部分。 如果密码泄漏,由于用户仅拥有执行特定任务所需的最低访问权限,因此可最大程度地减少对 SP 的恶意使用。

创建 SP 并向其授予对工作区的访问权限的最简单方法是使用 Azure CLI。 若要创建服务主体并向其授予对工作区的访问权限,请执行以下步骤:

注意

你必须是订阅的管理员才能执行所有这些步骤。

  1. 对 Azure 订阅进行身份验证:

    az login
    

    如果 CLI 可以打开默认的浏览器,则它会打开该浏览器并加载登录页。 否则,需要打开浏览器并按照命令行中的说明操作。 按说明操作时,需要浏览到 https://aka.ms/deviceloginchina 并输入授权代码。

    如果你拥有多个 Azure 订阅,可使用 az account set -s <subscription name or ID> 命令设置订阅。 有关详细信息,请参阅使用多个 Azure 订阅

    有关其他身份验证方法,请参阅使用 Azure CLI 登录

  2. 创建服务主体。 在以下示例中,将创建一个名为 ml-auth 的 SP:

    az ad sp create-for-rbac --sdk-auth --name ml-auth --role Contributor --scopes /subscriptions/<subscription id>
    

    输出将是类似于如以下所示的 JSON。 记下 clientIdclientSecrettenantId 字段,因为在本文的其他步骤中需要用到它们。

    {
        "clientId": "your-client-id",
        "clientSecret": "your-client-secret",
        "subscriptionId": "your-sub-id",
        "tenantId": "your-tenant-id",
        "activeDirectoryEndpointUrl": "https://login.partner.microsoftonline.cn",
        "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn",
        "activeDirectoryGraphResourceId": "https://graph.chinacloudapi.cn",
        "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:5555",
        "galleryEndpointUrl": "https://gallery.azure.com/",
        "managementEndpointUrl": "https://management.core.chinacloudapi.cn"
    }
    
  3. 使用上一步返回的 clientId 值检索服务主体的详细信息:

    az ad sp show --id your-client-id
    

    下面的 JSON 是命令的输出的简化示例。 记下 objectId 字段,因为在接下来的步骤中需要用到它的值。

    {
        "accountEnabled": "True",
        "addIns": [],
        "appDisplayName": "ml-auth",
        ...
        ...
        ...
        "objectId": "your-sp-object-id",
        "objectType": "ServicePrincipal"
    }
    
  4. 若要授予对 Azure 机器学习使用的工作区和其他资源的访问权限,请按以下文章中的要求操作:

    重要

    所有者访问权限允许服务主体在工作区中执行几乎所有操作。 本文档中使用它来演示如何授予访问权限;在生产环境中,Azure 建议仅向服务主体授予行使目标角色职能所需的最低访问权限。 若要了解如何创建具有方案所需的访问权限的自定义角色,请参阅管理对 Azure 机器学习工作区的访问权限

配置托管标识

重要

仅当从 Azure 虚拟机或通过 Azure 机器学习计算群集或计算实例使用 Azure 机器学习 SDK 时,托管标识才受支持。

VM 的托管标识

  1. 对 VM 上的 Azure 资源启用系统分配的托管标识

  2. Azure 门户中,选择工作区,然后选择“访问控制(IAM)”。

  3. 依次选择“添加”、“添加角色分配”,以打开“添加角色分配”页 。

  4. 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 要分配的角色。
    将访问权限分配到 托管标识
    成员 你之前创建的托管标识

    Azure 门户中的“添加角色分配”页。

计算群集的托管标识

有关详细信息,请参阅为计算群集设置托管标识

使用交互式身份验证

重要

交互式身份验证使用浏览器并需要 Cookie(包括第三方 Cookie)。 如果禁用了 cookie,则可能会收到“无法登录”等错误。如果已启用 Azure AD 多重身份验证,则也可能发生此错误。

文档和样本中的大多数示例都使用交互式身份验证。 例如,当使用 SDK 时,有两个函数调用会自动提示你使用基于 UI 的身份验证流:

  • 调用 from_config() 函数会触发提示。

    from azureml.core import Workspace
    ws = Workspace.from_config()
    

    函数 from_config() 查找包含工作区连接信息的 JSON 文件。

  • 使用 Workspace 构造函数来提供订阅、资源组和工作区信息时,系统也会提示你进行交互式身份验证。

    ws = Workspace(subscription_id="your-sub-id",
                  resource_group="your-resource-group-id",
                  workspace_name="your-workspace-name"
                  )
    

提示

如果你可访问多个租户,则可能需要导入类并显式定义目标租户。 与上述调用类似,为 InteractiveLoginAuthentication 调用构造函数也会提示你登录。

from azureml.core.authentication import InteractiveLoginAuthentication
interactive_auth = InteractiveLoginAuthentication(tenant_id="your-tenant-id")

使用 Azure CLI 时,可使用 az login 命令对 CLI 会话进行身份验证。 有关详细信息,请参阅 Azure CLI 入门

提示

如果你从之前使用 Azure CLI 以交互方式进行身份验证的环境中使用 SDK,则可通过 CLI 缓存的凭据使用 AzureCliAuthentication 类对工作区进行身份验证:

from azureml.core.authentication import AzureCliAuthentication
cli_auth = AzureCliAuthentication()
ws = Workspace(subscription_id="your-sub-id",
               resource_group="your-resource-group-id",
               workspace_name="your-workspace-name",
               auth=cli_auth
               )

使用服务主体身份验证

若要从 SDK 中使用服务主体向工作区进行身份验证,请使用 ServicePrincipalAuthentication 类构造函数。 使用创建服务提供程序时获得的值作为参数。 tenant_id 参数映射到上述的 tenantIdservice_principal_id 映射到 clientIdservice_principal_password 映射到 clientSecret

from azureml.core.authentication import ServicePrincipalAuthentication

sp = ServicePrincipalAuthentication(tenant_id="your-tenant-id", # tenantID
                                    service_principal_id="your-client-id", # clientId
                                    service_principal_password="your-client-secret") # clientSecret

sp 变量现在包含身份验证对象,可直接在 SDK 中使用。 通常,建议将上述 ID/机密存储在环境变量中,如下面的代码所示。 存储在环境变量中可防止将信息意外地签入到 GitHub 存储库中。

import os

sp = ServicePrincipalAuthentication(tenant_id=os.environ['AML_TENANT_ID'],
                                    service_principal_id=os.environ['AML_PRINCIPAL_ID'],
                                    service_principal_password=os.environ['AML_PRINCIPAL_PASS'])

对于在 Python 中运行并主要使用 SDK 的自动化工作流,在大多数情况下,都可按原样使用此对象进行身份验证。 以下代码使用你创建的身份验证对象向你的工作区进行身份验证。

from azureml.core import Workspace

ws = Workspace.get(name="ml-example",
                   auth=sp,
                   subscription_id="your-sub-id",
                   resource_group="your-rg-name")
ws.get_details()

使用托管标识身份验证

若要从配置有托管标识的 VM、计算群集或计算实例对工作区进行身份验证,请使用 MsiAuthentication 类。 以下示例演示如何使用此类对工作区进行身份验证:

from azureml.core.authentication import MsiAuthentication

msi_auth = MsiAuthentication()

ws = Workspace(subscription_id="your-sub-id",
                resource_group="your-resource-group-id",
                workspace_name="your-workspace-name",
                auth=msi_auth
                )

使用条件访问

作为管理员,你可以为登录到工作区的用户强制实施 Azure AD 条件性访问策略。 例如,你可以要求双因素身份验证,或者仅允许从托管设备登录。 要专门对 Azure 机器学习工作区使用条件访问,请将条件访问策略分配给名为 Azure 机器学习的应用。 应用 ID 为 0736f41a-0425-bdb5-1563eff02385

后续步骤