Apakah ada cara untuk sumber file terenkripsi (GPG) on-the-fly dalam skrip?

8

Saya memerlukan skrip bash untuk sumber file yang dienkripsi, karena file yang bersumber berisi informasi sensitif.

Saya ingin script untuk meminta frasa sandi GPG dan kemudian jalankan, sumber file yang dienkripsi. Saya tidak tahu bagaimana melakukan ini. Harus ada input pengguna untuk frasa sandi, karena saya tidak ingin menyimpan kunci di server dengan file yang dienkripsi.

Melihat ke beberapa metode yang berbeda, saya tidak ingin mendekripsi file, sumber file non-terenkripsi, kemudian hapus setelah. Saya ingin mengurangi kemungkinan meninggalkan file yang tidak dienkripsi, jika ada kesalahan dalam skrip.

Apakah ada cara untuk mendapatkan output GPG dari file untuk sumber dengan cara ini? Mungkin mengumpulkan STDOUT dan menguraikannya (jika GPG bahkan dapat menampilkan konten dengan cara ini).

Juga, jika ada cara lain untuk mengenkripsi file yang dapat digunakan skrip shell, saya tidak menyadarinya, tetapi terbuka untuk kemungkinan lain.

BriGuy
sumber

Jawaban:

16

Anda dapat melakukan ini menggunakan proses substitusi .

. <(gpg -qd "$encrypted_filename")

Ini sebuah contoh:

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

gpg -dtidak bertahan file ke disk, itu hanya output ke stdout. <()menggunakan FIFO , yang juga tidak menghasilkan data file aktual yang ditulis ke disk.

Dalam bash, .dan ini sourceadalah sinonim, tetapi .lebih portabel (itu bagian dari POSIX), jadi saya sudah menggunakannya di sini. Catatan, bagaimanapun, itu <()tidak portabel - sejauh yang saya tahu itu hanya didukung di bash, zsh, ksh88, dan ksh93. pdksh dan mksh memiliki coprocesses yang dapat memiliki efek yang sama.

Chris Down
sumber
ini adalah solusi yang sangat bagus. Memikirkan pipa bernama, tetapi tidak mau mengelolanya. Saya tidak sadar saya bisa melakukannya dengan cara ini.
BriGuy
Tentu saja, jika Anda memiliki kekhawatiran tentang seseorang yang dapat membaca FILE sementara, dengan ini Anda memiliki kekhawatiran yang sama persis dengan seseorang yang dapat membaca pipa sementara yang dibuat oleh <(command).
Zan Lynx
@ ZanLynx Pertanyaan secara eksplisit menyatakan bahwa ini adalah tentang tidak bertahan pada disk. Solusi untuk melakukan ini dengan aman sebaliknya adalah sama dengan di tempat lain: gunakan pengguna yang hanya Anda kendalikan, dan lakukan pada sistem di mana hanya Anda yang memiliki root.
Chris Down
1
Anda juga dapat melakukan ini dengan file terenkripsi aescrypt (yang saya lakukan): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Jika Anda telah gpg-agentmemasang dengan benar, menggunakan pinentry-ttyatau versi lain yang tidak mencemari stdin / stdout, maka Anda harus dapat melakukan sesuatu seperti:

source <( gpg --decrypt file.gpg )

Ini menggunakan proses substitusi untuk memberi makan hasilnya source seolah-olah itu file. Data file tertentu akan hilang segera setelah shell selesai dengan itu, meskipun Anda masih perlu berhati-hati tentang data sensitif dalam memori shell setelah itu.

Tom Hunt
sumber
0

Karena jawaban yang paling waras telah diberikan, inilah jawaban yang gila - gunakan sistem file ini:

https://github.com/jseppanen/gpgfs

Dengan cara ini, program Anda tidak akan menyadari bahwa ia sedang berbicara ke sebuah pipa.

d33tah
sumber