Najbardziej rozpowszechnioną metodą autoryzacji – czyli logowania – do wszystkich usług jest hasło. Znając jego problemy, niebezpieczeństwo z nim związane i wymagania, by było odpowiednio silne warto zastanowić się nad lepszym sposobem. Oczywiście mowa tu o innej, oddzielnej metodzie, a nie zabezpieczaniu swojego hasła czy włączanie 2FA (weryfikacja dwuetapowa). Nie wszędzie poniższa metoda oczywiście zadziała, ale zdecydowanie jest najlepszym pomysłem, który można wprowadzić na swoich serwerach. A mówiąc prościej: wszędzie tam, gdzie używamy SSH by połączyć się do serwera powinniśmy korzystać z lepszej opcji: klucz SSH.
Klucz SSH to tak na prawdę para plików (klucz prywatny oraz klucz publiczny) składających się z wielu losowo generowanych znaków. Algorytm ten jednak jest stworzony w taki sposób, iż oba pliki do siebie pasują – jak klucze od mieszkania pasują do zamka w drzwiach. W praktyce korzystanie z autoryzacji kluczem prywatnych w protokole SSH wielokrotnie zwiększa bezpieczeństwo. Prawdopodobieństwo złamania (odgadnięcia) klucza prywatnego służącego do autoryzacji do serwera jest prawie zerowa – przy obecnych komputerach i ich mocy obliczeniowej trwałoby to drugie tyle, ile istnieje wszechświat 😉
Jak wygenerować klucz SSH?
Generowanie kluczy to proces wbrew pozorom bardzo prosty. Oczywiście nieco różni się on pomiędzy głównymi typami systemów, ale w praktyce jeden proces można niemal wprost przenieść na inny OS. Bardzo ważną rzeczą w kwestii kluczy SSH jest ich bezpieczeństwo. Należy traktować te pliki jako bardzo newralgiczne i nie przenosić ich między niezaufanymi komputerami. Jak już powiedzieliśmy: dwa pliki porównać można do klucza i zamka. Plik klucza (najczęściej nazwany id_rsa) jest Twoim kluczem i – choć można zabezpieczyć go dodatkowo hasłem – nie powinno się go nikomu przesyłać. Potraktuj go zatem jak bieliznę lub swoje klucze od domu 😉. Klucz publiczny natomiast (zazwyczaj id_rsa.pub – rozszerzenie pub wskazuje, iż jest on public) jest niczym owy zamek, który montuje się do odpowiednich drzwi (a tutaj serwera/komputera). Samo generowanie plików “klucza” i “zamka” zależy zatem od systemu i tego, jakiego programu-terminala używamy. Kolejność systemów (nie)przypadkowa 😎
Klucz SSH na systemach rodziny 🐧 Linux
Pingwinkowe systemy oparte na jądrach Linuxa, czyli technicznie wszystkie *NIX-y potrafią szybko i wygodnie wygenerować parę pasujących do siebie kluczy SSH. Oznacza to, że metoda ta zadziała zarówno na Ubuntu, jak i Debianie, CentOS, FreeBSD i innych unixo-podobnych systemach. Cała ideo polega na wydaniu jednej komendy.
ssh-keygen
Następnie zostaniemy zapytani o wpisanie lokalizacji pliku klucza. Można to po prostu pominąć, aby używać domyślnego miejsca. Kolejno możemy podać hasło do pliku klucza. Dzięki temu nawet, jeśli ktoś zdobędzie nasz id_rsa nie będzie mógł go zwyczajnie użyć. Owego hasła nie musimy jednak podawać. Program poinformuje nas o właściwym wygenerowaniu klucza publicznego i prywatnego obrazkiem randomart:
The key's randomart image is:
+---[RSA 2048]----+
| .. |
| . . .. |
| . o . .. |
|..o . . |
|+ooo . S |
|+B+o+. . = |
|Bo*=B + .+ |
|.*+*EX . .o |
| .=.+o+ oo |
+----[SHA256]-----+
Jak stworzyć klucz SSH na 🍎 MacOS?
Ponieważ MacOS jest systemem o jądrze podobnym do Unixów to proces generowania kluczy SSH jest praktycznie identyczny. Rzecz sprowadza się do otwarcia terminala i wykonaniu odpowiedniej komendy. Terminal można znaleźć w Launchpadzie. Odpowiednie polecenie jest takie samo jak dla Linuxa.
ssh-keygen
Następnie zostaniemy zapytani o wpisanie lokalizacji pliku klucza. Można to po prostu pominąć, aby używać domyślnego miejsca. Następnie możemy podać hasło do pliku klucza. Nie musimy jednak go podawać. Program poinformuje nas o właściwym wygenerowaniu klucza publicznego, jak i prywatnego obrazkiem randomart:
The key's randomart image is:
+---[RSA 2048]----+
| o+.o |
|=+.. + |
|+O+ . . |
|B=+. o .. |
|.=B = ooS |
|o+ OEoo+ |
|.o+oooo. |
| .o=.+ |
| o++ |
+----[SHA256]-----+
Windows + PuTTY + klucz SSH = 🔐
Sam Windows nie posiada natywnie wbudowanego basha i nie potrafi samodzielnie używać protokołu SSH (jest to niewielkie uproszczenie tego tematu). Należy zatem używać tutaj zewnętrznych programów imitujących terminal. W naszym przypadku użyjemy aplikacji PuTTY – darmowego klienta SSH. Posiada on możliwość generowania kluczy SSH, jednak są one kompatybilne wyłącznie z programem PuTTY.
Oczywiście istnieje możliwość przetłumaczenia kluczy id_rsa na klycze PuTTY, jak i odwrotnie. Do tego celu należy użyć PuTTYgen – aplikacji do generowania i konwersji kluczy SSH.
Do wyboru możemy użyć opcji “Generate”, która stworzy nam klucz prywatny i publiczny (prywatny z rozszerzeniem .ppk – PuTTY Private Key) lub “Load”. Ta druga umożliwia wgranie posiadanego już klucza w celu jego konwersji do .ppk. Potem pozostaje już tylko kliknąć “Save public key” oraz “Save private key”, aby oba pliki zapisać na dysku.
PuTTY również umożliwia użycie hasła (passphrase) do klucza, co dodatkowo zabezpiecza serwer i użytkownika.
Po co w ogóle te dwa pliki?
Co dalej należy wykonać? Pozostaje wysłać swój klucz publiczny (ten będący “zamkiem w drzwiach”) na serwer. Treść pliku go zawierającego pozostaje wkleić do authorized_keys, ten zaś najczęściej podejrzeć i edytować możemy szukając w swoim katalogu domowym ukrytego folderu .ssh (tak – z kropką na początku). Jeszcze inną metodą jest poniższa ścieżka (która robi dokładnie to samo):
~/.ssh/authorized_keys
Potem po prostu wystarczy wskazać naszemu klientowi SSH, gdzie leży używany do autoryzacji klucz. W wypadku systemów Unixo-podobnych (oraz MacOS) klucz ten należy dać do folderu .ssh (tak, z kropką) w swoim katalogu domowym (czyli ~/.ssh/). Plik ten musi mieć nazwę id_rsa, id_dsa lub podobną (bowiem zależy ona od użytego algorytmu). Jeśli klucz był generowany zgodnie z wartościami domyślnymi – nie musimy nic robić. Skrypt już umieścił go za nas tam, gdzie być powinien. Ważnym zaznaczenia jest, aby plik klucza prywatnego miał prawidłowe uprawnienia, czyli powinien być możliwy do podejrzenia wyłącznie przez właściciela (i nikogo innego).
Jeśli mowa o Windows i PuTTY – należy wskazać lokalizację klucza prywatnego .ppk w zakładce SSH -> Auth. Dzięki temu PuTTY podczas połączenia będzie używał tego klucza. Warto dodać, że dla różnych zapisanych serwerów można używać oddzielnych kluczy prywatnych!
Po takim zabiegu na naszym serwerze można już ustawić SSH tak, aby umożliwiało wyłącznie logowanie po kluczu i gotowe. Aby stworzyć silny passphrase do swojego klucza zapoznaj się jeszcze z poradnikiem o tworzeniu silnych haseł. Bezpiecznego surfowania po protokole SSH! 😉