Зашифровать файл tar.gz при создании

33

У меня есть скрипт, который создает ночные резервные копии нескольких каталогов.

Он создается с использованием tar -czf, а путь к файлу tar.gz назначения находится в смонтированном сетевом каталоге. Полученный файл имеет размер около 1,2 ГБ.

Скорость сети достаточно высокая (копирование с сетевого диска на локальный происходит со скоростью ~ 28 МБ / с).

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

Должен ли я сначала создать файл локально, зашифровать его, а затем скопировать? Или есть способ «передать» поток tar через процесс шифрования и записать результаты непосредственно на сетевой диск?

Джоэл Л
источник

Ответы:

34

Упаковать your_dirв зашифрованный архив your_archive.tgz.gpg(симметричное шифрование):

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg

Распакуйте его:

gpg -d your_archive.tgz.gpg | tar xz

См. Документы GPG, чтобы узнать, как использовать асимметричное шифрование вместо симметричного.

Флориан Диш
источник
2
Использование GPG создает ключи в домашнем хранилище пользователя и запрашивает парольную фразу. В принципе, процесс кажется мне слишком непрозрачным…
Джоэл Л.
Должны ли tar xzво втором наборе команд быть tar -xzвместо?
Кенни Эвитт
1
@KennyEvitt: Вы можете использовать его с или без-
Florian Diesch
Это работает и для файлов, зашифрованных с помощью gpg-zip!
Trefex
2
gpg уже сжимает файлы, не думаю, что zопция добавляет много
фекли
12

Следующий процесс сначала шифрует файл на локальном диске, а затем может быть отправлен по сети (или, при необходимости, сохранен)


Сначала создайте открытый и закрытый ключи (выполняется только один раз):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

Затем при каждом резервном копировании:

  1. Создать длинную случайную фразу-пароль, сохранить в файл

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. зашифровать файл с парольной фазой

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. зашифровать пароль с открытым ключом

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

Затем сохраните encrypted.dat И enc.key.txt, где это необходимо.


Для расшифровки:

  1. Расшифровать зашифрованную фразу-пароль с закрытым ключом

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Расшифровать файл

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE

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

Джоэл Л
источник
1
Случайная ключевая фраза также может быть легко создан с помощью OpenSSL , как так openssl rand 32 -out key.txt
Wolfgang
@Wolfgang - я на самом деле генерирую парольную фазу из скрипта Python (который запускает процесс резервного копирования), но спасибо за совет!
Джоэл Л
2
К вашему сведению: почему вы не должны шифровать файлы с помощью openssl: stackoverflow.com/questions/28247821/…
Даниэль Хиллер,
Что именно представляет собой этот файл «enc.key.txt»? Я смотрю на процесс, который выполняет резервное копирование файлов моего сервера и хочет иметь возможность расшифровывать только с помощью ключа, который не хранится на сервере.
Алекс Стюарт
6

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

Мои команды для шифрования текущего рабочего каталога: -e для шифрования, -r для указания «получателя» или ключа для использования, -o для указания выходного файла.

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg

И расшифровать в текущий рабочий каталог:

$ gpg -d backup.tgz.gpg | tar -xz

Или расшифровать в стандартный файл tgz для последующей распаковки:

$ gpg -o backup.tgz -d backup.tgz.gpg

Конечно, это работает, только если я уже сгенерировал пару открытый-закрытый ключ и установил ее с помощью gpg. В моем случае я сделал это, используя руководство Digital Ocean по адресу https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu. -12-04-vps . ABCD1234 в команде шифрования относится к одному из открытых ключей, установленных в моей системе. В этом руководстве также рассказывается, как поделиться своим открытым ключом и установить другие открытые ключи для отправки и получения зашифрованных файлов.

mightypile
источник
0

GnuPG - это то, что я выбрал для этого процесса, и потому что вы указали, что шаги дешифрования, где непрозрачность (я согласен в этом примере использования), я также работал над этой стороной проблемы. Проверьте журналы сборки проектов Travis-CI, чтобы узнать, какие функции в настоящее время работают, как задумано, и файл travis.yml для отслеживания наряду с выводом журналов. В основном вам понадобятся три сценария из этого проекта; сценарий keygen, сценарий дешифрования и сценарий прослушивания именованных каналов. Сценарий keygen и вспомогательный сценарий дешифрования должны использоваться на устройстве, которое будет выполнять дешифрование, а сценарий прослушивания именованного канала должен быть на устройстве, выполняющем шифрование.

Сценарий прослушивания именованного канала принимает строки, пути к файлам или каталогам после установки и выводит зашифрованные результаты предсказуемым образом.

Ниже приведены примеры команд, которые могут быть помещены в ваш скрипт ночного резервного копирования для шифрования и для сжатия каталогов + шифрование.

echo "some messages text" > /path/to/named.pipe
## Message text is ASCII armor encrypted and appended to specified file when script was stated
echo "${HOME}/Documents" > /path/to/named.pipe
## Directories are compressed with tar and encrypted with output to time stamped file in bulk output directory
echo "${HOME}/.bash_history"  > /path/to/named.pipe

Для расшифровки вы захотите проверить, как сценарии сборки .travis-ci/script_decrypt.shи .travis-ci/test_search_script_decrypt.shкак восстанавливаются добавленные строки зашифрованных данных и как восстанавливаются массовые файлы / каталоги.

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

S0AndS0
источник