SSH – autoryzacja za pomocą klucza/certyfikatu

Czas czytania: 7 minut

Zabezpieczenie zdalnego dostępu do serwera jest niezmiernie ważne. Atakujący, hackerzy i crackerzy tylko czekają na to, aż zrobisz jeden malutki błąd, który pozwoli im na dołączenie twojego VPS-a czy dedyka do botnetu. Wektory ataku mogą być bardzo różne. Zaczynając od luk w CMS-ie, kończąc na błędach w konfiguracji serwera i słabych hasłach. Dzisiaj zajmiemy się poprawą ostatniego z wymienionych aspektów. Ulepszymy autoryzację SSH, jednego z głównych narzędzi każdego administratora.

Załóżmy, że masz serwer (lub komputer) na który logujesz się za pomocą SSH. Wpisujesz nazwę użytkownika i hasło. Logujesz się bez problemów. Jest to najprostsza możliwa konfiguracja serwera SSH. Z drugiej strony ma kilka wad. Po pierwsze – jeśli masz kilka komputerów to musisz pamiętać kilka, a nieraz i kilkanaście haseł. Po drugie – aby dostęp do powłoki był naprawdę dobrze zabezpieczony, hasła powinny być silne i długie. Czy jest to bezpieczne? Tak. Czy jest to uciążliwe? Owszem. Jak pokonać to utrapienie? Wystarczy skonfigurować SSH tak aby korzystał z certyfikatu – czyli logowania za pomocą klucza.

Logowanie SSH za pomocą klucza – jak to działa?

Do logowania za pomocą certyfikatu wymagana jest para kluczy. Są to klucze nierozerwalnie ze sobą powiązane – publiczny i prywatny. To co zostanie zaszyfrowane za pomocą klucza publicznego, może być odczytane tylko za pomocą odpowiadającego mu klucza prywatnego. I na odwrót.

Klucz prywatny znajduje się na komputerze klienckim (tym, za pomocą którego logujesz się na serwer). Klucz ten powinien być chroniony za wszelką cenę. W przypadku jego wykradnięcia przez hackera, atakujący może bez problemu autoryzować się na twoim serwerze i wprowadzić zmiany.

Klucz, który przechowujemy na swoim komputerze możemy dodatkowo zabezpieczyć. Taki dodatek to hasło (passphrase), którym zaszyfrowany jest klucz. Aby skorzystać z klucza prywatnego, będziemy musieli najpierw wprowadzić passphrase służącą do jego odszyfrowania.

A co można powiedzieć na temat klucza publicznego? Znajduje się on na serwerze. Klucza publicznego nie musimy chronić – hackerowi nic nie przyjdzie z jego wykradzenia.

Logowanie SSH kluczem – konfiguracja

Zakładam, że podstawowa konfiguracja SSH, która umożliwia zalogowanie się na serwer za pomocą hasła jest już wykonana. (Dokładną konfigurację SSH omówimy innym razem)

Wygenerowanie pary kluczy

Pierwszym krokiem jest wygenerowanie pary kluczy. Robisz to na komputerze lokalnym (klienckim), czyli tym, z poziomu którego logujesz się na serwer. Służy do tego polecenie:

ssh-keygen

Program zapyta ciebie, w której lokalizacji chcesz przechowywać klucze. Domyślnie jest to /[home]/.ssh/id_rsa. (Za [home] podstaw nazwę użytkownika). Oczywiście, możesz zmienić tę lokalizację, ale wiążą się z tym pewne komplikacje.

ssh-keygen result

Następnie ssh-keygen zapyta o hasło, jakim ma zostać zakodowany generowany klucz. Możesz zostawić te pole puste. Lecz nie polecam tego rozwiązania. Narażasz się tym samym na to, że ktoś może wykraść klucz i wtedy bez problemu zaloguje się na serwer. W przypadku zabezpieczenia za pomocą passphrase, oprócz klucza należy znać także odkodowujące go hasło.

I to by było na tyle. Para kluczy zostaje wygenerowana i zapisana we wskazanym przez nas katalogu. My natomiast możemy przejść do kolejnego etapu konfiguracji.

Kopiowanie klucza na serwer – metoda I – ssh-copy-id

Drugi etap jest równie prosty jak pierwszy. Wygenerowaliśmy już klucze. Prywatny, jak już wiesz, zostaje na twoim komputerze. Na serwer należy przekopiować klucz publiczny. Możesz to zrobić za pomocą narzędzia: ssh-copy-id. Pełne polecenie, które musisz wydać, wygląda tak:

ssh-copy-id login@host

Za login podstawiasz nazwę użytkownika, a za host adres domenowy lub adres IP serwera.

Na ekranie może zostać wyświetlone ostrzeżenie, że tożsamość zdalnego hosta nie może zostać zidentyfikowana. Jeśli to początkowa konfiguracja, nie musimy się tym przejmować.

Następnie będziesz musiał podać hasło użytkownika, którym normalnie logowałbyś się na serwer. Gdy zostaniesz pomyślnie autoryzowany, a klucz zostanie przekopiowany, będziesz mógł powiedzieć, że ten etap konfiguracji zakończył się powodzeniem.

Klucz publiczny zostanie zapisany na serwerze w pliku ~/.ssh/authorized_keys.

Kopiowanie klucza na serwer – metoda II – ręczna

Co zrobić w sytuacji, kiedy w danej chwili masz tylko fizyczny dostęp do serwera? Musisz wtedy ręcznie przenieść klucz publiczny z klienta na serwer. Aby to zrobić, powinieneś skopiować plik ~/.ssh/id_rsa.pub z lokalnego komputera na jakiś nośnik pamięci, np.: pendrive. Możesz to zrobić za pomocą polecenia:

cp ~/.ssh/id_rsa.pub /media/pendrive

Zmień ścieżkę /media/pendrive na katalog, w którym zamontowana jest pamięć masowa, na którą chcesz przekopiować klucz publiczny.

Następnie podłącz pendrive’a lub inną pamięć masową do serwera. Najpierw stwórz katalog ~/.ssh, o ile już nie istnieje. Służy do tego polecenie:

mkdir -p ~/.ssh

Potem dopisz swój nowy klucz publiczny na końcu pliku authorized_keys.

cat /media/pendrive/id_rsa.pub >> ~/.ssh/authorized_keys

To wszystko.

Windows – generowanie pary kluczy za pomocą Putty

Nie każdy używa Linuksa jako swój główny system operacyjny 🙂 Ty także nie musisz. A jeśli nie używasz Linuksa, to z ogromnym prawdopodobieństwem korzystasz z Windowsa. Tam zasady postępowania są nieco inne. Przede wszystkim, Windows (w wersjach <1803) nie posiada wbudowanego klienta SSH. W takiej sytuacji musisz pobrać mały programik zwany Putty.

Wraz z zainstalowaniem programu Putty dostaniesz programik Puttygen, który służy do generowania par kluczy publiczny/prywatny. Obsługa PuttyGen jest banalnie prosta.

okno_puttygen
Okno programu PuttyGen

Tak wygląda główne okno programu. W dolnej części mamy nieco możliwości personalizacji. Możemy m.in. zmienić typ czy długość klucza. Domyślne parametry są całkowicie wystarczające. Aby stworzyć parę kluczy, wystarczy wcisnąć przycisk „Generate”.

puttygen_po_generate

Aby klucze były bezpieczne i całkowicie „losowe”, musimy pomóc generatorowi. Po wciśnięciu przycisku „Generate” program poprosi cię o ruszanie kursorem myszki, co generuje entropię dla generatora. Sprawia to, że klucze są bezpieczniejsze.

puttygen_ssh_klucze_wygenerowane

W ostatnim kroku możemy opcjonalnie podać passphrase, co dodatkowo zabezpieczy nasz klucz przed kradzieżą. Po wszystkim wystarczy tylko kliknąć przyciski „Save public key” i „Save private key”.

Klucz, który powinniśmy umieścić w pliku ~/.ssh/authorized_keys na serwerze, znajduje się w górnej części okna, w polu „Public key for pasting into OpenSSH authorized_keys file:” .

Skopiowanie klucza Putty na serwer

Wykonanie tej operacji pod Windowsem jest prawie identyczne z wersją linuksową. Niestety nie masz do dyspozycji polecenia ssh-copy-id, które załatwiłoby wszystko za ciebie. Aby przekopiować klucz publiczny wygenerowany przez Putty na serwer, musisz wykonać kilka czynności. Przede wszystkim, powinieneś zalogować się na serwer. Najpierw stwórz katalog ~/.ssh, o ile już nie istnieje. Zrobisz to za pomocą polecenia:

mkdir -p ~/.ssh

Następnie wystarczy skopiować klucz z programu PuttyGen i wydać następujące polecenie:

echo[tu wklejony klucz]&gt;&gt; ~/.ssh/authorized_keys

np.:

echo „AAAAfajerofajerofajerofajeroxxx” &gt;&gt; ~/.ssh/authorized_keys

Od teraz możesz się logować za pomocą Putty na serwer zdalny za pomocą klucza SSH.

Konfiguracja Putty na komputerze klienckim

To, że wygenerowaliśmy parę kluczy wcale nie oznacza, że Putty będzie z nich korzystało. Musimy poinformować program, gdzie zapisaliśmy klucz prywatny. Podobnie jak wszystkie pozostałe, także i to zadanie nie powinno nastręczyć ci zbytnich trudności.

