Динамический доступ к секретным переменным 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 и загружается во время конвейера?
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