ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

Uwierzytelnianie za pomocą klucza

Uwierzytelnianie za pomocą klucza jest sposobem uwierzytelniania, alternatywnym wobec stosowania haseł. Zamiast podawać swoje prywatne hasło, użytkownik może potwierdzić swoją tożsamość przy użyciu algorytmów kryptografii asymetrycznej, z kluczami publicznymi i prywatnymi.

Obecnie stosowanie haseł w celu uwierzytelnienia jest bardziej popularne niż wykorzystanie kluczy publicznych i prywatnych. Nie wymaga wielu przygotowań (przynajmniej, z punktu widzenia klienta) oraz jest bardziej intuicyjne. W celu zalogowania się na serwer, użytkownicy muszą podać swoje sekretne hasło, które jest następnie weryfikowane przez serwer. Wadą tej metody jest to, że jeżeli serwer jest publicznie dostępny, to może być celem wielu typów ataków siłowych i słownikowych, więc hasło użytkownika może zostać z czasem złamane i odkryte. Co więcej, metoda ta wymaga oczywiście od użytkowników pamiętania ich haseł, które w założeniu powinny być skomplikowane i trudne do zapamiętania.

Uwierzytelnianie za pomocą klucza publicznego umożliwia zniwelowanie tych niedogodności. Pomysł polega na tym, aby przypisać parę kluczy asymetrycznych do każdego użytkownika. Następnie, użytkownicy mogą umieścić swoje klucze publiczne na wszystkich serwerach, z którymi zamierzają się bezpiecznie łączyć. Natomiast klucze prywatne są przechowywane bezpiecznie na komputerach użytkowników, które mają być wykorzystywane do połączeń ze wspomnianymi serwerami. Podczas nawiązywania połączenia, serwer używa posiadany klucz publiczny klienta w celu jego uwierzytelnienia. Może to osiągnąć, na przykład, szyfrując jakąś liczbę i sprawdzając czy klient jest w stanie odszyfrować ją przy użyciu posiadanego klucza prywatnego.

Naturalnie, ataki siłowe mogą wciąż być przeprowadzone przez ewentualnych napastników, ale złożoność długich i nieprzewidywalnych ciągów bajtów klucza jest dużo większa od stopnia skomplikowania haseł. Ataki mają więc dużo mniejsze szanse powodzenia. Klucze asymetryczne używane obecnie składają się z tysięcy bitów (obecnie, w roku 2016, zalecane długości kluczy są rzędu 2048 lub 4096 bitów).

Najpopularniejszym algorytmem używanym do uwierzytelniania za pomocą kluczy jest RSA.

Uwierzytelnianie za pomocą klucza w systemie Linux

Większość dystrybucji systemu Linux zapewnia wsparcie dla szyfrowanego protokołu sieciowego SSH (Secure Shell), zwykle wykorzystując w tym celu implementację OpenSSH. Użytkownicy są w stanie łatwo utworzyć i skonfigurować parę połączonych kluczy asymetrycznych. Umożliwi im to automatyczne logowanie na serwery, które wspierają uwierzytelnianie za pomocą klucza. Podczas nawiązywania połączenia, procesy SSH działające na serwerze użyją właściwy klucz publiczny do sprawdzenia i uwierzytelnienia procesów klienta, które działają na jego komputerze.

Tworzenie kluczy RSA

Aby czerpać opisane wyżej korzyści płynące z automatycznego uwierzytelniania za pomocą klucza, pierwszą rzeczą, którą należy zrobić jest utworzenie pary kluczy asymetrycznych. W systemie Linux można tego dokonać wydając komendę SSH:

ssh-keygen -t rsa -c email@example.com

Użytkownik będzie potem zapytany o kilka parametrów konfiguracyjnych, takich jak docelowa lokalizacja zapisanych kluczy oraz, opcjonalnie, hasło do zaszyfrowania klucza prywatnego. Domyślnie klucze tworzone są w katalogu ~/.ssh, w katalogu domowym. Klucz publiczny jest przechowywany w pliku id_rsa.pub, natomiast klucz prywatny jest zapisywany do pliku id_rsa.

Klucz prywatny może być przechowywany na zewnętrznej karcie pamięci. W takim przypadku, użytkownicy będą w stanie się uwierzytelnić na każdym używanym przez nich komputerze, tak długo jak będą w stanie zaprezentować w odpowiednim czasie właściwą kartę pamięci.

Zabezpieczenie klucza prywatnego hasłem

Jeżeli podczas generowania pary kluczy użytkownik wprowadzi hasło, to klucz prywatny zostanie zapisany w zaszyfrowanym pliku. Przed odczytaniem klucza prywatnego, użytkownik będzie proszony o podanie hasła, które umożliwi odszyfrowanie klucza prywatnego i nawiązanie połączenia. System operacyjny zwykle zapamiętuje odszyfrowany klucz w pamięci i podczas kolejnego użycia, dostarcza go automatycznie, aż do wylogowania się użytkownika. W systemie Linux proces odpowiedzialny za przechowywanie klucza w pamięci na czas trwania sesji nazywa się ssh-agent.

Ponieważ klucz prywatny jest przechowywany lokalnie, na zaufanym komputerze, nie jest możliwe zaatakowanie go zdalnie, bez wcześniejszego całkowitego złamania zabezpieczeń komputera użytkownika. Klucz prywatny przechowywany jest w obszarze z ograniczonym dostępem, w pliku, do którego prawa odczytu ma tylko jego właściciel.

