Existe-t-il un moyen de trouver un fichier chiffré (GPG) à la volée dans un script?

8

J'ai besoin d'un script bash pour source un fichier qui est crypté, car le fichier d'origine contient des informations sensibles.

Je voudrais que le script demande la phrase de passe GPG puis s'exécute, en se procurant le fichier crypté. Je ne peux pas comprendre comment faire cela cependant. Il doit y avoir une entrée utilisateur pour la phrase secrète, car je ne veux pas stocker de clé sur le serveur avec le fichier crypté.

En examinant différentes méthodes, je ne veux pas décrypter le fichier, source le fichier non crypté, puis supprimez-le après. Je voudrais réduire le risque de laisser un fichier non chiffré derrière, si quelque chose s'est mal passé dans le script.

Existe-t-il un moyen d'obtenir la sortie GPG d'un fichier pour le source de cette façon? Peut-être en collectant STDOUT et en l'analysant (si GPG peut même sortir le contenu de cette façon).

De plus, s'il existe un autre moyen de crypter un fichier que les scripts shell peuvent utiliser, je n'en suis pas conscient, mais ouvert à d'autres possibilités.

BriGuy
la source

Réponses:

16

Vous pouvez le faire en utilisant la substitution de processus .

. <(gpg -qd "$encrypted_filename")

Voici un exemple:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r chris@chrisdown.name to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -dne conserve pas le fichier sur le disque, il le renvoie simplement sur stdout. <()utilise un FIFO , ce qui n'entraîne pas non plus l'écriture des données de fichier réelles sur le disque.

En bash, .et sourcesont des synonymes, mais .est plus portable (il fait partie de POSIX), donc je l'ai utilisé ici. Notez, cependant, que ce <()n'est pas aussi portable - pour autant que je sache, il n'est pris en charge que dans bash, zsh, ksh88 et ksh93. pdksh et mksh ont des coprocessus qui peuvent avoir le même effet.

Chris Down
la source
c'est une très bonne solution. Pensé à un tuyau nommé, mais ne voulant pas le gérer. Je ne savais pas que je pouvais le faire de cette façon.
BriGuy
Bien sûr, si vous craignez que quelqu'un puisse lire un FICHIER temporaire, vous avez exactement la même inquiétude avec quelqu'un pouvant lire le tuyau temporaire créé par <(command).
Zan Lynx du
@ZanLynx La question indique explicitement qu'il s'agit de ne pas persister sur le disque. Sinon, la solution pour le faire en toute sécurité est la même que partout ailleurs: utilisez un utilisateur que vous seul contrôlez, et faites-le sur un système où vous seul avez root.
Chris Down
1
Vous pouvez également le faire avec un fichier crypté aescrypt (ce que j'ai fait): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Si vous avez gpg-agentconfiguré correctement, en utilisant pinentry-ttyou une autre version qui ne pollue pas stdin / stdout, alors vous devriez pouvoir faire quelque chose comme:

source <( gpg --decrypt file.gpg )

Cela utilise la substitution de processus pour alimenter le résultat sourcecomme s'il s'agissait d'un fichier. Les données de fichier spécifiques disparaîtront dès que le shell en aura fini, bien que vous deviez toujours faire attention aux données sensibles dans la mémoire du shell après cela.

Tom Hunt
la source
0

Étant donné que la réponse la plus saine a déjà été donnée, voici une réponse insensée - utilisez ce système de fichiers:

https://github.com/jseppanen/gpgfs

De cette façon, votre programme ne remarquera pas qu'il parle à un tuyau.

d33tah
la source