Как расшифровать строку с помощью скрытого хранилища 2.3.0
Я ждал, когда будет существовать 2.3, поскольку он собирается ввести функцию encrypt_string.
К сожалению, я не уверен, как я могу прочитать зашифрованную строку.
Я попробовал decrypt_string, расшифровать (файл), представление (файл) и ничего не работает.
cat test.yml
---
test: !vault |
$ANSIBLE_VAULT;1.1;AES256
37366638363362303836383335623066343562666662386233306537333232396637346463376430
3664323265333036663736383837326263376637616466610a383430623562633235616531303861
66313432303063343230613665323930386138613334303839626131373033656463303736366166
6635346135636437360a313031376566303238303835353364313434363163343066363932346165
6136
Ошибка, которую я собираю, - ERROR! input is not vault encrypted data for test.yml
Как я могу расшифровать строку, чтобы я знал ее значение без необходимости запускать игру?
Ответы
Ответ 1
Вы пытались установить зашифрованную строку как переменную, а затем с помощью -debug
получить свой расшифрованный вывод?
то есть.
Определите свою зашифрованную строку как переменную test
в своей книге, а затем выполните:
-debug: msg="My Secret value is {{test | replace('\n', '')}}"
в вашем плейбуке, а затем запустите playbook:
ansible-playbook -i localhost YourPlaybook.yml --vault-password-file path/to/your/secret_key_file
`
Ответ 2
Вы также можете использовать обычную команду ansible
для соответствующей комбинации хоста/группы/инвентаря, например:
$ ansible my_server -m debug -a 'var=my_secret'
my_server | SUCCESS => {
"my_secret": "373861663362363036363361663037373661353137303762"
}
Ответ 3
Вы можете подключить вход, затем сообщить ansible-vault
для вывода на stderr
, а затем перенаправить stdout
в /dev/null
, так как инструмент печатает Decryption successful
.
Что-то вроде:
echo 'YOUR_SECRET_VALUE' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
Вот пример:
echo '$ANSIBLE_VAULT;1.1;AES256
30636561663762383436386639353737363431353033326634623639666132623738643764366530
6332363635613832396361333634303135663735356134350a383265333537383739353864663136
30393363653361373738656361613435626237643633383261663138653466393332333036353737
3335396631613239380a616531626235346361333737353831376633633264326566623339663463
6235' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
Надеюсь, они реализуют более простой способ сделать это.
Изменить: переменные окружения в качестве ввода:
Чтобы иметь аналогичное поведение с многострочными переменными среды на bash
, используйте printf
вместо echo
Пример (пароль: 123):
export chiphertext='$ANSIBLE_VAULT;1.1;AES256
65333363656231663530393762613031336662613262326666386233643763636339366235626334
3236636366366131383962323463633861653061346538360a386566363337383133613761313566
31623761656437393862643936373564313565663633636366396231653131386364336534626338
3430343561626237660a333562616537623035396539343634656439356439616439376630396438
3730'
printf "%s\n" $chiphertext | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
Ответ 4
так как целые файлы хранилища плохо воспроизводятся с историями git, использование строк хранилища в файлах переменных - путь, который также делает grepping out переменными по имени намного яснее.
Вот простой пример:
Я хочу поставить fredsSecretString: значение в vars.yml(его значение - fastfredfedfourfrankfurters, но тише, не позволяйте людям знать!)
$ ansible-vault encrypt_string 'fastfredfedfourfrankfurters' -n fredsSecretString >> vars.yml
New Vault password: fred
Confirm New Vault password: fred
$ cat vars.yml
fredsSecretString: !vault |
$ANSIBLE_VAULT;1.1;AES256
36643662303931336362356361373334663632343139383832626130636237333134373034326565
3736626632306265393565653338356138626433333339310a323832663233316666353764373733
30613239313731653932323536303537623362653464376365383963373366336335656635666637
3238313530643164320a336337303734303930303163326235623834383337343363326461653162
33353861663464313866353330376566346636303334353732383564633263373862
Чтобы расшифровать значение, запишите зашифрованную строку обратно в безопасное хранилище
следующим образом:
$ echo '$ANSIBLE_VAULT;1.1;AES256
36643662303931336362356361373334663632343139383832626130636237333134373034326565
3736626632306265393565653338356138626433333339310a323832663233316666353764373733
30613239313731653932323536303537623362653464376365383963373366336335656635666637
3238313530643164320a336337303734303930303163326235623834383337343363326461653162
33353861663464313866353330376566346636303334353732383564633263373862' |
ansible-vault decrypt && echo
Vault password: fred
Decryption successful
fastfredfedfourfrankfurters
$
Ответ 5
Вот то, что работает для меня, похоже на то, что делает Скуделлетти, но проходит через проход в хранилище, т.е.
echo '$ANSIBLE_VAULT;1.1;AES256
31363861346536343331393539323936346464386534346337306565626466393764666366363637
6533373165656431393662653463646430663933363431380a336130363131373238326330393931
39343533396161323834613030383339653633393133393932613562396630303530393030396335
3630656237663038630a363032373633363161633464653431386237333262343231313830363965
31393930343532323133386536376637373463396534623631633234393565373337613530643031
38393862616635326339373731353465303364303365336132613566396666626536636533303839
393465653830393231636638643735313666' | ansible-vault decrypt --vault-password-file /path/to/your/.vault_pass.txt /dev/stdin --output=/dev/stderr > /dev/null && echo
Для удобства вывод будет находиться на отдельной строке благодаря трейлингу && echo
. Разрешение моего прохода в хранилище составляет 644, если вы столкнетесь с какими-либо ошибками разрешения.
Надеюсь, поможет!
Ответ 6
Несмотря на то, что нет проблем с отображением зашифрованных строковых значений с доступными сообщениями отладки или использованием ansible cli, есть еще одно решение, которое может быть удобным для нужд автоматизации. Вы можете использовать python libs от ansible и использовать их в своем коде (в основном, все это находится в файле ansible.parsing. *)
1) Предоставьте пароль хранилища и сгенерируйте "хранилище" секретами.
# Load vault password and prepare secrets for decryption
loader = DataLoader()
secret = vault.get_file_vault_secret(filename=vault_password_file, loader=loader)
secret.load()
vault_secrets = [('default', secret)]
_vault = vault.VaultLib(vault_secrets)
2) Загрузите файл yaml с помощью AnsibleLoader:
with codecs.open(input_file, 'r', encoding='utf-8') as f:
loaded_yaml = AnsibleLoader(f, vault_secrets=_vault.secrets).get_single_data()
3) Если вам нужно зашифровать новую строку и обновить словарь:
new_encrypted_value = objects.AnsibleVaultEncryptedUnicode.from_plaintext(source_system_password, _vault, vault_secrets[0][1])
loaded_yaml[target_env]['credentials'][external_system_name]['password'] = new_encrypted_variable
4) После полной обработки напишите обратно с помощью AnsibleDumper:
with open('new_variables.yml','w') as fd:
yaml.dump(loaded_yaml, fd, Dumper=AnsibleDumper, encoding=None, default_flow_style=False)
Ответ 7
Вот еще один способ расшифровки строк
$ ansible localhost \
-m debug \
-a "var=mysecret" \
-e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}
Хитрость в том, что мы передаем файл с секретным хранилищем Ansible, mysecret
внутри него ansible
, и он может его расшифровать.
ПРИМЕЧАНИЕ. Если у вас нет пароля для расшифровки секретного зашифрованного секрета Ansible, вы также можете передать его:
$ ansible localhost --vault-password-file=~/.vault_pass.txt \
-m debug \
-a "var=mysecret" \
-e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}
Ответ 8
Эта команда извлекает только зашифрованные данные и передает их для расшифровки. Мне нравится это немного лучше, так как вам не нужно вручную извлекать данные.
$ grep -v vault test.yml | awk '{$1=$1;print}' | ansible-vault decrypt
Ответ 9
yq извлекает зашифрованное значение var, затем создает временный файл и использует его с ansible-vault
:
cat ansible_file.yml | yq -r ".variable_name" > tmp_file.txt
# you can also use 'ansible-vault decrypt'
ansible-vault view --ask-vault-pass tmp_file.txt
Ответ 10
Другой вариант заключается в использовании опции редактирования:
ansible-vault edit test.yml
Затем вам будет предложено ввести пароль, и вы идете.
Ответ 11
если у вас установлен ansible, вы можете расшифровать файл (не строку), используя:
ansible-vault view your_vault_filename.yml
Это запросит у вас пароль, и после аутентификации контент будет отображаться расшифрованным.
источник https://www.digitalocean.com/community/tutorials/how-to-use-vault-to-protect-sensitive-ansible-data-on-ubuntu-16-04