Zabezpieczenie klucza prywatnego hasłem, daje użytkownikowi czas na reakcję, w sytuacji kiedy komputer dostał się w niepowołane ręce (został, na przykład, ukradziony). Zanim szyfr symetryczny chroniący klucz zostanie złamany, użytkownik może usunąć powiązany z nim klucz publiczny za wszystkich serwerów, w których go używał, oraz wygenerować nową parę kluczy asymetrycznych.

Takie podejście zapewnia większe bezpieczeństwo niż zwykle uwierzytelnianie oparte na haśle, gdzie napastnik może przeprowadzić zdalny atak na hasło użytkownika.

Udostępnienie klucza publicznego

Aby zalogować się na serwer, należy najpierw dostarczyć tam klucz publiczny. SSH umożliwia przekopiowanie klucza do wskazanego serwera:

ssh-copy-id <username>@<host>

Użytkownik może być ostrzeżony, że host jest nieznany, oraz będzie proszony o podanie odpowiedniego hasła dostępu. Następnie jego klucz publiczny zostanie automatycznie przesłany na wskazany serwer.

Alternatywnie, zawartość pliku id_rsa.pub może zostać ręcznie dopisana do pliku ~/.ssh/authorized_keys na serwerze, znajdującego się na koncie administratora.

Rezultat obu metod jest taki sam: klucz publiczny zostaje dodany do pliku authorized_keys, który jest wykorzystywany przez serwer do sprawdzania autentyczności wszystkich, którzy próbują połączyć się do niego z wykorzystaniem protokołu SSH.

Nawiązanie połączenia SSH

Połączenie SSH do serwera może zostać przetestowane przy użyciu komendy:

ssh <username>@<host>

W przypadku sukcesu (to znaczy kiedy uwierzytelnianie za pomocą klucza zostało poprawnie skonfigurowane), bezpieczne połączenie do serwera powinno zostać nawiązane, bez potrzeby podawania hasła zdalnego dostępu. Jeżeli klucz prywatny jest zaszyfrowany, to użytkownik będzie wcześniej poproszony o podanie hasła dostępu do niego.

Po skonfigurowaniu uwierzytelniania za pomocą klucza na serwerze, uwierzytelnianie za pomocą hasła może zostać wyłączone, w celu uniemożliwienia zdalnych ataków siłowych. Można tego dokonać zmieniając flagę PasswordAuthentication w pliku /etc/ssh/sshd_config, a następnie restartując serwis SSH. Można również określić, które adresy IP mogą używać uwierzytelniania opartego na haśle i zablokować tę funkcjonalność dla pozostałych.

Plik konfiguracyjny wspomniany wyżej może być również użyty do wyłączenia lub włączenia uwierzytelniania za pomocą klucza dla całego serwera. Służą do tego flagi o nazwach PubkeyAuthentication oraz RSAAuthentication.

Uwierzytelnianie za pomocą klucza w systemie Windows

Korzystanie z uwierzytelniania za pomocą klucza jest możliwe również na komputerach z systemem Windows, ale wymaga to wyposażenia się w dodatkowe aplikacje, które dostarczają takich możliwości.

Programy opisane poniżej mogą być użyte do wygenerowania pary powiązanych kluczy asymetrycznych. Następnie, klucz publiczny powinien zostać dostarczony do serwera, który zwykle działa na systemie Linux. Klucz publiczny powinien zostać dopisany do pliku .ssh/authorized_keys, tak jak to było przedstawione powyżej.

Git Bash

Git Bash jest aplikacją, która umożliwia korzystanie z terminalu bash na systemie operacyjnym Windows. Jest dość podobny do CygWin, ale szybszy i mniej skomplikowany. Jest idealnym narzędziem do wygenerowania pary kluczy asymetrycznych.

Oficjalną stroną projektu Git jest git-scm.com, gdzie można znaleźć jego wersję instalacyjną dla systemów Windows.

Klucz asymetryczne mogą zostać wygenerowane przy użyciu tych samych komand, co w przypadku tworzenia kluczy w systemie Linux (ssh-keygen, i tak dalej).

PuTTY

PuTTY jest klientem protokołów SSH i Telnet, darmową aplikacją dostępną na platformach Windows. Składa się z szeregu komponentów: PuTTY, PSCP, PSFTP, PuTTYtel, Plink, Pageant, PuTTYgen, pterm. Wszystkie one są przydatne i godne polecenia. Oficjalną stroną projektu jest www.putty.org.

W celu wygenerowania pary kluczy asymetrycznych, należy wykorzystać narzędzie PuTTYgen, które może być znalezione w katalogu, w którym PuTTY został zainstalowany. Po wciśnięciu przycisku 'Generate', aplikacja poprosi użytkownika o wykonanie losowych ruchów myszką, w celu wygenerowania dostatecznej losowości, aby możliwe byłe utworzenie losowego strumienia bajtów o odpowiedniej długości.

Bitvise

Bitvise jest firmą, która specjalizuje się w aplikacjach SSH działających zarówno po stronie klienta, jak i po stronie serwera. Dostarcza wielu usług, które nie są tak darmowe, jak programy opisane powyżej, ale mogą być wykorzystywane w celach niezarobkowych. Strona projektu znajduje się pod adresem www.bitvise.com.

Aby wygenerować parę kluczy asymetrycznych, należy użyć narzędzia User Keypair Manager, które znajduje się na głównej stronie. Po kliknięciu przycisku 'Generate New', użytkownik będzie zapytany o typ klucza do utworzenia oraz o opcjonalne hasło, podobnie jak w przypadku generowania kluczy w systemie Linux.

User Keypair Manager umożliwia eksportowanie utworzonych wcześniej kluczy. Należy wybrać format, w jakim klucze powinny zostać zapisane (którym jest, zwykle, OpenSSL).