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

适用于:Python SDK azureml v1

本文介绍如何在训练作业中安全使用机密。 身份验证信息(例如用户名和密码)是机密。 例如,如果连接到外部数据库来查询训练数据,则需要将用户名和密码传递到远程作业上下文。 将此类值编码为明文中的训练脚本是不安全的,因为该过程会暴露机密。

相反,你的 Azure 机器学习工作区有一个称为 Azure Key Vault 的关联资源。 使用此密钥保管库,可通过 Azure 机器学习 Python SDK 中的一组 API 安全将机密传递给远程作业。

使用机密的标准流程是:

  1. 在本地计算机上,登录到 Azure 并连接到你的工作区。
  2. 在本地计算机上,在“工作区密钥保管库”中设置机密。
  3. 提交远程作业。
  4. 在远程作业中,从密钥保管库获取机密并使用它。

设置机密

在 Azure 机器学习中,Keyvault 类包含用于设置机密的方法。 在本地 Python 会话中,首先获取对工作区密钥保管库的引用,然后使用 set_secret() 方法通过名称和值来设置机密。 如果名称已存在,set_secret 方法会更新该密钥值。

from azureml.core import Workspace
from azureml.core import Keyvault
import os


ws = Workspace.from_config()
my_secret = os.environ.get("MY_SECRET")
keyvault = ws.get_default_keyvault()
keyvault.set_secret(name="mysecret", value = my_secret)

不要将机密值放在 Python 代码中,因为将其以明文形式存储在文件中不安全。 应从环境变量中获取机密值(例如 Azure DevOps 生成机密)或从交互式用户输入中获取机密值。

你可以使用 list_secrets() 方法列出机密名称,此方法还有一个批处理版本 set_secrets(),允许你一次设置多个机密。

重要

使用 list_secrets() 只会列出使用 Azure 机器学习 SDK 通过 set_secret()set_secrets() 创建的机密。 不会列出由 SDK 外的其他方式创建的机密。 例如,不会列出使用 Azure 门户或 Azure PowerShell 创建的机密。

无论机密是通过什么方式创建的,都可以使用 get_secret() 从密钥保管库中获取机密值。 因此,可以检索 list_secrets() 未列出的机密。

获取机密

在本地代码中,可以使用 get_secret() 方法通过名称来获取机密值。

对于提交了 Experiment.submit 的作业,请将 get_secret() 方法与 Run 类结合使用。 由于提交的运行知晓其工作区,因此此方法会绕过工作区实例化,直接返回密钥值。

# Code in submitted job
from azureml.core import Experiment, Run

run = Run.get_context()
secret_value = run.get_secret(name="mysecret")

请注意不要将机密值写出或打印出来而导致机密值暴露。

还有一个批处理版本 get_secrets(),用于同时访问多个机密。