如何在Azure Machine Learning Service管道中安全使用密钥与凭据
我来帮你梳理清楚这些关于Azure Machine Learning Pipeline中安全管理机密的疑问,逐一解答如下:
关于环境变量在AML Pipeline中的可用性
你提到的“Conda不支持传递环境变量,导致本地的环境变量方式在Pipeline里失效”这个认知有一定道理,但不是完全绝对:
- 本地环境的系统环境变量确实不会自动同步到AML Pipeline的计算目标(比如Compute Cluster)中,因为这些计算资源是独立的云端环境,和本地环境隔离。
- 不过你依然可以在AML中设置环境变量——比如通过
RunConfiguration或者Environment对象来定义计算环境的环境变量,但不推荐用这种方式存储敏感信息,因为环境变量可能会在某些运行日志或环境配置中暴露,安全性不如专门的机密管理工具。
AML Workspace自动创建的Key Vault正是你需要的工具
完全正确!每个Azure Machine Learning Workspace在创建时,都会自动创建并关联一个Azure Key Vault实例(名字一般是Workspace名称加上一串随机后缀)。这个Key Vault就是专门为AML Workspace设计的敏感信息存储容器,不管是数据库密码、API密钥、连接字符串还是其他类型的机密,都可以安全存在这里,完美匹配你的需求。
如何使用AML关联的Key Vault管理机密
使用这个Key Vault的流程非常清晰,分三步走:
1. 往Key Vault里添加机密
你有两种方式添加:
- Azure门户操作:找到Workspace对应的Key Vault,进入「机密」选项卡,点击「生成/导入」,输入机密的名称和值,保存即可(注意机密名称最好有辨识度,比如
sql-db-password、openai-api-key)。 - AML SDK操作:如果需要代码化管理,可以用SDK直接添加:
from azureml.core import Workspace # 加载Workspace配置(本地需要有config.json) ws = Workspace.from_config() # 获取默认关联的Key Vault keyvault = ws.get_default_keyvault() # 添加机密 keyvault.set_secret(name="sql-db-password", value="your-secure-password-here")
2. 在Pipeline脚本中安全获取机密
在你的数据准备、训练等脚本里,不需要明文写密码,只要通过AML SDK从Key Vault拉取即可:
from azureml.core import Workspace ws = Workspace.from_config() keyvault = ws.get_default_keyvault() # 获取指定机密 db_password = keyvault.get_secret(name="sql-db-password") # 接下来就可以用这个密码连接数据库或者其他服务了
3. 确保计算目标有访问权限
默认情况下,AML自带的Compute Cluster、Compute Instance等计算资源会被自动授予访问这个Key Vault的权限,不需要额外配置。但如果是你自己创建的外部计算资源,就得去Key Vault的「访问策略」里,给该计算资源的服务主体添加「获取机密」的权限。
其他安全管理机密的备选方法
除了Key Vault,还有几种场景化的安全方案:
- 使用AML Datastore:对于数据库、存储账户这类数据源,可以创建AML Datastore,连接凭据会自动存在Key Vault里。在Pipeline中直接调用Datastore来访问数据,完全不需要在脚本里处理敏感信息。
- 使用SecretParameter:定义Pipeline Step时,用
SecretParameter来传递机密,这样参数值不会被记录在Pipeline的运行日志或历史记录里,避免泄露:from azureml.pipeline.core import SecretParameter # 定义机密参数 api_secret = SecretParameter(name="openai-api-key") # 在Step中使用这个参数,脚本里通过命令行参数获取即可 - 安全设置环境变量:如果你习惯用环境变量的方式,可以在AML的
Environment对象中设置,但值从Key Vault获取,再把这个环境关联到你的Pipeline Step:from azureml.core import Environment ws = Workspace.from_config() keyvault = ws.get_default_keyvault() env = Environment.get(ws, name="your-custom-environment") # 从Key Vault获取值,设置为环境变量 env.environment_variables["OPENAI_API_KEY"] = keyvault.get_secret(name="openai-api-key")
补充:Azure SQL数据库的推荐处理方式
正如你补充说明的,对于Azure SQL数据库的连接,强烈推荐使用DataTransferStep。它可以直接关联AML的Azure SQL Datastore,而Datastore的连接凭据已经安全存在Key Vault中,全程不需要在脚本里写任何敏感信息,示例代码如下:
from azureml.pipeline.steps import DataTransferStep from azureml.core.datastore import Datastore ws = Workspace.from_config() # 获取预先创建好的Azure SQL Datastore sql_datastore = Datastore.get(ws, name="my-sql-datastore") # 创建数据迁移Step transfer_step = DataTransferStep( name="load-sql-data", source_datastore=sql_datastore, source_query="SELECT * FROM customer_data", target_datastore=ws.get_default_datastore(), target_path="sql_imported_data/", compute_target="your-compute-cluster" )
内容的提问来源于stack exchange,提问作者Arvid Bärnhielm

