81 votes

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

J'ai attendu ansible 2.3 car il devait introduire la fonction encrypt_string.

Malheureusement je ne suis pas sûr de comment je peux lire la chaîne chiffré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 ERREUR ! l'entrée n'est pas des données chiffrées en coffre pour test.yml

Comment puis-je déchiffrer la chaîne pour connaître sa valeur sans avoir besoin d'exécuter le jeu de données ?

2 votes

Vous pouvez extraire la partie chiffrée et la transmettre à stdin de ansible-vault decrypt, mais je suppose qu'un play serait toujours plus facile.

4 votes

Voter pour github.com/ansible/ansible/issues/26190 pour permettre à ansible-vault decrypt de gérer les variables cryptées en ligne.

59voto

famousgarkin Points 3484

Vous pouvez également le faire avec la commande ansible simplement pour l'hôte, le groupe ou la combinaison d'inventaire respective, par exemple :

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

8 votes

Encore plus facile est d'utiliser simplement localhost au lieu de my_server.

1 votes

@Welsh pourrait être, cela dépend de la configuration de vos variables de groupe/hôte.

0 votes

En principe, ceci semble être la meilleure option. Cela évite d'avoir à copier le texte du fichier hosts/vars, supprimer les espaces vides et le coller dans le terminal. Malheureusement, pour moi cela a abouti à ÉCHEC ! => {"msg": "Tentative de déchiffrement mais aucune clé secrète trouvée"}. Peut-être est-ce parce que la variable que je veux déchiffrer a été définie pour un groupe plutôt que pour un hôte spécifique ?

56voto

Scudelletti Points 89

Vous pouvez rediriger l'entrée puis indiquer à ansible-vault de renvoyer vers stderr puis rediriger le stdout vers /dev/null car l'outil affiche Décryptage réussi.

La partie /dev/stdin/ peut ne pas être nécessaire dans les nouvelles versions d'Ansible.

Quelque chose comme :

echo 'VOTRE_VALEUR_SECRÈTE' | 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 mettront en place une méthode plus simple pour faire cela.

Modifier : Variables d'environnement en tant qu'entrée :

Pour obtenir un comportement similaire avec des variables d'environnement multi-lignes 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

11 votes

Pour une raison inconnue, echo "$ciphertext" | ansible-vault decrypt /dev/stdin ne fonctionnait pas pour moi. Je continais de recevoir ERROR! [Errno 2] No such file or directory: u'/proc/22899/fd/pipe:[39394403]'. J'ai dû rediriger le $ciphertext vers un fichier temporaire au lieu d'utiliser /dev/stdin.

0 votes

@DaveParrish vous devez utiliser des guillemets simples sur l'écho. Puisque le shell pense que $ANSIBLE_VAULT est une variable d'environnement mais ce n'est pas le cas. Exemple: export AAA=Wow Ensuite, exécutez echo "$AAA" cela renverra Wow. echo '$AAA' renverra $AAA

0 votes

Avez-vous une solution pour utiliser une variable bash qui contient le texte chiffré alors ? Est-ce que echo '$textechiffré' | ansible-vault decrypt /dev/stdin fonctionnera ?

33voto

Coleman Corrigan Points 119

Étant donné que les fichiers de coffre-fort entiers ne s'intègrent pas bien dans l'historique de git, utiliser des chaînes de coffre-fort dans les fichiers de variables est la meilleure solution, cela rend également les variables plus claires lorsqu'on les recherche par nom.

Voici un exemple de travail simple:

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
Nouveau mot de passe Vault : fred
Confirmez le nouveau mot de passe Vault : fred
$ cat vars.yml
fredsSecretString: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36643662303931336362356361373334663632343139383832626130636237333134373034326565
          3736626632306265393565653338356138626433333339310a323832663233316666353764373733
          30613239313731653932323536303537623362653464376365383963373366336335656635666637
          3238313530643164320a336337303734303930303163326235623834383337343363326461653162
          33353861663464313866353330376566346636303334353732383564633263373862

Pour décrypter la valeur, renvoyez 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
    Mot de passe Vault : fred
    Décryptage réussi
    fastfredfedfourfrankfurters
    $

2 votes

Fantastique! Merci de nous avoir montré cela. Pour tous ceux qui essaient ceci, veuillez noter que pour que cela fonctionne, vous devez supprimer les espaces blancs de votre chaîne ANSIBLE_VAULT. C'est ce que @coleman-corrigan montre ci-dessus mais j'ai raté mes deux premiers essais.

5 votes

A dû remplacer le saut de ligne par littéral (\n) et permettre l'interprétation des séquences d'échappement # echo -e '$ANSIBLE_VAULT;1.1;AES256\n34626638366161336437303439643066‌​36646637643134633661‌​33323364333865393037‌​37613663\n6639393965‌​65323935643561303830‌​3030616163333565300a‌​31393261636538333632‌​3839363935\n66363439‌​66646132346634336634‌​37373738343533333639‌​35346132356663346365‌​386163323733\n333231‌​6134323064310a386164‌​37366132323333386264‌​32313030346636323630‌​61383433616166\n6265‌​35646530353161656663‌​63656461386632333738‌​66666332366430396339‌​3437' | ansible-vault decrypt && echo Mot de passe du coffre : Déchiffrement réussi

10 votes

Pour décrypter, j'ai ajouté tr -d ' ' pour supprimer les espaces blancs afin de pouvoir copier directement le secret depuis mon code source sans avoir à le manipuler d'abord. par exemple echo '$ANSIBLE_VAULT;1.1;AES256 366436623039313363623563613733346636323431393838326261306...‌​' | tr -d ' ' | ansible-vault decrypt && echo

24voto

NAF Points 172

Avez-vous essayé de définir la chaîne chiffrée comme une variable, puis d'utiliser -debug pour obtenir sa sortie déchiffrée ?

c.-à-d.

Définissez votre chaîne chiffrée comme une variable test dans votre playbook puis faites :

-debug: msg="Ma valeur secrète est {{test | replace('\n', '')}}"

dans votre playbook puis exécutez le playbook :

$ ansible-playbook -i localhost VotrePlaybook.yml --vault-password-file chemin/vers/votre/fichier_clé_secrète

0 votes

J'ai effectivement trouvé une solution similaire, c'est-à-dire tasks: name: "{{ test_var }}" cependant j'espérais quelque chose de plus proche des options de chiffrement/déchiffrement de chaînes eyaml.

3voto

andruhan Points 21

Bien que les valeurs de chaîne cryptées ne posent aucun problème lors de l'affichage des messages de débogage d'Ansible ou lors de l'utilisation de l'interface en ligne de commande Ansible, il existe une autre solution qui peut être pratique pour les besoins d'automatisation. Vous pouvez utiliser les bibliothèques Python d'Ansible et les utiliser dans votre code (en gros, tout cela se trouve dans ansible.parsing.*)

1) Fournir le mot de passe du coffre-fort et générer le "vault" avec les secrets.

# Charger le mot de passe du coffre-fort et préparer les secrets pour le déchiffrement
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 crypter 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 de nouveau avec AnsibleDumper :

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

0 votes

Pourriez-vous s'il vous plaît inclure les import correspondants. J'essaie d'écrire un script pour déchiffrer/chiffrer des variables individuelles à partir de fichiers de variables ansible. Je parsais les fichiers en utilisant yq mais cette approche semble bien meilleure.

0 votes

de ansible.parsing.dataloader import DataLoader de ansible.parsing.vault import get_file_vault_secret, VaultLib de ansible.parsing.yaml.loader import AnsibleLoader

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X