4

我有一个带有不同密钥(例如 Key1、Key2、Key3)的 Azure Key Vault。在某些设置中,在一个管道任务中动态读取,我有值说明要使用哪个键(让 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 任务用于读取 Key Vault 值时,因为它被触发得太晚了。

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

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

4

1 回答 1

4

在这种情况下,最好的方法是使用带有 azure keyvault 命令的Azure CLI 任务:

  - 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在此任务之前进行设置,一切都会好起来的。如果您需要秘密值作为变量,您可以使用日志记录命令来创建此类。

摆脱双引号的最简单方法是将输出更改为tsv.

$secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv
于 2020-08-10T21:45:20.477 回答