Gibt es eine Möglichkeit, eine verschlüsselte (GPG) Datei im laufenden Betrieb in einem Skript zu erstellen?

8

Ich benötige ein Bash-Skript, um eine verschlüsselte Datei zu erstellen, da die bezogene Datei vertrauliche Informationen enthält.

Ich möchte, dass das Skript zur Eingabe der GPG-Passphrase auffordert und dann ausgeführt wird und die verschlüsselte Datei bezieht. Ich kann allerdings nicht herausfinden, wie das geht. Es muss eine Benutzereingabe für die Passphrase geben, da ich keinen Schlüssel mit der verschlüsselten Datei auf dem Server speichern möchte.

Wenn ich mir verschiedene Methoden anschaue, möchte ich die Datei nicht entschlüsseln, die unverschlüsselte Datei als Quelle verwenden und sie anschließend löschen. Ich möchte die Wahrscheinlichkeit verringern, dass eine unverschlüsselte Datei zurückbleibt, wenn im Skript ein Fehler auftritt.

Gibt es eine Möglichkeit, die GPG-Ausgabe einer Datei so abzurufen? Möglicherweise STDOUT sammeln und analysieren (wenn GPG den Inhalt überhaupt auf diese Weise ausgeben kann).

Wenn es eine andere Möglichkeit gibt, eine Datei zu verschlüsseln, die Shell-Skripte verwenden können, ist mir dies nicht bekannt, aber ich bin offen für andere Möglichkeiten.

BriGuy
quelle

Antworten:

16

Sie können dies mithilfe der Prozessersetzung tun .

. <(gpg -qd "$encrypted_filename")

Hier ist ein Beispiel:

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

gpg -dDie Datei wird nicht auf der Festplatte gespeichert, sondern nur an stdout ausgegeben. <()verwendet ein FIFO , was auch nicht dazu führt, dass die tatsächlichen Dateidaten auf die Festplatte geschrieben werden.

In Bash .und sourcesind Synonyme, aber es .ist portabler (es ist Teil von POSIX), also habe ich es hier verwendet. Beachten Sie jedoch, dass dies <()nicht so portabel ist - soweit ich weiß, wird es nur in bash, zsh, ksh88 und ksh93 unterstützt. pdksh und mksh haben Coprozesse, die den gleichen Effekt haben können.

Chris Down
quelle
Das ist eine sehr schöne Lösung. Ich dachte an eine Named Pipe, wollte sie aber nicht verwalten. Mir war nicht bewusst, dass ich es so machen könnte.
BriGuy
Wenn Sie sich Sorgen machen, dass jemand eine temporäre DATEI lesen kann, haben Sie natürlich genau die gleiche Sorge, wenn jemand die temporäre Pipe lesen kann, die von erstellt wurde <(command).
Zan Lynx
@ZanLynx Die Frage besagt ausdrücklich, dass es darum geht, nicht auf der Festplatte zu bestehen. Die Lösung, um dies auf andere Weise sicher zu tun, ist dieselbe wie überall sonst: Verwenden Sie einen Benutzer, den nur Sie steuern, und tun Sie dies auf einem System, auf dem nur Sie root sind.
Chris Down
1
Sie können dies auch mit einer verschlüsselten verschlüsselten Datei tun (was ich getan habe): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Wenn Sie gpg-agentrichtig eingerichtet sind pinentry-ttyund eine andere Version verwenden, die stdin / stdout nicht verschmutzt, sollten Sie in der Lage sein, Folgendes zu tun:

source <( gpg --decrypt file.gpg )

Dies verwendet die Prozessersetzung, um das Ergebnis sourceso zu füttern, als wäre es eine Datei. Die spezifischen Dateidaten verschwinden, sobald die Shell damit fertig ist. Danach müssen Sie jedoch noch vorsichtig mit den vertraulichen Daten im Speicher der Shell sein.

Tom Hunt
quelle
0

Da die vernünftigste Antwort bereits gegeben wurde, ist hier eine verrückte - verwenden Sie dieses Dateisystem:

https://github.com/jseppanen/gpgfs

Auf diese Weise bemerkt Ihr Programm nicht, dass es mit einer Pipe spricht.

d33tah
quelle