web-dev-qa-db-fra.com

Comment décrypter une chaîne avec ansible-vault 2.3.0

J'attendais ansible 2.3 car il allait introduire la fonctionnalité encrypt_string.

Malheureusement, je ne suis pas sûr de savoir comment puis-je lire la chaîne cryptée.

J'ai essayé decrypt_string , decrypt (le fichier), view (le fichier) et rien ne fonctionne.

cat test.yml 
---
test: !vault |
     $ANSIBLE_VAULT;1.1;AES256
     37366638363362303836383335623066343562666662386233306537333232396637346463376430
     3664323265333036663736383837326263376637616466610a383430623562633235616531303861
     66313432303063343230613665323930386138613334303839626131373033656463303736366166
     6635346135636437360a313031376566303238303835353364313434363163343066363932346165
     6136

L'erreur que je reçois est ERROR! input is not vault encrypted data for test.yml

Comment puis-je déchiffrer la chaîne pour que je sache quelle est sa valeur sans avoir à exécuter la pièce?

27
MMT

Avez-vous essayé de définir la chaîne chiffrée en tant que variable, puis d’utiliser -debug pour obtenir sa sortie déchiffrée?

c'est à dire.

Définissez votre chaîne cryptée en tant que variable test dans votre livre de lecture puis faites:

-debug: msg="My Secret value is {{test | replace('\n', '')}}"

dans votre playbook puis lancez le playbook:

ansible-playbook -i localhost YourPlaybook.yml --vault-password-file path/to/your/secret_key_file

`

10
NAF

Vous pouvez également utiliser la commande plain ansible pour la combinaison hôte/groupe/inventaire respective, par exemple:

$ ansible my_server -m debug -a 'var=my_secret'
my_server | SUCCESS => {
    "my_secret": "373861663362363036363361663037373661353137303762"
}
22
famousgarkin

Vous pouvez diriger l'entrée, puis indiquer à ansible-vault la sortie vers stderr, puis rediriger la stdout vers /dev/null puisque l'outil imprime Decryption successful.

Quelque chose comme:

echo 'YOUR_SECRET_VALUE' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null

Voici un exemple:

echo '$ANSIBLE_VAULT;1.1;AES256
30636561663762383436386639353737363431353033326634623639666132623738643764366530
6332363635613832396361333634303135663735356134350a383265333537383739353864663136
30393363653361373738656361613435626237643633383261663138653466393332333036353737
3335396631613239380a616531626235346361333737353831376633633264326566623339663463
6235' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null

J'espère qu'ils mettent en œuvre un moyen plus simple de le faire.

Édition: Variables d'environnement en entrée:

Pour avoir un comportement similaire avec des variables d'environnement multilignes sur bash, utilisez printf au lieu de echo

Exemple (mot de passe: 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
12
Scudelletti

étant donné que les fichiers de coffre-fort entiers ne fonctionnent pas bien avec les historiques git, l'utilisation de chaînes de coffre-fort dans les fichiers de variables est la solution, il est également plus facile de rechercher des variables par nom. 

Voici un exemple simple travaillé:

Je veux mettre fredsSecretString: value dans vars.yml, (sa valeur est fastfredfedfourfrankfurters mais chut, ne laissez pas les gens le savoir !!)

$ 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

Pour déchiffrer la valeur, réintroduisez la chaîne chiffrée dans ansible-vault comme suit:

    $ echo '$ANSIBLE_VAULT;1.1;AES256
    36643662303931336362356361373334663632343139383832626130636237333134373034326565
    3736626632306265393565653338356138626433333339310a323832663233316666353764373733
    30613239313731653932323536303537623362653464376365383963373366336335656635666637
    3238313530643164320a336337303734303930303163326235623834383337343363326461653162
    33353861663464313866353330376566346636303334353732383564633263373862' |
 ansible-vault decrypt && echo
    Vault password: fred
    Decryption successful
    fastfredfedfourfrankfurters
    $
9
Coleman Corrigan

Bien qu'il n'y ait aucun problème à afficher les valeurs de chaîne chiffrées avec des messages de débogage ansible ou à l'aide de ansible cli, il existe une solution supplémentaire qui peut être pratique pour les besoins en automatisation. Vous pouvez utiliser les bibliothèques python de ansible et les utiliser dans votre code (en gros, tout cela situé dans ansible.parsing. *)

1) Fournissez le mot de passe du coffre-fort et générez un «coffre-fort» avec des secrets.

# 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) Charger le fichier yaml avec AnsibleLoader:

with codecs.open(input_file, 'r', encoding='utf-8') as f:
    loaded_yaml = AnsibleLoader(f, vault_secrets=_vault.secrets).get_single_data()

3) Si vous devez chiffrer une nouvelle chaîne et mettre à jour votre dictionnaire:

    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) Une fois le traitement terminé, écrivez avec AnsibleDumper:

with open('new_variables.yml','w') as fd:
    yaml.dump(loaded_yaml, fd, Dumper=AnsibleDumper, encoding=None, default_flow_style=False)
1
andruhan

Voici ce qui fonctionne pour moi, semblable à ce que fait Scudelletti, mais en passant dans la passe du coffre-fort, c'est-à-dire.

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

La sortie sera sur sa propre ligne pour plus de commodité, grâce au && echo final. La permission de mon coffre-fort est de 644 si vous rencontrez des erreurs d'autorisation.

J'espère que ça aide!

1
radtek

Cette commande extrait uniquement les données chiffrées et les passe à déchiffrer. J'aime un peu mieux, car il n'est pas nécessaire d'extraire manuellement les données. 

cat test.yml | grep -v vault| awk '{$1=$1;print}' | ansible-vault decrypt
0
Scott Carlson