Динамический доступ к секретным переменным хранилища ключей в Azure DevOps

#azure-devops #azure-keyvault #azure-yaml-pipelines

#azure-devops #azure-конвейеры #azure-keyvault #azure-yaml-конвейеры

Вопрос:

У меня есть хранилище ключей Azure с разными ключами (например, Key1, Key2, Key3). В некотором параметре, который динамически считывается в одной задаче конвейера, у меня есть значение, указывающее, какой ключ использовать (пусть ключевой переменной будет ‘Key2’). Как я могу прочитать секретное значение Key2 в конвейере?

Я пробовал разные комбинации, и ни одна из них не работает для меня.

Тестовый конвейер № 1 — использование групповой переменной, подключенной к хранилищу ключей (чтобы упростить задачу, ключевое имя здесь статично, но на самом деле оно задается с помощью сценария powershell во время конвейера):

 jobs:
- job: JobA
  variables:
  - &roup: 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 не работает, поскольку переменная вычисляется до загрузки переменных хранилища ключей. И когда имя ключа задается во время конвейера, это тоже не сработает (но это можно решить с помощью отдельного задания и использования выходных переменных для установки имени ключа, как в тестовом примере № 2).
Выражение $($(keyName)) не работает, поскольку оно не будет рекурсивно расширять переменную (ошибка?).

Та же проблема возникает, когда для считывания значений хранилища ключей используется задача AzureKeyVault, поскольку она запускается слишком поздно.

Тест № 2 — два отдельных задания: я использовал 2 задания — одно для чтения хранилища ключей и имени ключа (задание A), а второе для остальных (задание B). Проблема в том, что нет способа получить доступ к секретным значениям хранилища ключей, загруженным в задание A, из задания B. Я могу использовать только выходные переменные из задания A в задании B через зависимости.JobA … но задача AzureKeyVault не экспортирует значения в качестве выходных переменных. Для этого мне нужно будет использовать, например, задачу Powershell, но в этом случае мне нужно будет сопоставить секретные значения в качестве переменных среды с задачей powershell, но это означает, что я потеряю необходимую мне динамическую часть, потому что она будет сопоставлена статически (мне нужно иметь возможность добавлять / удалять значения в хранилище ключей без необходимости изменять конвейер). Это бесполезно, или я не знаю, как получить доступ к секретным переменным между заданиями без использования выходных переменных.

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

Ответ №1:

В этом случае лучшим способом является использование задачи CLI Azure с командой azure keyvault:

   - task: AzureCLI@2
    inputs:
      azureSubscription: 'r&-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 в качестве переменной, вы можете использовать команду lo&&in& для ее создания.

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

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

Комментарии:

1. Просто хочу добавить, что команда az вернет значение, заключенное в двойные кавычки, это означает что-то вроде «myvalue». Это дает мне некоторое время, чтобы понять, в чем проблема … 🙂 Просто для людей, читающих это, чтобы сэкономить им немного времени…

2. @Kine Спасибо, что указали на это. Я отредактировал свой ответ, приведя пример того, как мы можем избавиться от " .

3. Если у кого-либо возникнут какие-либо проблемы с приведенной выше командой в командной оболочке, используйте ее как secretValue=$(az keyvault secret show —vault-name tcm-kv —name $ (ключевое имя) —значение запроса -o tsv) это сработает