Wykorzystanie GPG do szyfrowania plików w Liuxie

by Patryk

W poprzednich artykułach skonfigurowaliśmy adresację, nazwy hostów, routing, a później także SSH i SCP, dzięki czemu nasze maszyny mogą się ze sobą bezpiecznie komunikować i przesyłać pliki. To jednak dopiero połowa sukcesu.

Jeśli wysyłasz plik do innej osoby albo przechowujesz w systemie coś wrażliwego, warto zadbać nie tylko o to, jak plik dociera do celu, ale też o to, czy jego zawartość jest odpowiednio zabezpieczona. I właśnie tutaj wchodzi GPG, czyli jedno z podstawowych narzędzi do szyfrowania, podpisywania i weryfikowania danych w systemach Linux. GPG obsługuje zarówno szyfrowanie oparte o hasło, jak i kryptografię klucza publicznego, a także podpisy cyfrowe i wymianę kluczy.

Przed przystąpieniem do tego artykułu warto przeczytać wcześniejszy wpis o podstawach kryptografii. Dzięki temu łatwiej zrozumiesz, czym różni się szyfrowanie symetryczne od asymetrycznego i dlaczego w ogóle potrzebujemy dwóch różnych podejść

Tradycyjnie w tym artykule wykorzystamy to samo środowisko, które zbudowaliśmy wcześniej.

Czym jest GPG


GPG to oprogramowanie szyfrujące typu open source. Służy między innymi do:

  • szyfrowania danych,
  • odszyfrowywania danych,
  • podpisywania plików i wiadomości,
  • weryfikowania podpisów cyfrowych.

GPG opiera się przede wszystkim na kryptografii klucza publicznego, ale potrafi też działać w trybie symetrycznym, czyli z użyciem jednego hasła.

W praktyce daje Ci dwa główne scenariusze:

  • chcesz zaszyfrować plik hasłem tylko dla siebie albo dla osoby, z którą wcześniej ustaliłeś wspólne hasło,
  • chcesz zaszyfrować plik kluczem publicznym odbiorcy, tak aby tylko on mógł go odczytać swoim kluczem prywatnym.

Sumy kontrolne i hashe — ważne rozróżnienie


Zanim przejdziemy do GPG, warto uporządkować jeszcze jedną rzecz: algorytmy haszujące. To ważne rozróżnienie, bo bardzo łatwo wrzucić „hashe” i „szyfrowanie” do jednego worka, choć w praktyce pełnią zupełnie inne funkcje.

Hashowanie to jednokierunkowe obliczanie skrótu z danych. Wynikiem jest ciąg znaków o określonej długości nazywany np.:

  • sumą kontrolną,
  • odciskiem palca,
  • hashem.

Najczęściej spotykane narzędzia to:

md5sum  
sha1sum  
sha256sum  
sha512sum

Polecenia sha256sum i sha512sum wyliczają skróty z rodziny SHA-2 o długości odpowiednio 256 i 512 bitów. Z kolei md5sum jest dziś raczej starszym, historycznym narzędziem niż najlepszym wyborem do nowych materiałów, więc w przykładach praktycznych lepiej eksponować SHA-256 lub SHA-512.

Hash przydaje się wtedy, gdy chcesz sprawdzić, czy plik:

  • nie został uszkodzony,
  • nie został zmodyfikowany,
  • jest identyczny z oryginałem.

Jeśli zmienisz choćby jeden znak w pliku, jego hash będzie inny. To właśnie dlatego sumy kontrolne są tak wygodne przy pobieraniu obrazów ISO, kopii zapasowych albo plików przesyłanych pomiędzy serwerami – nie ukrywają treści, ale bardzo dobrze pokazują, czy dane pozostały identyczne.

Praktyczne użycie hashy

W poprzednim artykule przesyłaliśmy pliki przez scp. Wykorzystując tą wiedzę możesz bardzo łatwo zobaczyć praktyczne użycie hashy:

  1. utwórz plik na Debianie,
  2. policz jego sumę kontrolną,
  3. wyślij plik na CentOS przez scp,
  4. policz sumę kontrolną ponownie po stronie CentOS-a.

Na Debianie:

echo "To jest plik testowy" > plik.txt  
sha256sum plik.txt  
scp plik.txt krystian@centos:/home/krystian/

Jeśli wynik jest identyczny, masz potwierdzenie, że plik został przesłany bez zmian. To nie jest jeszcze szyfrowanie, ale bardzo ważny element bezpieczeństwa operacyjnego, bo pozwala odróżnić „plik doszedł” od „plik doszedł dokładnie w tej samej postaci”.

30Szyfrowanie i odszyfrowanie pliku kluczem symetrycznym


