Konfiguracja uwierzytelniania na bazie kluczy SSH
SSH (secure shell) to szyfrowany protokół używany do komunikacji z serwerami. Podczas pracy z serwerem linuksowym często spędzamy dużo czasu w sesji terminalowej, połączonej z serwerem poprzez SSH. Klucze SSH zapewniają bezpieczny i wygodny sposób logowania się do serwera.
Serwer SSH może uwierzytelnić klienta za pomocą różnych metod. Najbardziej popularną jest uwierzytelnianie za pomocą hasła, które jest łatwe w użyciu, ale nie najbezpieczniejsze. Hasła są wprawdzie przesyłane do serwera w bezpieczny sposób, ale zazwyczaj nie są na tyle złożone ani długie, aby były odporne na powtarzające się, uporczywe ataki. Współczesna moc obliczeniowa w połączeniu z automatycznymi skryptami sprawia, że uzyskanie dostępu do chronionego hasłem konta metodą brute force jest możliwe. Klucze SSH są bezpieczną alternatywą haseł.
Para kluczy SSH to dwa zabezpieczone kryptograficznie klucze, które mogą być użyte do uwierzytelnienia klienta na serwerze SSH. Składa się z klucza publicznego i prywatnego. Klucz prywatny jest zapisywany po stronie klienta i powinien być zachowany w pełnej tajności, bo jego ujawnienie pozwala atakującemu na zalogowanie się do serwerów, które są skonfigurowane z powiązanym z nim kluczem publicznym – bez dodatkowego uwierzytelnienia. Dodatkowym, bardzo zalecanym zabezpieczeniem klucza prywatnego jest jego zaszyfrowanie na lokalnym dysku za pomocą hasła. Przypisany kluczowi prywatnemu klucz publiczny może być udostępniany dowolnie bez konsekwencji. Klucz publiczny jest używany do szyfrowania wiadomości, które tylko klucz prywatny jest w stanie odszyfrować – właśnie ta cecha jest wykorzystywana jako sposób uwierzytelniania przy użyciu pary kluczy.
Klucz publiczny jest przesyłany na serwer za pomocą protokołu SSH i dodawany do specjalnego pliku na koncie użytkownika, na które użytkownik będzie się logował (nazwa pliku: ~/.ssh/authorized_keys). Gdy kolejnym razem komputer-klient spróbuje uwierzytelnić się przy użyciu kluczy SSH, serwer sprawdzi, czy jest on w posiadaniu klucza prywatnego. Jeśli klient udowodni, że jest właścicielem klucza prywatnego, wywoływana zostanie sesja powłoki lub wykonywane będzie żądane polecenie.
Jak utworzyć parę kluczy?
Klucze można wygenerować za pomocą narzędzia ssh-keygen, które jest częścią standardowego zestawu narzędzi OpenSSH. Domyślnie tworzy ono parę kluczy RSA o długości 3072 bitów. Na lokalnym komputerze wygeneruj parę kluczy SSH, wpisując polecenie:
System poprosi Cię o wybranie lokalizacji dla kluczy. Domyślnie klucze będą przechowywane w katalogu ~/.ssh w Twoim katalogu domowym. Klucz prywatny będzie miał nazwę id_rsa, a powiązany z nim klucz publiczny id_rsa.pub. Jeśli chcesz wybrać niestandardową ścieżkę dla kluczy, podaj ją na tym etapie konfiguracji. Jeśli nie, naciśnij ENTER, aby zaakceptować domyślną. Następnie użytkownik zostanie poproszony o wprowadzenie hasła dla klucza prywatnego. Jest to opcjonalne, zalecane hasło służące do zaszyfrowania pliku klucza na lokalnym dysku.
Dysponujesz teraz kluczem publicznym i prywatnym, których możesz użyć do uwierzytelnienia. Następnym krokiem jest umieszczenie klucza publicznego na serwerze docelowym.
Kopiowanie klucza publicznego na serwer
Jest wiele sposobów na przesłanie klucza publicznego na zdalny serwer SSH. Najprostszy to skopiowanie klucza za pomocą polecenia ssh-copy-id. Wpisz w terminalu:
gdzie remote_host to zdalny serwer, z którym chcesz się połączyć, a username to konto użytkownika, do którego chcesz mieć dostęp przez SSH. Jest to konto, na które zostanie skopiowany Twój publiczny klucz SSH.
Jeśli po wykonaniu polecenia i wpisaniu hasła zobaczysz przykładowy komunikat:
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
oznacza to, że lokalny komputer nie rozpoznaje zdalnego serwera. Zdarza się to przy pierwszej próbie połączenia. Wybierz "yes" i naciśnij ENTER. Narzędzie przeskanuje Twoje konto lokalne w poszukiwaniu utworzonego wcześniej klucza id_rsa.pub. Gdy go znajdzie, zapyta o hasło do konta zdalnego użytkownika – należy je podać. Komunikat:
oznacza, że klucz publiczny został umieszczony na serwerze.
Jeśli nie masz do dyspozycji narzędzia ssh-copy-id, ale możesz zalogować się na swoje konto na serwere przy pomocy hasła, możesz również przesłać swój klucz publiczny przy użyciu zwykłego połączenia SSH, na przykład przez sftp. Zawartość klucza należy wówczas dopisać do pliku ~/.ssh/authorized_keys.
W każdym przypadku należy upewnić się, że plik .ssh/authorized_keys znajdujący się na serwerze ma odpowiednio ustawione prawa dostępu:
Informacja
Jeśli korzystasz z systemu Windows 10, w zdefiniowaniu pary kluczy SSH pomocny może być ten poradnik: Windows 10 OpenSSH Equivalent of ssh-copy-id.