Есть ли способ получить зашифрованный (GPG) файл на лету в сценарии?

8

Мне нужен сценарий bash для создания файла, который зашифрован, так как источник содержит конфиденциальную информацию.

Я хотел бы, чтобы скрипт запросил парольную фразу GPG и затем запустил, используя зашифрованный файл. Я не могу понять, как это сделать, хотя. Для парольной фразы должен быть введен пользователь, поскольку я не хочу хранить ключ на сервере с зашифрованным файлом.

Изучая различные методы, я не хочу расшифровывать файл, исходить из незашифрованного файла, а затем удалять его. Я хотел бы уменьшить шанс оставить незашифрованный файл, если что-то пошло не так в скрипте.

Есть ли способ получить вывод GPG файла, чтобы получить его таким образом? Возможно, собирать STDOUT и анализировать его (если GPG может даже выводить содержимое таким образом).

Кроме того, если есть другой способ зашифровать файл, который могут использовать сценарии оболочки, я не знаю об этом, но открыт для других возможностей.

BriGuy
источник

Ответы:

16

Вы можете сделать это с помощью процесса замены .

. <(gpg -qd "$encrypted_filename")

Вот пример:

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

gpg -dне сохраняет файл на диск, он просто выводит его на стандартный вывод. <()использует FIFO , что также не приводит к записи фактических данных файла на диск.

В bash .и sourceявляются синонимами, но .более переносимы (это часть POSIX), поэтому я использовал их здесь. Обратите внимание, однако, что <()это не так переносимо - насколько я знаю, оно поддерживается только в bash, zsh, ksh88 и ksh93. У pdksh и mksh есть сопроцессы, которые могут иметь одинаковый эффект.

Крис Даун
источник
это очень хорошее решение. Думал о названной трубе, но не хотел этим управлять. Я не знал, что смогу сделать это таким образом.
BriGuy
Конечно, если вы беспокоитесь о том, что кто-то может прочитать временный ФАЙЛ, у вас точно такая же проблема, когда кто-то может прочитать временный канал, созданный <(command).
Зан Рысь
@ZanLynx В вопросе прямо говорится, что речь идет не о сохранении на диске. В противном случае безопасное решение будет таким же, как и везде: используйте пользователя, который контролируется только вами, и в системе, где только у вас есть root.
Крис Даун
1
Вы также можете сделать это с помощью зашифрованного файла (например, я это сделал): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Если вы gpg-agentправильно настроили, используете pinentry-ttyили другую версию, которая не загрязняет stdin / stdout, то вы сможете сделать что-то вроде:

source <( gpg --decrypt file.gpg )

При этом используется подстановка процесса для подачи результата, sourceкак будто это файл. Данные конкретного файла исчезнут, как только оболочка завершит работу с ним, хотя после этого вам все равно нужно быть осторожным с конфиденциальными данными в памяти оболочки.

Том Хант
источник
0

Поскольку самый здравый ответ уже был дан, вот безумный - используйте эту файловую систему:

https://github.com/jseppanen/gpgfs

Таким образом, ваша программа не заметит, что она говорит с каналом.

d33tah
источник