To najprostszy scenariusz: szyfrujesz i odszyfrowujesz plik jednym hasłem. Taki tryb jest wygodny wtedy, gdy chcesz zabezpieczyć plik lokalnie albo przekazać go komuś, z kim wcześniej ustaliłeś wspólne hasło innym kanałem komunikacji.

Instalacja GPG

Warto zainstalować GPG na obu systemach, nawet jeśli początkowo szyfrujesz plik tylko na jednym z nich. Dzięki temu później łatwo przetestujesz odszyfrowanie po drugiej stronie i zobaczysz, jak takie pliki zachowują się w praktyce po przesłaniu przez SCP.

Instalacja na Debianie:

apt install -y gpg

Instalacja na CentOS-ie:

sudo yum install -y gnupg2

Tworzenie pliku testowego

Najlepiej użyć prostego pliku tekstowego, żeby łatwo zobaczyć różnicę między wersją jawną a zaszyfrowaną. W realnym środowisku w ten sam sposób możesz zabezpieczyć np. notatki administracyjne, backup konfiguracji albo eksport z bazy danych. Na ten moment jednak utwórz na Debianie, jako użytkownik patryk plik klucze.txt:

cd /home/patryk  
echo "Moj tajny plik" > klucze.txt

Szyfrowanie pliku

Do szyfrowania pliku służy poniższe polecenie. Po jego użyciu GPG poprosi Cię o hasło. Po poprawnym zaszyfrowaniu powstanie plik klucze.txt.gpg.

gpg --cipher-algo AES256 -c klucze.txt

Usunięcie oryginału

Jeśli chcesz zostawić tylko zaszyfrowaną wersję, możesz usunąć oryginał:
Dodatkowo warto usunąć oryginał, co jest dobrym nawykiem jeśli zależy Ci na ograniczeniu ryzyka pozostawienia jawnej kopii danych na dysku.

shred -u klucze.txt

Odszyfrowanie pliku

Do odszyfrowania pliku służy poniższe polecenie. Po podaniu poprawnego hasła GPG odtworzy oryginalny plik.

gpg klucze.txt.gpg

Szyfrowanie asymetryczne i podpis cyfrowy w naszym laboratorium


Teraz przechodzimy do ciekawszego scenariusza. Wykorzystamy dwa hosty z naszego laboratorium: CentOS oraz Debian.

Przygotowanie kluczy GPG na Debianie i CentOS-ie

Na początku generujemy parę kluczy GPG na obu systemach. W naszym laboratorium wykorzystujemy użytkownika patryk na Debianie oraz krystian na CentOS-ie.

Na Debianie, jako użytkownik patryk, uruchom:
Jako użytkownik patryk:

gpg --full-generate-key

Przykładowe dane:

  • typ klucza: RSA and RSA
  • długość: 2048 albo 3072
  • ważność: według potrzeb, np. bezterminowo do laba – 0
  • imię i nazwisko: Patryk Kowalski
  • e-mail: pkowalski@firma.com
  • Na końcu zamiast wychodzić klikamy literkę D aby utworzyć hasło do klucza

Na CentOS-ie, jako użytkownik krystian, najpierw doinstaluj pinentry, a następnie wygeneruj klucz:

yum install pinentry  
gpg --full-generate-key

Przykładowe dane:

  • typ klucza: RSA and RSA
  • długość: 2048 albo 3072
  • ważność: według potrzeb, np. bezterminowo do laba — 0
  • imię i nazwisko: Krystian Kowalski
  • e-mail: kkowalski@firma.com
  • Na końcu zamiast wychodzić klikamy literkę D aby utworzyć hasło do klucza

Po wygenerowaniu kluczy warto upewnić się, że para kluczy została utworzona poprawnie na obu systemach:

To polecenie pokazuje zarówno klucze publiczne, jak i prywatne dostępne w lokalnym keyringu. Dzięki temu od razu widzisz, czy GPG poprawnie utworzył komplet potrzebny do szyfrowania, odszyfrowywania i podpisywania danych.

Wymiana i weryfikacja kluczy publicznych

Żeby druga osoba mogła zaszyfrować plik dla Ciebie albo zweryfikować Twój podpis, musi dostać Twój klucz publiczny. Najwygodniej najpierw wyeksportować go do pliku, a potem bezpiecznie przesłać na drugi system przez scp.

Na Debianie eksportujemy klucz Patryka:

gpg --output pkowalski.gpg --export pkowalski@firma.com

Na CentOS-ie eksportujemy klucz Krystiana:

gpg --output kkowalski.gpg --export kkowalski@firma.com

Następnie wymieniamy się kluczami pomiędzy systemami.

Z Debiana na CentOS

scp pkowalski.gpg krystian@centos:/home/krystian/

Z CentOS-a na Debiana

