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

Dynamic access to Key Vault secret variables in Azure DevOps

我有一个带有不同密钥(例如 Key1、Key2、Key3)的 Azure Key Vault。在某些设置中,在一个管道任务中动态读取,我有值说明要使用哪个键(让 KeyName 变量为 'Key2')。如何读取管道中Key2的秘密值?

我尝试了不同的组合,none 对我有用。

测试流水线号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 任务中,但这意味着我将失去我需要的动态部分,因为它将被静态映射(我需要能够 add/remove Key Vault 中的值,无需更改管道)。这是行不通的,或者我不知道如何在不使用输出变量的情况下访问作业之间的秘密变量。

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

在这种情况下,最好的方法是将 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