Narzędzia użytkownika

Narzędzia witryny


materialy:bezpieczenstwo:gpg

GPG

Materiał poniższy obejmuje zakres tematu 110.3 Securing data with encryption dla LPI, egzamin 102, certyfikat LPIC-1. Jeśli chcesz sprawdzić praktycznie zakres poniższego materiału, możesz również zrealizować zadania.

Dla pełnego zakresu tematu 110.3 Securing data with encryption zapoznaj się również z SSH.

Wstęp

Oprogramowanie Gnu Privacy Guard służy obsługi szyfrowania i deszyfrowania danych za pomocą zestawu kluczy asymetrycznych (publicznego i prywatnego). Z punktu widzenia użytkownika to bardzo wygodne narzędzie do szyfrowania plików lub tekstu (np. maili) dające pewność, że tylko konkretny odbiorca będzie w stanie informację odszyfrować.

GPG jest darmowym zamiennikiem komercyjnego oprogramowania PGP do enkrypcji danych. Co więcej, GPG jest kompatybilny z PGP, strony komunikacji wymieniające między sobą zaszyfrowane dane mogą korzystać z dowolnie wybranego oprogramowania. Różnice na pierwszy rzut oka mogą wynikać z innego interfejsu obsługi (czasami wygodniejszego w wersji komercyjnej).

Poniżej znajdziecie zwięzły opis GPG w wersji konsolowej dla systemu Linux, który pozwoli przede wszystkim szyfrować i deszyfrować całe pliki.

Teoria kluczy prywatnych i publicznych

Można wyróżnić dwie podstawowe kategorie szyfrowania danych - symetryczne i asymetryczne. To pierwsze polega na tym, że nadawca szyfrujący informację oraz odbiorca deszyfrujący tą samą informację używa tych samych danych (zazwyczaj hasła lub tokenu) do szyfrowania i deszyfrowania. Szyfrowanie asymetryczne polega na użyciu innego zestawu danych do szyfrowania i innego do deszyfrowania tej samej informacji.

GPG oparte jest w szyfrowaniu asymetrycznym z wykorzystaniem kluczy. Klucze w postaci plików są generowane („produkowane”) w parze - klucz publiczny i prywatny jednocześnie. Idea metody polega na tym, iż informacje zaszyfrowane kluczem publicznym można odszyfrować jedynie kluczem prywatnym z tej samej pary. Możliwa jest również operacja odwrotna – dane zaszyfrowane kluczem prywatnym, można odszyfrować jedynie kluczem publicznym. Jest to metoda szyfrowania asymetrycznego – do tworzenia kryptogramu (zaszyfrowanej informacji) i jego deszyfracji nie używa się tego samego klucza. Nie da się również odszyfrować wiadomości tym samym kluczem, który został użyty do utworzenia zaszyfrowanej wiadomości. Klucz prywatny powinien być chroniony przez właściciela, natomiast publiczny może być dowolnie rozpowszechniany w Internecie.

Wyobraźmy sobie dwóch aktorów - Konrada i Marcina. Konrad chciałby zaszyfrować wiadomość do kolegi za pomocą GPG. Wcześniej generuje parę kluczy prywatny i publiczny. Klucze to nic innego jak pliki. Klucz prywatny Konrad pozostawia tylko dla siebie, publiczny przekazuje bezpiecznym kanałem, najlepiej bezpośrednio Marcinowi. Podobne kroki podejmuje Marcin - generuje swoje klucze prywatny i publiczny następnie przekazuje bezpiecznym kanałem Konradowi swój klucz publiczny.

Konrad szyfruje wiadomość kluczem publicznym Marcina i tak zaszyfrowaną wiadomość przesyła do niego. Ponieważ Marcin dysponuje swoim kluczem prywatnym może wiadomość od Konrada odszyfrować. Konrad mógłby tą samą wiadomość potraktować nie tylko kluczem publicznym Marcina, ale również swoim kluczem prywatnym generując „podpis” dla wiadomości. Podpis to nic innego jak zaszyfrowanie skróconej formy wiadomości (np. sumy kontrolnej całej wiadomości) swoim kluczem prywatnym. Marcin odbierając taki podpis, może go odszyfrować kluczem publicznym Marcina, a ponieważ zna źródło pochodzenia tego klucza może mieć pewność, że wiadomość pochodzi rzeczywiście od Konrada. Zastosowanie dwóch par kluczy może więc zapewnić poufność i jednocześnie uwierzytelnianie źródła danych.

Wymiana informacji zaszyfrowanej w GPG - studium przypadku

Zastosowanie GPG i jego wykorzystanie przedstawimy na podstawie studium przypadku wraz z wszelkimi komendami potrzebnymi do zademonstrowania zagadnienia.

Zadanie będzie polegało na wymianie między Marcinem, którego adres mailowy to marcin@krakow.test.itmz.pl oraz Konradem konrad@warszawa.test.itmz.pl. Panowie wysyłają między sobą następujące informacje:

  1. Konrad wysyła zaszyfrowany plik wiadomosc-od-Konrada-dla-Marcina.txt tak, aby tylko Marcin mógł ją odszyfrować;
  2. Marcin wysyła podpisany plik wiadomosc-od-Marcina.txt, dzięki czemu Konrad ma pewność, że wiadomość pochodzi od Konrada.

Instalacja oprogramowania GPG

Obecnie praktycznie każda dystrybucja wraz z instalacją ma już zainstalowane oprogramowanie GPG. Jeśli nie, można je zainstalować z repozytorium pakietów.

Debian7:

apt-get install gnupg

CentOS6:

yum install gnupg2

Generowanie kluczy

Pierwszym krokiem do tego, aby aktywnie korzystać z GPG jest generowanie pary kluczy - prywatnego i publicznego:

konrad@warszawa:~$ gpg --gen-key
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory `/home/konrad/.gnupg' created
gpg: new configuration file `/home/konrad/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/konrad/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/konrad/.gnupg/secring.gpg' created
gpg: keyring `/home/konrad/.gnupg/pubring.gpg' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
Requested keysize is 1024 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 22 Jun 2015 11:44:20 AM CEST
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Konrad Testowy
Email address: konrad@warszawa.test.itmz.pl
Comment: konto testowe
You selected this USER-ID:
    "Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

Enter passphrase: 

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 284 more bytes)

....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++
+++++
gpg: /home/konrad/.gnupg/trustdb.gpg: trustdb created
gpg: key 89E615D8 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2015-06-22
pub   1024R/89E615D8 2014-06-22 [expires: 2015-06-22]
      Key fingerprint = 85F9 AFC9 191C 861F E723  C722 7582 A623 89E6 15D8
uid                  Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>
sub   1024R/AC90C308 2014-06-22 [expires: 2015-06-22]

Podczas generowania kluczy jest kilka punktów w których użytkownik musi udzielić odpowiedzi:

  • Pytanie o rodzaj klucza, który ma być generowany. Najczęściej wybierany jest domyślny (1), który pozwala na generowanie klucza prywatnego i publicznego do podpisywania i szyfrowania informacji.
  • Pytanie o długość klucza. Można podać wartość od 1024 do 4096. Generalnie im dłuższy klucz tym wyższe bezpieczeństwo. Ponieważ powyższy przypadek jest testowy wybrano najkrótszy klucz, który generowany jest najszybciej. Wszelkie operacje z użyciem tego klucza będą realizowane szybciej. Domyślna, sugerowana wartość dla większości zastosowań to 2048 bitów.
  • Czas ważności klucza. Powyżej podano jeden rok (1y), ale może być to również klucz, który nigdy nie wygasa (0)
  • Imię i nazwisko posiadacza. Powyżej podano „Konrad Testowy”
  • Adres email posiadacza.
  • Komentarz dla klucza - może to być na przykład informacja, że to e-mail służbowy.
  • Hasło do klucza prywatnego - jest konieczne, aby dodatkowo zabezpieczyć użycie klucza; hasło trzeba będzie podać przy każdym użyciu klucza prywatnego.

Wynikiem działania powyższej komendy jest utworzenie kluczy i zamieszczenie je w odpowiednich plikach w katalogu ~/.gnupg/.

konrad@warszawa:~$ ls -l .gnupg/
total 32
-rw------- 1 konrad konrad 9188 Jun 22 11:26 gpg.conf
-rw------- 1 konrad konrad  716 Jun 22 11:56 pubring.gpg
-rw------- 1 konrad konrad  716 Jun 22 11:56 pubring.gpg~
-rw------- 1 konrad konrad  600 Jun 22 11:56 random_seed
-rw------- 1 konrad konrad 1456 Jun 22 11:56 secring.gpg
-rw------- 1 konrad konrad 1280 Jun 22 11:56 trustdb.gpg

Aby wyświetlić informacje, jakie klucze posiada użytkownik (na razie powinien mieć tylko swój, świeżo wygenerowany):

konrad@warszawa:~$ gpg --list-keys
/home/konrad/.gnupg/pubring.gpg
-------------------------------
pub   1024R/89E615D8 2014-06-22 [expires: 2015-06-22]
uid                  Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>
sub   1024R/AC90C308 2014-06-22 [expires: 2015-06-22]

Aby wyświetlić informacje jedynie o kluczach prywatnych, które posiada użytkownika:

konrad@warszawa:~$ gpg --list-secret-keys
/home/konrad/.gnupg/secring.gpg
-------------------------------
sec   1024R/89E615D8 2014-06-22 [expires: 2015-06-22]
uid                  Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>
ssb   1024R/AC90C308 2014-06-22

Jeśli wspomniany w scenariuszu Marcin chciałby w pełni korzystać z GPG powinien również wygenerować swoją parę kluczy prywatny i publiczny. Poniżej zamieszczono jedynie wynik komendy informujący, że Marcin już wygenerował klucz:

marcin@krakow:~$ gpg --list-secret-keys
/home/marcin/.gnupg/secring.gpg
-------------------------------
sec   1024R/DF9A4E96 2014-06-22 [expires: 2015-06-22]
uid                  Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>
ssb   1024R/C137BAA6 2014-06-22

Wymiana bezpieczna kluczy publicznych

Aby Konrad mógł szyfrować wiadomości do Marcina musi posiadać jego klucz publiczny. Zatem Marcin musi mu go dostarczyć. Klucz dostarcza się w postaci pliku binarnego lub tekstowego. Ta druga wersja jest o tyle wygodna, że można ją przekazać za pomocą maila lub komunikatora.

Marcin eksportuje swój klucz publiczny do pliku ~/.gnupg/MarcinTestowy.pub

marcin@krakow:~$ gpg --armor --output ~/.gnupg/MarcinTestowy.pub --export marcin@krakow.test.itmz.pl

marcin@krakow:~$ cat ~/.gnupg/MarcinTestowy.pub 
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)

mI0EU6amowEEAMHiqMh371ekxlfXwcimIHmWUPBet7wNZIuJQ5NcnSDh7amnEhvQ
IHsLjxBWVx5lkE1mCtXn3s4q/JGVnfSYqaXPFKkx3gnbl6/q2eE6T/ew01Fp6oE4
P+nsymg7pkqFExIr5YRqt33LJiHvyZ3EVoZeBJfEczA/Ije8JKgpum8TABEBAAG0
O01hcmNpbiBUZXN0b3d5IChrb250byB0ZXN0b3dlKSA8bWFyY2luQGtyYWtvdy50
ZXN0Lml0bXoucGw+iL4EEwECACgFAlOmpqMCGwMFCQHhM4AGCwkIBwMCBhUIAgkK
CwQWAgMBAh4BAheAAAoJEAvMDobfmk6WtYoD/jX8j4UhaT6dFnYhQgh3drWO3Cr4
DBGFJ6jxQIBwDL22BgkO1Imfx7wbC6lWVkgdYc8/+ob51KhvNtEf+pt9g5IN9E0l
Nla7WcoAQhPDO51L4Ycnqo6Lmr1qAIX0gz2eMaSDj8AXeZV6zT6ks/kYS4eOHORh
RIiaE4W25Md5thOOuI0EU6amowEEAMamg8zKdPFBEy1X/s9N6xyIwLPinFOu0RGc
S+eFnP/BdZVn9X8r+lpCV/ZsK8lLNgCr1rnZRyfEf/+2EBFpzge+i/AX3+nQh8ef
WeLiJg1oLi4WfkxYYV7wSfIiLZFGegKQlKljTyy2LyKjfhokQYs+/b6Qd3GvQNC5
T4E8RKmpABEBAAGIpQQYAQIADwUCU6amowIbDAUJAeEzgAAKCRALzA6G35pOlsCp
A/4kqbWulcGtm5FGX0Hn6vWoiCxP3Vv8ApuHeeOnGUAp+kVJ3sqaLGcTMfSASjBo
vYndnCnt89o3RC89P219UIsrbRilwQL6x5o3409EfL5j0N2O7vgE6fiUaaELWqn7
EcqCiyszAl21+qzo9Erl0vtlNKrt+6SNyTnikKFj/Y+kUw==
=rDC0
-----END PGP PUBLIC KEY BLOCK-----

Następnie Marcin powinien bezpiecznym kanałem przekazać klucz publiczny do Konrada. Bezpieczny kanał jest szczególnie ważny, gdyż Konrad musi mieć pewność, że klucz który dostał na pewno został wygenerowany przez Marcina i należy do niego. Jest to szczególnie ważne, gdyż Konrad tym kluczem będzie weryfikował podpisy złożone przez Marcina. Można więc wykorzystać komunikator, który już używa szyfrowania aby „przekleić” treść klucza. W ostrożny sposób należy potraktować niezabezpieczony kanał e-mail - w takim przypadku najlepiej zweryfikować bezpośrednio u Marcina, że to on wysłał swój klucz i ewentualnie poprosić go o podanie kilku pierwszych lub ostatnich znaków klucza dla weryfikacji. Przekazanie klucza publicznego w szyfrowaniu asymetrycznym jest uważane za najsłabsze ogniwo całego procesu, ale dość prosto można to ryzyko zminimalizować (przynajmniej wśród znajomych).

Jeśli Konrad ma już plik z kluczem publicznym u siebie na koncie, może go zaimportować:

konrad@warszawa:~$ gpg --import MarcinTestowy.pub 
gpg: key DF9A4E96: public key "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Lista kluczy publicznych w dyspozycji Konrada:

konrad@warszawa:~$ gpg --list-keys
/home/konrad/.gnupg/pubring.gpg
-------------------------------
pub   1024R/89E615D8 2014-06-22 [expires: 2015-06-22]
uid                  Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>
sub   1024R/AC90C308 2014-06-22 [expires: 2015-06-22]

pub   1024R/DF9A4E96 2014-06-22 [expires: 2015-06-22]
uid                  Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>
sub   1024R/C137BAA6 2014-06-22 [expires: 2015-06-22]

Poziom zaufania do otrzymanego klucza publicznego i podpisywanie go własnym kluczem

Konrad posiada klucz publiczny Marcina, ale kolejnym krokiem, który powinien wykonać to określenie zaufania do otrzymanego klucza. Jeśli wymiana klucza została przeprowadzona bezpiecznym kanałem i Konrad jest pewny, że klucz należy do Marcina może te informacje przypisać do klucza:

konrad@warszawa:~$ gpg --edit-key marcin@krakow.test.itmz.pl
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  1024R/DF9A4E96  created: 2014-06-22  expires: 2015-06-22  usage: SC
                     trust: unknown       validity: unknown
sub  1024R/C137BAA6  created: 2014-06-22  expires: 2015-06-22  usage: E
[ unknown] (1). Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>

gpg> trust
pub  1024R/DF9A4E96  created: 2014-06-22  expires: 2015-06-22  usage: SC
                     trust: unknown       validity: unknown
sub  1024R/C137BAA6  created: 2014-06-22  expires: 2015-06-22  usage: E
[ unknown] (1). Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 4

pub  1024R/DF9A4E96  created: 2014-06-22  expires: 2015-06-22  usage: SC
                     trust: full          validity: unknown
sub  1024R/C137BAA6  created: 2014-06-22  expires: 2015-06-22  usage: E
[ unknown] (1). Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> quit

Można przypisać jeden z kilku poziomów (ważna numeracja):

  1. poziom zaufania nieznany
  2. nie ufam temu kluczowi (jest podejrzany)
  3. ufam marginalnie
  4. ufam w pełni - wybierz tą opcję, jeśli jesteś pewny, że klucz publiczny otrzymałeś od właściciela
  5. ufam „bezgranicznie” - dobra praktyka mówi, aby bezgranicznie ufać tylko własnym kluczom ;-)

Poziom zaufania przypisany do klucza ma znaczenie później przy użyciu tego klucza. Nie będziesz miał problemów z zaszyfrowaniem wiadomości przy użyciu klucza z poziomem najniższym, jednak program GPG powiadomi Cię o nim i upewni się, że chcesz mimo to go użyć.

Aby GPG nie pytał za każdym razem, czy jesteśmy pewni, że klucz należy do właściciela można klucz podpisać swoim kluczem prywatnym:

konrad@warszawa:~$ gpg --edit-key marcin@krakow.test.itmz.pl
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  1024R/DF9A4E96  created: 2014-06-22  expires: 2015-06-22  usage: SC
                     trust: full       validity: unknown
sub  1024R/C137BAA6  created: 2014-06-22  expires: 2015-06-22  usage: E
[ unknown] (1). Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>


gpg> sign

pub  1024R/DF9A4E96  created: 2014-06-22  expires: 2015-06-22  usage: SC  
                     trust: full          validity: unknown
 Primary key fingerprint: 0C2B 242B 50FC 2025 C2D3  9B8E 0BCC 0E86 DF9A 4E96

     Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>

This key is due to expire on 2015-06-22.
Are you sure that you want to sign this key with your
key "Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>" (89E615D8)

Really sign? (y/N) y

You need a passphrase to unlock the secret key for
user: "Konrad Testowy (konto testowe) <konrad@warszawa.test.itmz.pl>"
1024-bit RSA key, ID 89E615D8, created 2014-06-22

gpg> quit

Szyfrowanie wiadomości

Założeniem scenariusza było aby Konrad wysłał zaszyfrowaną wiadomość do Marcina.

Konrad, przygotowuje wiadomość w pliku tekstowym:

konrad@warszawa:~$ echo "Haslo do naszego nowego systemu to zyrafyniewejdadoszafy" > wiadomosc-od-Konrada-dla-Marcina.txt
konrad@warszawa:~$ cat wiadomosc-od-Konrada-dla-Marcina.txt
Haslo do naszego nowego systemu to zyrafyniewejdadoszafy

A następnie szyfruje wiadomość kluczem publicznym Marcina:

konrad@warszawa:~$ gpg --output wiadomosc-od-Konrada-dla-Marcina.txt.gpg -r marcin@krakow.test.itmz.pl --encrypt wiadomosc-od-Konrada-dla-Marcina.txt  

konrad@warszawa:~$ ls -lh
total 12K
-rw-r--r-- 1 konrad konrad 1.1K Jun 22 13:23 MarcinTestowy.pub
-rw-r--r-- 1 konrad konrad   57 Jun 22 13:34 wiadomosc-od-Konrada-dla-Marcina.txt
-rw-r--r-- 1 konrad konrad  289 Jun 22 13:38 wiadomosc-od-Konrada-dla-Marcina.txt.gpg

Po tej operacji plik wiadomosc-od-Konrada-dla-Marcina.txt.gpg zawiera zaszyfrowaną wiadomość, którą odszyfrować może jedynie Marcin. Plik ten w kryptografii nazywany jest kryptogramem.

Po przekazaniu pliku Marcinowi, ten próbuje wiadomość odszyfrować:

marcin@krakow:~$ ls -l
total 4
-rw-r--r-- 1 marcin marcin 289 Jun 22 13:44 wiadomosc-od-Konrada-dla-Marcina.txt.gpg

marcin@krakow:~$ gpg --output wiadomosc-od-Konrada.txt --decrypt wiadomosc-od-Konrada-dla-Marcina.txt.gpg

You need a passphrase to unlock the secret key for
user: "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>"
1024-bit RSA key, ID C137BAA6, created 2014-06-22 (main key ID DF9A4E96)

gpg: encrypted with 1024-bit RSA key, ID C137BAA6, created 2014-06-22
      "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>"
     
marcin@krakow:~$ cat wiadomosc-od-Konrada.txt 
Haslo do naszego nowego systemu to zyrafyniewejdadoszafy

Podpisywanie wiadomości

Kolejnym krokiem scenariusza jest wysłanie przez Marcina podpisanej wiadomości. Konrad weryfikując podpis będzie miał pewność, że wiadomość pochodzi od Marcina a nie od kogoś, kto się pod niego podszywa.

Marcin przygotowuje wiadomość w pliku tekstowym:

marcin@krakow:~$ echo W ostatnia sobote miesiaca w godzinach 21:30-23:30 wylaczamy system w zwiazku z pracami maintanance > komunikat-Marcina.txt
marcin@krakow:~$ cat komunikat-Marcina.txt 
W ostatnia sobote miesiaca w godzinach 21:30-23:30 wylaczamy system w zwiazku z pracami maintanance

Marcin podpisuje plik wiadomości:

marcin@krakow:~$ gpg --armor --output komunikat-Marcina.txt.sig --clearsign komunikat-Marcina.txt 

You need a passphrase to unlock the secret key for
user: "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>"
1024-bit RSA key, ID DF9A4E96, created 2014-06-22

marcin@krakow:~$ ls -l komunikat-Marcina.txt*
-rw-r--r-- 1 marcin marcin 100 Jun 22 14:54 komunikat-Marcina.txt
-rw-r--r-- 1 marcin marcin 463 Jun 22 14:58 komunikat-Marcina.txt.sig

Powyższe tworzy osobny plik komunikat-Marcina.txt.sig, który oprócz podpisu zawiera czystym tekstem wiadomość (opcja –clearsign). Gdyby użyto samej opcji –sign komunikat byłby w całości zaszyfrowany. Taką wiadomość można jednak odszyfrować kluczem publicznym (dostępnym teoretycznie globalnie) więc najczęściej komunikat jest zapisywany czystym tekstem z osobnym podpisem (opcja –clearsing).

marcin@krakow:~$ cat komunikat-Marcina.txt.sig 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

W ostatnia sobote miesiaca w godzinach 21:30-23:30 wylaczamy system w zwiazku z pracami maintanance
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iJwEAQECAAYFAlOm0v4ACgkQC8wOht+aTpao8AP/b/FoR2pmSGdbRTBm8pnSuWGW
dAqfqv4LVLoLxNUlV1qTefEErFZZPhI4xpDfOVqbsPzlJ/aL5Kjm1pjit0KVfs9U
olJ0VOJ2PCFpoo+l4FS/m0+eedKEPlALpBDenhzFIFUP0sRv28Vnwxy3AtzucFhS
Ea6CFQgN5CI1cTkZ1f8=
=+E9t
-----END PGP SIGNATURE-----

Taka wiadomość może być wklejona do treści maila lub przesłana innym kanałem. Konrad dokonuje weryfikacji z pomocą opcji –verify:

konrad@warszawa:~$ gpg --verify komunikat-Marcina.txt.sig 
gpg: Signature made Sun 22 Jun 2014 02:58:38 PM CEST using RSA key ID DF9A4E96
gpg: Good signature from "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 0C2B 242B 50FC 2025 C2D3  9B8E 0BCC 0E86 DF9A 4E96

Powyżej Konrad otrzymuje informację, że podpis zgadza się z kluczem „Marcin Testowy”. Może więc mu zaufać.

Unieważnienie klucza publicznego - kompromitacja klucza prywatnego

Gdy generujemy parę kluczy prywatny i publiczny zakładamy, że ten pierwszy będzie bezpiecznie przechowywany u właściciela. Trzeba się jedna przygotować, że klucz prywatny zostanie wykradziony (to tylko plik na dysku) a włamywacz metodą brute force złamie hasło do tego klucza. Mógłby wtedy odszyfrować przechwycone wiadomości oraz (przez wiele osób uznawane za bardziej niebezpieczne) podszywać się pod właściciela podpisując komunikaty jego kluczem prywatnym.

Klucz jak i każde hasło może zostać skompromitowane, dlatego GPG posiada funkcjonalność unieważnienia klucza. Klucza automatycznie jest unieważniany, gdy minie okres jego ważności podawany podczas generowania kluczy albo właściciel sam unieważni klucz i rozpropaguje tą informację po osobach, które posiadają jego klucz publiczny do skompromitowanego klucza prywatnego.

Unieważnienie kluczy polega na:

  • wygenerowaniu certyfikatu unieważniającego
  • opublikowanie certyfikatu unieważniającego
  • zaimportowanie certyfikatu przez wszystkie osoby, które posiadają klucz publiczny

Wygenerowanie certyfikatu unieważniającego nie oznacza od razu unieważnienia klucza. Polecane jest wygenerowanie go od razu po utworzeniu pary kluczy i przechowywanie go w bezpiecznym miejscu (np. na osobnym nośniku w sejfie). Praktyka ta jest powiązana za tym, że najczęściej klucz prywatny jest kradziony razem ze sprzętem na którym się on znajduje a jedynym sposobem na wygenerowanie certyfikatu unieważniającego jest posiadanie klucza prywatnego. Jeśli więc ktoś ukradnie Ci klucz prywatny a nie posiadasz jego kopii lub certyfikatu unieważniającego to nie ma możliwości unieważnienia klucza - pozostaje jedynie poinformowanie posiadaczy Twojego klucza publicznego, aby go nie używali, oznaczyli jako niezaufany.

Generowanie certyfikatu unieważniającego przez Marcina:

marcin@krakow:~$ gpg --gen-revoke marcin@krakow.test.itmz.pl

sec  1024R/DF9A4E96 2014-06-22 Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>

Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision? 0
Enter an optional description; end it with an empty line:
> 
Reason for revocation: No reason specified
(No description given)
Is this okay? (y/N) y

You need a passphrase to unlock the secret key for
user: "Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>"
1024-bit RSA key, ID DF9A4E96, created 2014-06-22

Enter passphrase: 

ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: A revocation certificate should follow

iJ8EIAECAAkFAlOm6HoCHQAACgkQC8wOht+aTpb49wQAiYKtAu8WTNV5iGEhsYo1
tqmSECiAIRkuVJP0mZ4JmcJXd2E+dW/uVO4Oil6pome/mVuJ9et5aND7cF0HLdQr
/NovuFq9XUzeXqZdaJSNHl9pEFDD48TVQsf77ZyMAgd+syoEnsmnwcSuR+a/W//1
Srh8PdMjN4qSdW8o4Q5keps=
=h2E1
-----END PGP PUBLIC KEY BLOCK-----

Tekst wyświetlony na ekranie między liniami PGP PUBLIC KEY BLOCK jest certyfikatem unieważniającym, którego warto przechowywać w osobnym, zabezpieczonym miejscu, najlepiej bez dostępu do sieci.

Aby unieważnić klucz wystarczy zaimportować wygenerowany wyżej certyfikat (powinna zrobić to każda osoba, która posiada klucz publiczny):

konrad@warszzawa:~$ gpg --import certyfikat-revoke-od-Marcina.crt

UWAGA Unieważnionemu kluczowi nie można już przywrócić ważności.

Serwery publiczne do wymiany kluczy publicznych

Wymiana kluczy publicznych między kilkoma znajomymi nie jest problemem, jednak gdy w grę wchodzi konieczność wymiany mieli wieloma osobami bardzo wygodną metodą jest użycie serwerów publicznych przechowujących i serwujące dowolnej osobie klucze publiczne. GPG we większości dystrybucji jest skonfigurowane tak, aby korzystać z jakiegoś serwera kluczy publicznych. Serwery między sobą wymieniają klucze, zatem nieważne z jakiego korzystasz, informacja będzie rozpropagowana po całym Internecie.

Aby wysłać na serwer klucz publiczny:

marcin@krakow:~$ gpg --list-keys
/home/marcin/.gnupg/pubring.gpg
-------------------------------
pub   1024R/DF9A4E96 2014-06-22 [expires: 2015-06-22]
uid                  Marcin Testowy (konto testowe) <marcin@krakow.test.itmz.pl>
sub   1024R/C137BAA6 2014-06-22 [expires: 2015-06-22]

marcin@krakow:~$ gpg --send-key DF9A4E96
gpg: sending key DF9A4E96 to hkp server keys.gnupg.net

Trzeba poczekać nawet kilkanaście minut, zanim klucz zostanie opublikowany.

Jeśli masz potrzebę wyszukania klucza publicznego jakiejś osoby użyj parametru –search-key:

marcin@krakow:~$ gpg --search-key IMIE-NAZWISKO-LUB-EMAIL

Infrastruktura serwerów kluczy publicznych jest przydatna, gdyż:

  • możemy za ich pomocą rozpropagować informacje o skompromitowanym kluczu (wystarczy, że wycofany klucz publiczny wyślemy na serwer kluczy);
  • możemy budować zaufanie dla swoich kluczy - nasze klucze publiczne, które podpisały inne osoby potwierdzając, że pochodzą od nas mogą być przez nich publikowane na serwerze, dzięki czemu nasze klucze są bardziej wiarygodne (gdy wiele osób uznało je za zaufane).

Aby zsynchronizować informacje w swojej bazie kluczy z serwerem publicznym (synchronizacja w stronę od serwera do nas):

marcin@krakow:~$ gpg --refresh-keys

110.3 Securing data with encryption

Zakres tematyki 110.3 Securing data with encryption w zapisie oryginalnym ze strony http://www.lpi.org

Description: The candidate should be able to use puplic key techniques to secure data and communication.

Key Knowledge Areas:

  • Perform basic OpenSSH 2 client configuration and usage.
  • Understand the role of OpenSSH
  • Understand SSH port tunnels (including X11 tunnels).
  • Perform basic GnuPG configuration and usage.
  • Terms and Utilities: ssh ssh-keygen ssh-agent ssh-add ~/.ssh/id_rsa id_rsa.pub ~/.ssh/id_dsa id_dsa.pub /etc/ssh/ssh_host_rsa_key ssh_host_rsa_key.pub /etc/ssh/ssh_host_dsa_key ssh_host_dsa_key.pub ~/.ssh/authorized_keys /etc/ssh_known_hosts gpg ~/.gnupg/*

Masz potrzebę, aby powyższa strona była rozbudowana? - Napisz do nas!.

materialy/bezpieczenstwo/gpg.txt · ostatnio zmienione: 2014/09/21 11:36 przez mzalewski

(C) 2017 ITMZ Mariusz Zalewski