scp kkowalski.gpg patryk@debian:/home/patryk/

Po przesłaniu klucze trzeba zaimportować do lokalnego keyringu.

Na Debianie

gpg --import /home/patryk/kkowalski.gpg

Na CentOS-ie

gpg --import /home/krystian/pkowalski.gpg

Po imporcie klucz pojawi się na liście, ale nadal będzie oznaczony jako niezaufany. To normalne, bo sam import nie oznacza jeszcze, że masz pewność, do kogo ten klucz naprawdę należy.

Dlatego kolejnym krokiem jest sprawdzenie odcisku palca i podpisanie klucza po jego zweryfikowaniu.

Na obu systemach:
Do podpisania klucza służy polecenie gpg –edit-key, po którym wskazujemy nazwę niezaufanego klucza. Należy uważać aby wskazać odpowiedni klucz. Ważne jest to aby zrobić to na obu systemach!

W trybie edycji wyświetlamy odcisk palca komendą:

fpr

Przed podpisaniem klucza warto porównać fingerprint innym kanałem niż sam przesyłany plik, na przykład przez SSH, komunikator albo rozmowę. Jeśli odcisk się zgadza, podpisanie klucza oznacza, że od tego momentu lokalnie traktujesz go jako wiarygodny. Podpisanie musimy potwierdzić hasłem do swojego klucza prywatnego.

sign  
quit

Po tej operacji klucz stanie się wiarygodny. Co można zweryfikować poleceniem gpg –list-keys. Na obu systemach klucze powinny być zaufane.

Szyfrowanie pliku dla drugiej osoby i odszyfrowanie

Po wymienieniu i zweryfikowaniu kluczy możemy przejść do praktycznego użycia. Załóżmy, że Patryk z Debiana chce wysłać poufny plik do Krystiana na CentOS-ie.

Na Debianie tworzymy plik:

echo "To jest tajny plik dla Krystiana" > tajnyplik.txt

Następnie szyfrujemy go kluczem publicznym Krystiana:

gpg --output tajnyplik.txt.gpg --encrypt --recipient kkowalski@firma.com tajnyplik.txt

Teraz plik file.txt.gpg może odszyfrować tylko właściciel odpowiadającego mu klucza prywatnego, czyli Krystian. To właśnie największa zaleta szyfrowania asymetrycznego: nie musisz przekazywać drugiej osobie wspólnego hasła, a mimo to tylko ona może odczytać treść.

Tak przygotowany plik wysyłamy przez SCP do Krystiana:

scp tajnyplik.txt.gpg krystian@centos:/home/krystian/

Po stronie CentOS-a Krystian odszyfrowuje plik poleceniem:

gpg --output tajnyplik.txt --decrypt tajnyplik.txt.gpg

Po podaniu hasła do swojego klucza prywatnego odzyska oryginalną treść wiadomości. W tym miejscu bardzo dobrze widać połączenie z wcześniejszymi artykułami: SCP odpowiada za bezpieczny transport, a GPG za zabezpieczenie samej zawartości pliku.

Podpisywanie cyfrowo wiadomości – (podpis elektroniczny) z wykorzystaniem naszego klucza prywatnego


Podpis cyfrowy rozwiązuje inny problem niż szyfrowanie. Nie chodzi tu o ukrycie treści, ale o potwierdzenie:

  • kto utworzył plik,
  • czy plik nie został zmieniony po podpisaniu.

Podpisanie pliku na Debianie

Na systemie Debian tworzymy plik wiadomość i szyfrujemy go swoim kluczem prywatnym

echo "testowa wiadomosc" > wiadomosc.txt  
gpg --sign wiadomosc.txt

Plik ten może być odszyfrowany przez każdą osobę, która posiada klucz publiczny powiązany z kluczem prywatnym, który był użyty do zaszyfrowania wiadomości. Traktowane to jest jako podpis elektroniczny, dzięki czemu każdy wie, że to było podpisane przez właściciela klucza prywatnego. Taki plik możesz wysłać do Krystiana:

scp wiadomosc.txt.gpg krystian@centos:/home/krystian/

Weryfikacja podpisu na CentOS-ie

W systemie CentOS weryfikujemy podpis

gpg --verify wiadomosc.txt.gpg

Jeśli podpis jest poprawny i klucz Patryka został wcześniej zaimportowany oraz oznaczony jako zaufany, GPG pokaże informację, że podpis został zweryfikowany.

Odczytanie treści

Po zweryfikowaniu podpisu elektronicznego odszyfrowujemy wiadomość

gpg --output wiadomosc.txt --decrypt wiadomosc.txt.gpg

W tym przypadku nie chodzi o poufność dla konkretnego odbiorcy, tylko o potwierdzenie autentyczności.

You may also like

Leave a Comment