ADF自定义活动如何通过服务主体安全访问Azure Key Vault
如何让ADF+Azure Batch的自定义活动安全访问Azure Key Vault
这是个很典型的安全需求——既要访问Key Vault,又绝对不能硬编码凭据,我来给你梳理两个靠谱的方案,优先推荐托管标识的方式,因为完全不用管理密钥:
方案一:使用Azure Batch池的托管标识(推荐)
这种方式不需要服务主体密钥,完全依赖Azure的托管标识来自动获取访问权限,是最安全的做法:
给Batch池启用托管标识
- 登录Azure门户,找到你的Batch账户,进入目标池的「标识」选项卡
- 选择「系统分配」(Azure自动创建唯一标识)或者「用户分配」(关联你预先创建的托管标识),保存配置
- 系统分配的标识名称就是Batch池的名称,用户分配的需要先在Azure AD里创建托管标识再关联
给托管标识授予Key Vault访问权限
- 进入你的Key Vault,打开「访问策略」选项卡,点击「创建」
- 选择需要的权限(比如「机密权限」里的「获取」「列表」),然后在「选择主体」里搜索并选中刚才Batch池的托管标识
- 完成后保存访问策略
在自定义活动代码中使用托管标识访问Key Vault
使用Azure Identity SDK的DefaultAzureCredential,它会自动识别Batch池的托管标识,无需任何硬编码凭据:using Azure.Identity; using Azure.Security.KeyVault.Secrets; var vaultUri = new Uri(Environment.GetEnvironmentVariable("KEY_VAULT_URI")); // DefaultAzureCredential会自动使用Batch池的托管标识获取令牌 var credential = new DefaultAzureCredential(); var secretClient = new SecretClient(vaultUri, credential); // 获取机密 var secret = await secretClient.GetSecretAsync("your-target-secret-name"); Console.WriteLine($"Secret value: {secret.Value.Value}");这里的
KEY_VAULT_URI可以作为ADF管道参数传递给Batch作业,避免硬编码。
方案二:通过ADF托管标识传递服务主体凭据(兼容旧场景)
如果因为某些原因无法使用Batch托管标识,可以用ADF的托管标识先从Key Vault获取服务主体密钥,再安全传递给Batch作业:
给ADF托管标识配置权限
- 给ADF的系统分配托管标识授予Key Vault的机密读取权限(步骤同方案一的权限配置,主体选ADF的标识)
- 同时确保ADF有提交Batch作业的权限(在Batch账户的「访问控制(IAM)」里给ADF标识分配「Batch作业参与者」角色)
在ADF管道中获取机密并传递给Batch作业
- 添加一个「查找机密」活动,连接到你的Key Vault,获取服务主体的密钥
- 在自定义活动的「Batch作业设置」里,把获取到的密钥作为加密的环境变量传递给作业(Batch会加密存储环境变量,不会明文暴露)
- 同时把服务主体的appId、租户ID也作为环境变量传递
代码中使用环境变量里的凭据访问Key Vault
using Azure.Identity; using Azure.Security.KeyVault.Secrets; var clientId = Environment.GetEnvironmentVariable("SP_CLIENT_ID"); var clientSecret = Environment.GetEnvironmentVariable("SP_CLIENT_SECRET"); var tenantId = Environment.GetEnvironmentVariable("TENANT_ID"); var vaultUri = new Uri(Environment.GetEnvironmentVariable("KEY_VAULT_URI")); var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var secretClient = new SecretClient(vaultUri, credential); var secret = await secretClient.GetSecretAsync("your-target-secret-name");
关键注意事项
- 优先选择方案一,托管标识完全避免了密钥的管理和暴露风险
- 所有配置参数(比如Vault URI、租户ID)都通过ADF管道参数传递,不要硬编码在代码里
- 确保Batch池的网络能访问Key Vault(如果Key Vault启用了防火墙,要允许Batch池所在的VNet访问,或者添加Batch服务的IP范围)
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

