Динамический доступ к секретным переменным Key Vault в Azure DevOps

У меня есть хранилище ключей Azure с разными ключами (например, Key1, Key2, Key3). В некоторых настройках, которые динамически считываются в одной задаче конвейера, у меня есть значение, указывающее, какой ключ использовать (позволяет переменной 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). Проблема в том, что нет способа получить доступ к секретным значениям хранилища ключей, загруженным в задание A, из задания B. Я могу использовать только выходные переменные из задания A в задании B через зависимости.JobA ... но задание AzureKeyVault не экспортирует значения как выходные переменные. Для этого мне нужно будет использовать, например, Задача Powershell, но в этом случае мне нужно будет сопоставить секретные значения как переменные среды с задачей Powershell, но это означает, что я потеряю нужную динамическую часть, потому что она будет статически сопоставлена ​​(мне нужно иметь возможность добавить / удалить значения в хранилище ключей без изменения конвейера). Это не годится, или я не знаю, как получить доступ к секретным переменным между заданиями без использования выходных переменных.

Вопрос: Как прочитать безопасное значение из ключа Key2, когда Key2 сохраняется как значение переменной KeyName и загружается во время конвейера?


person Kine    schedule 10.08.2020    source источник


Ответы (1)


В этом случае лучше всего использовать задача 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

Содержимое этого сценария оценивается во время выполнения, поэтому вы можете установить keyName непосредственно перед этой задачей, и все будет в порядке. И если вам нужно значение секрета в качестве переменной, вы можете использовать команду ведения журнала для его создания.

Самый простой способ избавиться от двойных кавычек - это изменить вывод на tsv.

$secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv
person Krzysztof Madej    schedule 10.08.2020
comment
Просто хочу добавить, что команда az вернет значение, заключенное в двойные кавычки, это означает как myvalue. Это дает мне время, чтобы понять, в чем проблема ... :-) Просто для людей, читающих это, чтобы сэкономить им время ... - person Kine; 12.08.2020
comment
@Kine Спасибо, что указали на это. Я отредактировал свой ответ примером того, как мы можем избавиться от ". - person Krzysztof Madej; 12.08.2020