Зашифруйте файл tar.gz при створенні


33

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

Він створений за допомогою tar -czf, а шлях до файлу tar.gz до місця призначення знаходиться на встановленому мережевому каталозі. Отриманий файл розміром близько 1,2 Гбіт.

Швидкість мережі досить швидка (копіювання з мережевого диска на локальний відбувається зі швидкістю ~ 28 Мб / сек).

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

Чи потрібно спершу створити файл локально, зашифрувати його, а потім скопіювати? Або є спосіб "потік" виведення дьогтю через процес шифрування і записати результати безпосередньо на мережевий диск?

Відповіді:


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, здається, створює ключі у власнику будинку користувача та вимагає ввести парольну фразу. В основному, процес здається мені занадто непрозорим на мій смак ...
Joel L

Чи повинен tar xzу другому наборі команд бути tar -xzзамість цього?
Кенні Евітт

1
@KennyEvitt: Ви можете використовувати його з або без-
Флоріан Дієш

Це працює і для файлів, зашифрованих також gpg-zip!
Trefex

2
gpg вже стискає файли, не думаю, що цей zваріант додає багато
feklee

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 AND 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 - я фактично генерую пропускну силу з сценарію python (який запускає процес резервного копіювання), але дякую за пораду!
Джоель Л

2
FYI: Чому ви не повинні шифрувати файли через openssl: stackoverflow.com/questions/28247821/…
Daniel Hiller,

Що це за файл "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 посилається на один із відкритих ключів, встановлений у моїй системі. У цьому посібнику також описано, як ділитися відкритим ключем та встановлювати відкриті ключі інших людей для надсилання та отримання зашифрованих файлів.


0

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

Зашифрований скрипт слухача слухача приймає рядки, шляхи до файлів або шляхи до каталогу після встановлення та видає зашифровані результати передбачувано.

Нижче наведено приклади команд, які можна помістити у ваш нічний скрипт резервного копіювання для шифрування та для стиснення каталогів + шифрування

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як відновляються додані рядки зашифрованих даних та як відновлюються масові файли / каталоги.

Звичайно, для цього експерименту найкраще не використовувати пари первинних ключів (якось чому був написаний скрипт кегена), і він не повинен використовуватися на важливих даних, поки ви не впевнені в тому, як відновити його до читабельної форми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.