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

如何将Azure Key Vault机密变量传递至无Azure访问的本地代理

解决本地Azure Pipelines代理无法访问Key Vault时的机密传递问题

以下是几种可行的解决方案,无需本地代理直接访问Key Vault:

方案1:通过托管代理拉取机密后传递给本地代理

利用能访问Key Vault的托管代理先获取机密,再通过流水线工件或输出变量传递给本地代理:

步骤示例(YAML流水线)

1. 托管代理拉取并加密机密

- job: Fetch_Secrets
  pool:
    vmImage: 'ubuntu-latest' # 使用托管代理
  variables:
    - group: 你的KeyVault关联变量组 # 已链接Key Vault的变量组
  steps:
  - bash: |
      # 将机密写入临时文件
      echo "DB_PASSWORD=$(DB_PASSWORD)" > secrets.env
      # 加密文件(加密密钥提前设为流水线非机密变量)
      openssl enc -aes-256-cbc -salt -in secrets.env -out secrets.enc -k $(ENCRYPT_KEY)
    env:
      DB_PASSWORD: $(DB_PASSWORD) # 引用Key Vault中的机密变量
  - publish: $(System.DefaultWorkingDirectory)/secrets.enc
    artifact: encrypted_secrets # 上传加密后的机密文件作为工件

2. 本地代理下载并解密使用

- job: Deploy_Local
  dependsOn: Fetch_Secrets
  pool:
    name: 你的本地代理池名称
  steps:
  - download: current
    artifact: encrypted_secrets # 下载托管代理上传的加密文件
  - bash: |
      # 解密文件
      openssl enc -d -aes-256-cbc -in $(Pipeline.Workspace)/encrypted_secrets/secrets.enc -out secrets.env -k $(ENCRYPT_KEY)
      # 加载环境变量
      source secrets.env
      # 执行部署命令,直接使用$DB_PASSWORD
      echo "执行部署,使用数据库密码:$DB_PASSWORD"
    env:
      ENCRYPT_KEY: $(ENCRYPT_KEY) # 引用提前设置的加密密钥变量

方案2:直接通过流水线输出变量传递机密

利用Azure Pipelines的任务输出变量机制,让托管代理把机密标记为输出变量,本地代理直接引用:

- job: Fetch_Secrets
  pool:
    vmImage: 'ubuntu-latest'
  variables:
    - group: 你的KeyVault关联变量组
  steps:
  - bash: |
      # 将机密设为输出变量,标记为机密
      echo "##vso[task.setvariable variable=db_password;isOutput=true;issecret=true]$(DB_PASSWORD)"
    name: Set_Secret_Vars

- job: Deploy_Local
  dependsOn: Fetch_Secrets
  pool:
    name: 你的本地代理池名称
  variables:
    # 引用托管代理输出的机密变量
    db_password: $[ dependencies.Fetch_Secrets.outputs['Set_Secret_Vars.db_password'] ]
  steps:
  - bash: |
      # 直接使用变量(会自动掩码,日志中不会显示明文)
      echo "数据库密码已加载:$(db_password)"
      # 或通过环境变量访问(变量名自动转为大写加下划线)
      echo "环境变量形式:$DB_PASSWORD"

方案3:提前同步机密到本地代理机器

如果本地代理是固定机器,可通过托管代理将机密同步到代理机器的本地存储:

Linux代理示例

- job: Sync_Secrets_To_Local
  pool:
    vmImage: 'ubuntu-latest'
  variables:
    - group: 你的KeyVault关联变量组
  steps:
  - bash: |
      # 通过SSH将机密写入本地代理的专属环境变量文件
      ssh 本地代理用户名@本地代理IP "echo 'export DB_PASSWORD=$(DB_PASSWORD)' >> ~/.deploy_secrets.sh"

本地代理任务中加载使用:

- job: Deploy_Local
  pool:
    name: 你的本地代理池名称
  steps:
  - bash: |
      source ~/.deploy_secrets.sh
      echo "使用同步后的机密:$DB_PASSWORD"

注意事项

  • 所有机密变量在Azure Pipelines中都会自动掩码,不会在日志中泄露明文
  • 使用文件传递时必须加密,避免传输过程中泄露
  • 方案2中务必添加issecret=true标记,确保变量被Azure Pipelines安全处理

内容的提问来源于stack exchange,提问作者Nadija Kozoriz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:15:20