共用方式為

在 Azure 机器学习作业中使用身份验证凭据密钥

适用于:Python SDK azure-ai-ml v2(当前版本)

身份验证信息(如用户名和密码)是机密。 例如,如果连接到外部数据库以查询训练数据,则需要将用户名和密码传递给远程作业上下文。 以明文形式将此类值编码为训练脚本是不安全的,因为它公开了机密。

Azure Key Vault 提供机密的安全存储和检索。 本文介绍如何从计算群集上运行的训练作业检索存储在密钥保管库中的机密。

重要

使用 适用于 Python 的 Azure Key Vault 机密客户端库 来存储和检索机密。 Azure 机器学习 SDK v2 提供连接到密钥保管库所需的工作区信息。

先决条件

在按照本文中的步骤操作之前,请确保满足以下先决条件:

提示

本节中的许多先决条件需要在您的 Azure 订阅或包含资源的 Azure 资源组中具有贡献者、所有者或同等的访问权限。 你可能需要与 Azure 管理员联系,让他们执行这些操作。

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 尝试试用版订阅

  • Python 3.10 或更高版本。 和azure-keyvault-secretsazure-identity包需要 Python 3.9 或更高版本,但建议使用 Python 3.10 或更高版本。

  • Azure 机器学习工作区。 如果没有,可以按照创建资源以开始使用一文中的步骤创建一个。

  • 一个用于管理和保护密钥的 Azure Key Vault。 如果你使用了创建资源以开始一文来创建工作区,那么密钥库已经为你创建好了。 还可以使用快速入门中的信息创建单独的 密钥保管库实例:创建密钥保管库 文章。

    提示

    无需使用与工作区相同的密钥保管库。

  • (可选)配置为使用托管标识的 Azure 机器学习计算群集。 群集可以配置为使用系统分配的托管标识或用户分配的托管标识。

  • 如果作业会在计算群集上运行,请向计算群集的托管标识授予对密钥保管库中存储的机密的访问权限。 或者,如果作业会在无服务器计算上运行,则向为该作业指定的托管标识授予对机密的访问权限。 用于授予访问权限的方法取决于密钥保管库的配置方式:

  • 密钥保管库中存储的机密值。 可以使用键检索此值。 有关详细信息,请参阅快速入门:在 Azure Key Vault 中设置和检索机密

    提示

    快速入门链接指向使用 Azure Key Vault Python SDK 的步骤。 左侧边栏选项卡中的目录内的链接指向其他密钥设置方法。

获取密钥保管库 URL

创建 Azure 机器学习工作区时,会随它一起预配默认密钥保管库。 使用 MLClient 以编程方式检索保管库的 URL。

from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

subscription_id = "<subscription-id>"
resource_group = "<resource-group>"
workspace_name = "<workspace-name>"

ml_client = MLClient(
    DefaultAzureCredential(),
    subscription_id=subscription_id,
    resource_group_name=resource_group,
    workspace_name=workspace_name,
)

workspace = ml_client.workspaces.get(workspace_name)
key_vault_arm_id = workspace.key_vault
vault_name = key_vault_arm_id.split("/")[-1]
vault_url = f"https://{vault_name}.vault.azure.cn/"
print(vault_url)  # https://<your-vault-name>.vault.azure.cn/

然后,可以将此值 vault_url 作为环境变量传递给训练作业,如以下示例所示。

提示

还可以导航到工作区并选择“概述”,在 Azure 门户中找到密钥保管库 URL。 密钥保管库在工作区属性中列出。

获取密钥

可以通过两种方式在训练期间获取机密:

  • 使用与训练作业运行所在的计算资源相关联的托管标识。
  • 通过让计算系统代表你执行作业,使用你的个人身份。
  1. azure-keyvault-secretsazure-identity 包添加到用于训练模型的 Azure 机器学习环境 。 例如,将它们添加到用于生成环境的 conda 文件。

    使用此环境生成训练作业在计算群集上运行的 Docker 映像。

  2. 在训练代码中,使用 Azure 标识 SDKKey Vault 客户端库 获取托管标识凭据,并向 Key Vault 进行身份验证。 环境变量 KEY_VAULT_URL 会在提交过程中传输到作业(请参阅步骤 3):

    import os
    from azure.identity import DefaultAzureCredential
    from azure.keyvault.secrets import SecretClient
    
    credential = DefaultAzureCredential()
    
    vault_url = os.environ["KEY_VAULT_URL"]
    secret_client = SecretClient(vault_url=vault_url, credential=credential)
    

    提示

    在生产环境中,将 AZURE_TOKEN_CREDENTIALS 环境变量设置为 ManagedIdentityCredential 仅将 DefaultAzureCredential 链限制为托管标识凭据。 此更改可缩短启动时间并减少歧义性。

  3. 进行身份验证后,使用 Key Vault 客户端库通过提供关联的密钥来检索机密:

    secret = secret_client.get_secret("secret-name")
    print(secret.value)
    
  4. 提交训练作业时,将密钥保管库 URL 作为环境变量传递。 使用在vault_url中检索的值:

    from azure.ai.ml import command
    
    job = command(
        code="./src",
        command="python train.py",
        environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu:1",
        compute="cpu-cluster",
        environment_variables={"KEY_VAULT_URL": vault_url},
    )
    
    ml_client.jobs.create_or_update(job)
    

有关使用 Azure 机器学习 Python SDK v2 提交训练作业的示例,请参阅 使用 Python SDK v2 训练模型