对 Azure DevOps 中的 Key Vault 秘密变量的动态访问

Kin*_*ine 6 azure-keyvault azure-devops azure-pipelines azure-yaml-pipelines

我有一个包含不同密钥(例如 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))
Run Code Online (Sandbox Code Playgroud)

结果是:

Var1 
Var2 $(Key2)
Run Code Online (Sandbox Code Playgroud)

MyValue 不起作用,因为在加载密钥保管库变量之前会评估该变量。当在管道期间设置 KeyName 时,它​​也将不起作用(但这可以通过使用单独的作业并使用输出变量来设置 KeyName 来解决 - 就像测试示例 2 中一样)。表达式 $($(KeyName)) 不起作用,因为它不会递归扩展变量(bug?)。

当使用 AzureKeyVault 任务读取 Key Vault 值时也会出现同样的问题,因为它触发得太晚了。

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

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

Krz*_*tof 4

在这种情况下,最好的方法是将Azure CLI 任务与 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
Run Code Online (Sandbox Code Playgroud)

该脚本的内容是在运行时评估的,因此您可以keyName在此任务之前进行设置,一切都会好起来的。如果您需要秘密值作为变量,您可以使用logging命令来创建这样的变量。

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

$secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv
Run Code Online (Sandbox Code Playgroud)

  • 只是想补充一点,az 命令将返回用双引号字符括起来的值,这意味着“myvalue”。它给了我一些时间来意识到问题出在哪里......:-)只是为了让阅读这篇文章的人节省一些时间...... (2认同)