У меня есть скрипт, который создает ночные резервные копии нескольких каталогов.
Он создан с использованием tar -czf
, а путь к файлу tar.gz назначения находится в смонтированном сетевом каталоге. Полученный файл имеет размер около 1,2 ГБ.
Скорость сети достаточно высокая (копирование с сетевого диска на локальный происходит со скоростью ~ 28 МБ / с).
Теперь я хочу использовать шифрование с открытым ключом для шифрования файла tar.gz перед его передачей на сетевой диск, и хотел бы знать, как лучше всего это сделать.
Должен ли я сначала создать файл локально, зашифровать его, а затем скопировать? Или есть способ «передать» поток tar через процесс шифрования и записать результаты непосредственно на сетевой диск?
Пакет 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 для получения информации об использовании асимметричного вместо симметричного шифрования.
Я делаю это с помощью асимметричного ключа шифрования. Это означает, что у меня есть открытый ключ (которым я могу поделиться с любым, кому я хотел бы отправить мне зашифрованные пакеты), который позволяет мне шифровать пакет. У меня также есть закрытый ключ (который я не разделяю), который позволяет мне расшифровывать пакет.
Мои команды для шифрования текущего рабочего каталога: -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- Ан-Ubuntu-12-04-VPS . ABCD1234 в команде шифрования относится к одному из открытых ключей, установленных в моей системе. В этом руководстве также рассказывается, как поделиться своим открытым ключом и установить другие открытые ключи для отправки и получения зашифрованных файлов.
GnuPG - это то, что я выбрал для этого процесса, и потому что вы указали, что шаги дешифрования, где непрозрачность (я согласен в этом примере использования), я также работал над этой стороной проблемы. Проверьте журналы сборки проектов Travis-CI , чтобы узнать, какие функции в настоящее время работают, как задумано, и файл travis.yml для отслеживания наряду с выводом журналов. В основном вам понадобятся три сценария из этого проекта; сценарий keygen, сценарий дешифрования и сценарий прослушивания именованных каналов. Скрипт кейгена & amp; вспомогательный сценарий дешифрования должен использоваться на устройстве, которое будет выполнять дешифрование, а сценарий прослушивания именованного канала должен быть на устройстве, выполняющем шифрование.
Сценарий прослушивания именованного канала принимает строки, пути к файлам или каталогам после установки и выводит зашифрованные результаты предсказуемым образом.
Ниже приведены примеры команд, которые могут быть помещены в ваш скрипт ночного резервного копирования для шифрования и для сжатия каталогов + шифрование
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
& amp ; .travis-ci/test_search_script_decrypt.sh
о том, как восстанавливать добавленные строки зашифрованных данных и как восстанавливать объемные файлы / каталоги.
Конечно, в эксперименте лучше не использовать пары первичных ключей (почему был написан скрипт keygen), и его не следует использовать с важными данными, пока вы не уверены, как восстановить их в читаемую форму. [ 119]
Следующий процесс сначала шифрует файл на локальном диске, а затем может быть отправлен по сети (или, при необходимости, сохранен).
Сначала создайте открытый и закрытый ключи (выполняется только один раз):
openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout
Затем при каждом резервном копировании:
Создать длинную случайную фразу-пароль, сохранить в файл
echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
шифровать файл с парольной фазой
openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
шифровать кодовую фразу с открытым ключом
openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt
Затем сохраните encrypted.dat И enc.key.txt, где это необходимо.
Для расшифровки:
Расшифровать зашифрованную фразу-пароль с закрытым ключом
openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
Расшифровать файл
openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE
Это намного дольше, чем ответ Флориана, но я решил использовать чтобы я мог лучше понять процесс и не зависеть от зависящих от сервера переменных конфигурации GPG и т. д. Я также не смог найти никакой полезной документации GPG.
Я использовал отличное решение Флориана Диша выше, но столкнулся с этой проблемой:
gpg: problem with the agent: Inappropriate ioctl for device
gpg: error creating passphrase: Operation cancelled
gpg: symmetric encryption of '[stdin]' failed: Operation cancelled
Помимо работы с моей Ubuntu 20.04, мне нужно было установить для gpg:
$GPG_TTY=$(tty)
$export GPG_TTY
как описано здесь
Тогда я мог бы приступить к решению Флориана! Спасибо!
Несколько другой метод, который также хорошо работает с linux (Ubuntu 20.04), описан здесь