Uwierzytelniona wymiana kluczy

(ang. Authenticated Key Exchange - AKE)

Mechanizm dostępu bez hasła opiera się na szyfrowaniu asymetrycznym. Wykorzystuje ono dwa klucze – publiczny i prywatny. Klucz publiczny służy do szyfrowania, natomiast prywatny służy do odszyfrowywania.

Być może kojarzysz ten sposób szyfrowania do bezpiecznego wysyłania wiadomości (e-mailem). W takim przypadku jedna osoba udostępnia drugiej swój klucz publiczny. Druga osoba szyfruje wiadomość tym kluczem i przesyła. Odbiorca odszyfrowywuje wiadomość swoim kluczem prywatnym.

Najważniejszą rzeczą jest pilnowanie naszego klucza prywatnego i nie udostępnianie go nikomu.

Zasada działania

Zasada działania jest podobna do szyfrowania wiadomości. W dużym uproszczeniu wygląda to tak:

  1. Na docelowy serwer, z którym chcemy się połączyć wysyłamy jednorazowo nasz klucz publiczny.
  2. Przy próbie połączenia z tym serwerem wysyła on do nas token zaszyfrowany naszym kluczem publicznym
  3. Nasza maszyna odszyfrowuje wiadomość kluczem prywatnym i wykorzystuje token do ustanowienia połączenia.

Wszystko to dzieje się oczywiście automatycznie.

Przykładowa architektura

Dostęp do wielu serwerów produkcyjnych jest ze względów bezpieczeństwa mocno ograniczony. Najczęściej by dostać się na taki serwer musimy najpierw autoryzować się na serwerze pośrednim, a dopiero potem na serwerze docelowym. Wymaga to wpisywania dwukrotnie, często dość złożonego hasła. Aby ułatwić sobie życie i zoptymalizować ten proces pokażemy w jaki sposób możemy wymienić klucze pomiędzy serwerami. Pozwoli to na dostęp do docelowego serwera z naszej lokalnej maszyny bez podawania dwukrotnie hasła.

Generowanie i wymiana kluczy

Jeśli system (Windows) nie rozpoznaje którejś z podanych komend, proponujemy użycie darmowej konsoli Cmder dostępnej tutaj

Najpierw musimy wygenerować klucze:
ssh-keygen

Wygenerowany klucz powinien znadjować się w naszym katalogu domowym (np. codeit4us) w podkatalogu .ssh. Na przykład: c:\Users\codeit4us\.ssh\id_rsa.pub

ssh-keygen                                                        
Generating public/private rsa key pair.                                              
Enter passphrase (empty for no passphrase):                                          
Enter same passphrase again:                                                         
Your identification has been saved in (c:\Users\codeit4us\.ssh\id_rsa)
Your public key has been saved in c:\Users\codeit4us\.ssh\id_rsa.
The key fingerprint is:                                                              
SHA256:gxPIGPGycF2QUtghB9sIxRukydYy1YWfLZb0UNLqG4Y codeit4us@PLWAWc4u     
The key's randomart image is:                                                        
+---[RSA 2048]----+                                                                  
|.+BOB++o+.       |                                                                  
|.+B@o= o..       |                                                                  
|+===* + B        |                                                                  
|.o+o   X o       |                                                                  
|  .   * S        |                                                                  
|     E = .       |                                                                  
|      . o        |                                                                  
|       .         |                                                                  
|                 |                                                                  
+----[SHA256]-----+                                                                  

Kopiujemy nasz klucz publiczny do naszego katalogu domowego na serwerze zdalnym:

scp c:\Users\codeit4us\.ssh\id_rsa.pub codeit4us@serverproxy01:~

Na serwerze serverproxy01 tworzymy katalog .ssh w naszym katalogu domowym  (o ile jeszcze nie istnieje):

umask 077 && test -d ~/.ssh || mkdir ~/.ssh

Tworzymy również plik authorized_keys (o ile jeszcze nie istnieje):

umask 077 && touch ~/.ssh/authorized_keys

Dodajemy do pliku authorized_keys nasz klucz publiczny:

cat ~/id_rsa.pub ~/.ssh/authorized_keys

Gotowe! Od tej pory możemy łączyć się przez ssh bez wpisywania hasła.

Podobą operację musimy powtórzyć pomiędzy proxyserver01, a appserver01. Czyli generujemy nowy klucz na serwerze proxyserver01 i wymieniamy klucze dokładnie w taki sam sposób jak robiliśmy to pomiędzy lokalną maszyną (localhost), a serwerem proxyserver01.

Będziemy mogli połączyć się (z lokalnej maszyny) z serwerem proxyserver01 bez użycia hasła. Następnie możemy połaczyć się dalej z serwerem appserver01 również bez użycia hasła.

Możemy teraz połączyć się (z lokalnej maszyny) z serwerem <em>proxyserver01</em> bez użycia hasła. Następnie możemy połaczyć się dalej z serwerem <em>appserver01</em> również bez użycia hasła.

Chcę jednak użyć hasła...

Jeśli zdarzy się sytuacja, że z jakiegoś powodu chcemy się uwierzytelnić za pomocą hasła. Możemy to zrobić za pomocą następujących parametrów:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no codeit4us@proxyserver01
Na skróty

Możemy również od razu wejść na serwer docelowy za pomocą polecenia:

ssh -tt codeit4us@proxyserver01 ssh -tt codeit4us@appserver01

Podsumowanie

Warto poświęcić chwilę czasu na wymianę kluczy. Zaoszczędzi nam to wiele czasu przy częstym wpisywaniu na ogół długiego hasła. Jest to również o wiele bezpieczniejszy sposób. Jesteśmy odporni na ataki siłowe (ang. brute force). Poza tym, częste wpisywanie hasła może zostać łatwo podejrzane przez osoby postronne.

Uwierzytelniona wymiana kluczy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *