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:
- utwórz plik na Debianie,
- policz jego sumę kontrolną,
- wyślij plik na CentOS przez scp,
- 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.