Zaszyfruj plik tar.gz podczas tworzenia

33

Mam skrypt, który tworzy nocną kopię zapasową kilku katalogów.

Jest tworzony przy użyciu tar -czf, a docelowa ścieżka do pliku tar.gz znajduje się w zamontowanym katalogu sieciowym. Plik wynikowy ma około 1,2 GB.

Szybkość sieci jest dość duża (kopiowanie z dysku sieciowego na lokalny odbywa się z prędkością ~ 28 MB / s).

Teraz chcę użyć szyfrowania z kluczem publicznym do zaszyfrowania pliku tar.gz przed przesłaniem go na dysk sieciowy i chciałbym wiedzieć, jaki jest najlepszy sposób.

Czy najpierw muszę utworzyć plik lokalnie, zaszyfrować go, a następnie skopiować? A może istnieje sposób na „przesłanie strumieniowe” danych wyjściowych tar przez proces szyfrowania i zapisanie wyników bezpośrednio na dysku sieciowym?

Joel L.
źródło

Odpowiedzi:

34

Zapakuj your_dirdo zaszyfrowanego archiwum your_archive.tgz.gpg(szyfrowanie symetryczne):

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

Rozpakuj to:

gpg -d your_archive.tgz.gpg | tar xz

Zobacz dokumentację GPG, aby dowiedzieć się, jak używać szyfrowania asymetrycznego zamiast szyfrowania symetrycznego.

Florian Diesch
źródło
2
Wydaje się, że używanie GPG tworzy klucze w uchwycie domowym użytkownika i monituje o podanie hasła. Zasadniczo proces ten wydaje mi się zbyt nieprzejrzysty jak na mój gust…
Joel L
Czy zamiast tego powinien tar xzbyć drugi zestaw poleceń tar -xz?
Kenny Evitt
1
@KennyEvitt: Możesz go używać z lub bez-
Florian Diesch
Działa to również w przypadku plików zaszyfrowanych przy pomocy gpg-zip!
Trefex,
2
gpg już kompresuje pliki, nie sądzę, że ta zopcja dodaje wiele
feklee
12

Poniższy proces najpierw szyfruje plik na dysku lokalnym, a następnie może zostać przesłany przez sieć (lub zapisany w razie potrzeby)


Najpierw wygeneruj klucze publiczne i prywatne (wykonywane tylko raz):

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

Następnie przy każdej kopii zapasowej:

  1. Wygeneruj długie losowe hasło, zapisz w pliku

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. szyfruj plik za pomocą passphase

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. szyfruj hasło kluczem publicznym

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

Następnie zapisz encrypted.dat AND enc.key.txt w razie potrzeby.


Aby odszyfrować:

  1. Odszyfruj zaszyfrowane hasło kluczem prywatnym

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Odszyfruj plik

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

Jest to znacznie dłużej niż odpowiedź Floriana, ale zdecydowałem się go użyć, aby lepiej zrozumieć proces i nie polegać na zmiennych konfiguracyjnych GPG zależnych od serwera itp. Nie mogłem też znaleźć żadnej przydatnej dokumentacji GPG.

Joel L.
źródło
1
Można również łatwo utworzyć losowe hasło za pomocą openssl openssl rand 32 -out key.txt
Wolfgang
@Wolfgang - Właściwie generuję passphase ze skryptu python (który uruchamia proces tworzenia kopii zapasowej), ale dziękuję za podpowiedź!
Joel L,
2
FYI: Dlaczego nie powinieneś szyfrować plików za pomocą openssl: stackoverflow.com/questions/28247821/...
Daniel Hiller
Czym dokładnie jest ten plik „enc.key.txt”? Patrzę na proces, który tworzy kopię zapasową plików na moim serwerze i chcę tylko móc odszyfrować przy użyciu klucza, który nie jest przechowywany na serwerze.
Alex Stewart
6

Robię to z asymetrycznym szyfrowaniem klucza. Oznacza to, że mam klucz publiczny (który mogę udostępnić każdemu, kto chce mi przesłać zaszyfrowane pakiety), który pozwala mi zaszyfrować pakiet. Mam również klucz prywatny (którego nie udostępniam), który pozwala mi odszyfrować pakiet.

Moje polecenia do szyfrowania bieżącego katalogu roboczego: -e do szyfrowania, -r, aby określić „odbiorcę” lub klucz do użycia, -o, aby określić plik wyjściowy.

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

Aby odszyfrować do bieżącego katalogu roboczego:

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

Lub odszyfrować do standardowego pliku TGZ w celu późniejszego rozpakowania:

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

Oczywiście działa to tylko wtedy, gdy wygenerowałem już parę kluczy publiczny-prywatny i zainstalowałem ją z gpg. W moim przypadku zrobiłem to, korzystając z przewodnika Digital Ocean na https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu -12-04-vps . ABCD1234 w poleceniu szyfrowania odnosi się do jednego z kluczy publicznych zainstalowanych w moim systemie. W tym przewodniku omówiono także sposób udostępniania klucza publicznego i instalowania kluczy publicznych innych osób w celu wysyłania i odbierania zaszyfrowanych plików.

duży typ
źródło
0

GnuPG jest tym, co wybrałem do tego procesu, a ponieważ powiedziałeś, że kroki deszyfrowania są nieprzejrzyste (zgadzam się w tym przypadku użycia), pracowałem również po tej stronie problemu. Sprawdź dzienniki kompilacji Travis-CI projektów, aby dowiedzieć się, jakie funkcje działają obecnie zgodnie z projektem, oraz plik travis.yml do śledzenia wraz z danymi wyjściowymi dzienników. Zasadniczo potrzebujesz trzech skryptów z tego projektu; skrypt keygen, skrypt pomocniczy deszyfrowania i nazwany skrypt nasłuchiwania potoków. Skrypt keygen i skrypt pomocniczy deszyfrowania powinien być używany na urządzeniu, które przeprowadzi deszyfrowanie, a nazwany skrypt nasłuchiwania potoków powinien znajdować się na urządzeniu szyfrującym preformowanie.

Zaszyfrowany skrypt nasłuchiwania nazwanych potoków akceptuje ciągi, ścieżki plików lub ścieżki katalogów po skonfigurowaniu i wyświetla zaszyfrowane wyniki w przewidywalny sposób.

Poniżej znajdują się przykładowe polecenia, które można umieścić w nocnym skrypcie kopii zapasowej do szyfrowania oraz do kompresji katalogów + szyfrowania

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

Do deszyfrowania będziemy chcieli, aby sprawdzić, w jaki sposób budować skrypty .travis-ci/script_decrypt.shi .travis-ci/test_search_script_decrypt.shna jak załączonych ciągi zaszyfrowanych danych są odzyskiwane i jak pliki luzem / katalogi są przywracane.

Oczywiście w przypadku tego eksperymentu najlepiej nie używać par klucza podstawowego (tak jakby napisano skrypt keygen) i nie należy go używać w ważnych danych, dopóki nie będziesz pewny, jak przywrócić go do postaci czytelnej.

S0AndS0
źródło