You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ADF自定义活动如何通过服务主体安全访问Azure Key Vault

如何让ADF+Azure Batch的自定义活动安全访问Azure Key Vault

这是个很典型的安全需求——既要访问Key Vault,又绝对不能硬编码凭据,我来给你梳理两个靠谱的方案,优先推荐托管标识的方式,因为完全不用管理密钥:

方案一:使用Azure Batch池的托管标识(推荐)

这种方式不需要服务主体密钥,完全依赖Azure的托管标识来自动获取访问权限,是最安全的做法:

  1. 给Batch池启用托管标识

    • 登录Azure门户,找到你的Batch账户,进入目标池的「标识」选项卡
    • 选择「系统分配」(Azure自动创建唯一标识)或者「用户分配」(关联你预先创建的托管标识),保存配置
    • 系统分配的标识名称就是Batch池的名称,用户分配的需要先在Azure AD里创建托管标识再关联
  2. 给托管标识授予Key Vault访问权限

    • 进入你的Key Vault,打开「访问策略」选项卡,点击「创建」
    • 选择需要的权限(比如「机密权限」里的「获取」「列表」),然后在「选择主体」里搜索并选中刚才Batch池的托管标识
    • 完成后保存访问策略
  3. 在自定义活动代码中使用托管标识访问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作业:

  1. 给ADF托管标识配置权限

    • 给ADF的系统分配托管标识授予Key Vault的机密读取权限(步骤同方案一的权限配置,主体选ADF的标识)
    • 同时确保ADF有提交Batch作业的权限(在Batch账户的「访问控制(IAM)」里给ADF标识分配「Batch作业参与者」角色)
  2. 在ADF管道中获取机密并传递给Batch作业

    • 添加一个「查找机密」活动,连接到你的Key Vault,获取服务主体的密钥
    • 在自定义活动的「Batch作业设置」里,把获取到的密钥作为加密的环境变量传递给作业(Batch会加密存储环境变量,不会明文暴露)
    • 同时把服务主体的appId、租户ID也作为环境变量传递
  3. 代码中使用环境变量里的凭据访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:20:52