Putty_ssh_private_key

Uruchom program Putty i przejdź na zakładkę Connection→SSH→Auth. W okienku właściwości po prawej stronie pojawi się pole o tytule: „Private key file for authentication”. Wystarczy, że wybierzesz przycisk „Browse…” i wskażesz klucz prywatny, któtego chcesz używać do autoryzacji.

Domyślnie będziesz musiał powtarzać tę operację za każdym razem, kiedy uruchomisz Putty ponownie. Aby zmiany w konfiguracji zostały zapamiętane, musisz zapisać sesję.

putty_zapisz_sesje

Aby to zrobić, musisz przejść na pierwszą zakładkę (Session), czyli tam, gdzie wpisujesz adres IP/nazwę serwera, z którym chcesz się połączyć. W dolnej części okienka znajduje się obszar zatytułowany „Load, save or delete a stored session”. W polu edycyjnym „Saved Sessions” podaj nazwę sesji, a następnie kliknij Save. Nowo dodana sesja pojawi się na liście poniżej. Teraz za każdym razem, kiedy będziesz chciał się połączyć z tym serwerem wystarczy, że wybierzesz odpowiedni wpis z listy.

Wyłączenie logowania za pomocą hasła

Spróbuj teraz zalogować się na swój serwer. Jeśli:

  • nie ustawiłeś passphrase, powinieneś zostać zalogowany na serwer bez pytania o hasło
  • ustawiłeś passphrase, pojawi się pytanie o jego podanie. Po podaniu passphrase powinieneś zostać zalogowany o serwer

Jeśli autoryzacja się powiodła, możesz być z siebie dumny. Udało ci się skonfigurować autoryzację za pomocą klucza. Pozostał tylko jeden drobny szkopuł – dalej dostępna jest metoda logowania za pomocą hasła. Powinniśmy ją wyłączyć.

Uwaga: Na początku dodaj klucze ssh dla wszystkich kont, na które zamierzasz się logować. Operację tę powtórz dla wszystkich komputerów, z których zamierzasz zarządzać serwerem. Powinieneś mieć m.in. dostęp do konta z uprawnieniami root (albo bezpośrednio, albo za pomocą konta o niższych uprawnieniach które może używać su albo sudo). Jeśli wyłączysz logowanie za pomocą hasła, jedyną metodą zdalnego dostępu do serwera pozostaną certyfikaty które dodałeś wcześniej. Zastanów się więc dobrze, zanim permanentnie wyłączysz domyślną metodę autoryzacji. W przeciwnym wypadku możesz utracić dostęp do serwera!

Edytuj plik /etc/ssh/sshd_config

Znajdź linijkę PasswordAuthentication. Jeśli jest zahashowana, skasuj znaczek #. Zmień słówko yes na no.

SSH wyłączenie logowania za pomocą hasła

Następnie wydaj polecenie:

 systemctl restart ssh

To koniec konfiguracji. Jeśli wszystko działa, możesz być z siebie zadowolony :).

Podsumowując

Logowanie za pomocą certyfikatu/klucza niesie ze sobą sporo zalet. Największą z nich jest bardzo duże zwiększenie poziomu zabezpieczeń. Od momentu włączenia tego rodzaju autoryzacji serwer nie będzie narażony m.in. na ataki brute-force czy słownikowe, gdyż żadnego hasła po prostu nie będzie. Metody autoryzacji za pomocą pary kluczy publiczny/prywatny obecnie złamać się nie da. Poza tym mając kilka serwerów, nie musisz pamiętać hasła do żadnego z nich. Wystarczy, że na każdy przekopiujesz swój klucz publiczny. Od tego momentu do każdego serwera będziesz mógł się logować za pomocą tego samego klucza, a bezpieczeństwo pozostanie na tym samym – wysokim – poziomie.

Jeśli nie popełnisz żadnego błędu, który powodowałby wyciek klucza prywatnego zapisanego na twoim komputerze do osób trzecich, możesz być pewien że nikt niepowołany nie zaloguje się na twój serwer za pomocą ssh.

Gdybyś zauważył jakieś nieścisłości, śmiało poinformuj o tym w komentarzu :). W wypadku, gdybym nie wspomniał o jakimś fakcie, który uważasz za istotny, napisz komentarz. Do zobaczenia. Miłego dnia/nocy :).

2 komentarze do “SSH – autoryzacja za pomocą klucza/certyfikatu

  1. Kazik Odpowiedz

    Wszystko OK ale teraz do połączenia się z innym komputerem zamiast podawania hasła muszę podawać passphrase co w zasadzie wcale nie ułatwia zadania

Skomentuj Karol Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany.