在Azure DevOps中动态访问Key Vault机密变量

时间:2020-08-10 13:52:41

标签: azure-devops azure-keyvault azure-yaml-pipelines

我有一个具有不同密钥(例如Key1,Key2,Key3)的Azure密钥保管库。在某些设置中(可以在一个管道任务中动态读取),我有一个值,该值表明要使用哪个键(让KeyName变量为“ Key2”)。如何在管道中读取Key2的秘密值?

我尝试了不同的组合,但没有一种适合我。

测试管道编号1-使用连接到Key Vault的组变量(为方便起见,KeyName在这里是静态的,但实际上,它是在管道过程中通过powershell脚本设置的):

jobs:
- job: JobA
  variables:
  - group: KeyVaultGroup #Key vault have secret values "Key1,Key2,Key3..."
  - name: KeyName
    value: Key2
  - name: MyValue
    value: $[ variables[variables.KeyName] ]
  steps:
  - powershell: |
      Write-Host "Var1 $($env:VARENV1)"
      Write-Host "Var2 $($env:VARENV2)"
    env:
      VarEnv1: $(MyValue)
      VarEnv2: $($(KeyName))

结果是:

Var1 
Var2 $(Key2)

MyValue不起作用,因为在加载关键保管库变量之前先对变量求值。当在管道中设置KeyName时,它也不会起作用(但是可以通过使用单独的作业并使用输出变量来设置KeyName来解决-就像第2个测试示例一样)。 表达式$ {$(KeyName))不起作用,因为它不会递归扩展变量(错误?)。

同一问题是使用AzureKeyVault任务读取密钥库值时,因为它触发得太晚。

测试编号2-两个单独的作业: 我使用了2个作业-一个读取密钥库和密钥名称(作业A),第二个读取其余的作业(作业B)。问题是,没有办法从作业B中访问作业A上加载的密钥库机密值。我只能通过dependencies.JobA使用作业B中作业A的输出变量,但是任务AzureKeyVault没有将值导出为输出变量。为此,我需要使用Powershell任务,但是在这种情况下,我将需要将秘密值作为环境变量映射到powershell任务中,但这意味着我将释放所需的动态部分,因为它将被静态映射(我需要能够添加/删除密钥库中的值,而无需更改管道。这是行不通的,或者我不知道如何在不使用输出变量的情况下访问作业之间的秘密变量。

问题: 当Key2保存为变量值KeyName并在管道中加载时,如何从密钥“ Key2”读取安全值?

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好的方法是将Azure CLI task与azure keyvault命令一起使用:

  - task: AzureCLI@2
    inputs:
      azureSubscription: 'rg-the-code-manual'
      scriptType: 'pscore'
      scriptLocation: 'inlineScript'
      inlineScript: |
        $secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value
        echo $secretValue

此脚本的内容在运行时评估,因此可以在执行此任务之前设置keyName,一切都会好起来的。而且,如果您需要secret的值作为变量,则可以使用logging命令来创建它。

消除双引号的最简单方法是将输出更改为tsv

$secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv