Esiste un modo per ottenere un file crittografato (GPG) al volo in uno script?


8

Ho bisogno di uno script bash per trovare un file crittografato, in quanto il file di provenienza contiene informazioni riservate.

Vorrei che lo script richiedesse la passphrase GPG e quindi eseguisse, acquistando il file crittografato. Non riesco a capire come farlo però. Ci deve essere l'input dell'utente per la passphrase, poiché non voglio archiviare una chiave sul server con il file crittografato.

Esaminando alcuni metodi diversi, non voglio decrittografare il file, creare il file non crittografato, quindi eliminarlo dopo. Vorrei ridurre la possibilità di lasciare indietro un file non crittografato, se qualcosa è andato storto nella sceneggiatura.

C'è un modo per ottenere l'output GPG di un file per sorgente in questo modo? Possibilmente raccogliendo STDOUT e analizzandolo (se GPG può anche produrre i contenuti in questo modo).

Inoltre, se esiste un altro modo per crittografare un file che gli script di shell possono utilizzare, non ne sono a conoscenza, ma aperto ad altre possibilità.

Risposte:


16

Puoi farlo usando la sostituzione del processo .

. <(gpg -qd "$encrypted_filename")

Ecco un esempio:

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

gpg -dnon persiste il file su disco, ma lo invia semplicemente a stdout. <()utilizza un FIFO , che inoltre non comporta la scrittura sul disco dei dati dei file effettivi.

In bash, .e sourcesono sinonimi, ma .è più portabile (fa parte di POSIX), quindi l'ho usato qui. Si noti, tuttavia, che <()non è portatile - per quanto ne so è supportato solo in bash, zsh, ksh88 e ksh93. pdksh e mksh hanno coprocessi che possono avere lo stesso effetto.


questa è una soluzione molto bella Pensava a una pipa denominata, ma non voleva gestirla. Non sapevo di poterlo fare in questo modo.
BriGuy,

Naturalmente, se hai la preoccupazione che qualcuno sia in grado di leggere un FILE temporaneo, con questo hai esattamente la stessa preoccupazione che qualcuno sia in grado di leggere la pipe temporanea creata da <(command).
Zan Lynx,

@ZanLynx La domanda afferma esplicitamente che si tratta di non persistere sul disco. La soluzione per farlo in modo sicuro altrimenti è la stessa di qualsiasi altra cosa: usa un utente che solo tu controlli, e fallo su un sistema dove solo tu hai root.
Chris Down,

1
Puoi anche farlo con un file crittografato aescrypt (cosa che ho fatto): . <(aescrypt -d -o - file.aes)
Freedom_Ben

3

Se hai gpg-agentimpostato correttamente, usando pinentry-ttyo qualche altra versione che non inquina stdin / stdout, allora dovresti essere in grado di fare qualcosa del tipo:

source <( gpg --decrypt file.gpg )

Questo utilizza la sostituzione del processo per alimentare il risultato sourcecome se fosse un file. I dati del file specifico svaniranno non appena la shell avrà terminato, anche se dopo sarà necessario fare attenzione ai dati sensibili nella memoria della shell.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.