Generowanie kluczy SSH Linux, Mac

SSH co to właściwie jest?

SSH (Secure Socket Shell) – to protokół sieciowy umożliwiający bezpieczne nawiązanie połączenia ze zdalnym serwerem i wykonywanie na nim poleceń.

Logowanie może odbywać się na kilka sposobów – za pomocą loginu i hasła, za pomocą kluczy SSH, a także dodatkowego tokenu (np. przy użyciu uwierzytelniania dwuskładnikowego).

Klucze SSH

Klucze SSH stanowią jedną z metod uwierzytelniania, używaną do uzyskania dostępu do zaszyfrowanego połączenia między systemami. Są to duże liczby poddawane faktoryzacji, które przez użyty algorytm trudniej 'złamać’ niż zwykłe hasło. Używanie ich przy połączeniach z serwerem jest więc dużo bezpieczniejsze niż używanie loginu i ręcznie wpisywanego hasła.

Klucze SSH generowane są w parach, jako klucz prywatny i publiczny. Klucz prywatny pozostaje zapisany w urządzeniu, z którego nawiązujesz połączenie, natomiast klucz publiczny umieszczasz na serwerze, do którego chcesz się łączyć. To, co zostanie zaszyfrowane przy pomocy jednego z kluczy, może zostać odczytane tylko przy użyciu drugiego.

Klucz prywatny należy chronić, aby nie dostał się w niepowołane ręce. Jeśli ktoś inny uzyskałby do niego dostęp, mógłby autoryzować się na serwerze i wprowadzać na nim zmiany. Dlatego dobrze jest ustawić dla niego hasło – aby móc go użyć, trzeba najpierw uwierzytelnić się hasłem.

Lokalizacja kluczy SSH

Zanim wygenerujesz nową parę kluczy sprawdź, czy masz już jakieś klucze w swoim systemie. Być może będziesz chciał/a ich użyć (jednak zaleca się, aby dla każdej usługi generować osobną parę kluczy. W ten sposób, jeśli doszłoby do wycieku któregoś z kluczy prywatnych, reszta usług nie będzie zagrożona).

Klucze SSH zapisywane są zwykle w (ukrytym) podfolderze .ssh pod ścieżką:

Linux/Mac: %HOMEDRIVE%%HOMEPATH%/.ssh/  (np. u mnie jest to home/myusername/.ssh )

Windows: %USERPROFILE%/.ssh/  (np. u mnie jest to c:\users\myusername.ssh ),

choć ścieżka ta zależy od konfiguracji systemu.

Jak sprawdzić istniejące klucze na Linux/Mac:

Otwórz konsolę, przejdź do folderu .ssh i wylistuj wszystkie znajdujące się w nim pliki:

cd ~/.ssh
ls -lah

Przykładowe nazwy kluczy, jakie możesz zobaczyć po wpisaniu powyższych komend:

id_rsa
id_rsa.pub
id_ed25519
id_ed25519.pub

Jeśli nie zobaczysz żadnych plików, to znaczy, że nie masz jeszcze dodanych żadnych kluczy.

Może się też zdarzyć, że nie masz jeszcze folderu .ssh, w takim wypadku utwórz go:

cd ~
mkdir .ssh

Algorytmy szyfrowania kluczy SSH

Popularnymi algorytmami szyfrowania używanymi do logowania przez SSH są:

  • rsa – oparty na liczbach pierwszych. Zalecany jest dla niego klucz o rozmiarze co najmniej 2048 bitów, choć na dzień dzisiejszy stanowi to już słabe zabezpieczenie i bezpieczniej jest stosować wyższą wartość – 4096 bitów.
  • ecdsa – oparty na krzywych eliptycznych, nowszy, nieco wydajniejszy i bezpieczniejszy od rsa. Obsługuje trzy rozmiary kluczy: 256, 384 i 521 bitów. Najbezpieczniej jest oczywiście używać najwyższej wartości.
  • ed25519 – najnowszy i najbezpieczniejszy ze wszystkich algorytm. Jest wspierany tylko w nowszych wersjach oprogramowania.

Jak wygenerować klucze SSH?

Klucze SSH można wygenerować za pomocą wbudowanego narzędzia ssh-keygen, wpisując w konsoli polecenie:

ssh-keygen

Użycie tego polecenia bez dodatkowych argumentów wygeneruje parę kluczy w oparciu o domyślny algorytm.

Po wpisaniu polecenia pojawi się informacja o wygenerowaniu pary kluczy, a także pytania o lokalizację zapisu plików oraz hasło do klucza prywatnego. Jeśli wprowadzisz hasło, nie wyświetli się ono w konsoli. Jest to standardowe zachowanie w Linux, więc bez obaw, wszystko jest ok 😉

Polecenie ssh-keygen można również wywołać z dodatkowymi argumentami, pozwalającymi m.in. ustawić ścieżkę i nazwę pliku, rodzaj szyfrowania lub komentarz.

ssh-keygen -f ~/.ssh/myName-key-ecdsa -t ecdsa -b 521 -C "[email protected]"

ssh-keygen -f ~/.ssh/myName-key-ed25519 -t ed25519 -C "[email protected]"

Wyjaśnienie użytych argumentów:

-f ~/.ssh/myName-key-ecdsa  /  -f ~/.ssh/myName-key-ed25519    – ścieżka i nazwa klucza

-t ecdsa    /    -t ed25519 – rodzaj algorytmu szyfrowania
-b 521  – ilość bitów dla danego algorytmu szyfrowania

-C "[email protected]"  – komentarz, zapisany w treści klucza publicznego

Klucz prywatny wygenerowany przy użyciu algorytmu rsa będzie o wiele dłuższy niż ten wygenerowany przez algorytmy ecdsa lub ed25519.

Jak skopiować klucz publiczny na serwer?

Sposób I – ssh-copy-id

W starczych wersjach Mac’ów ta komenda może nie być dostępna, można jednak zainstalować ssh-copy-id na kilka różnych sposobów. Instrukcja tutaj: https://www.ssh.com/academy/ssh/copy-id#ssh-copy-id-on-mac (przewiń do nagłówka Ssh-copy-id on Mac)

Aby skopiować klucz publiczny na serwer za pomocą ssh-copy-id musisz użyć polecenia:

ssh-copy-id login@host

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

ssh-copy-id [email protected]

Przy pierwszym logowaniu otrzymasz informację o braku możliwości zidentyfikowania hosta i pytanie, czy na pewno chcesz kontynuować połączenie. Wpisz yes aby kontynuować.

System poprosi Cię o hasło użytkownika. Po pozytywnej autoryzacji klucz zostanie przekopiowany i zapisany na serwerze w pliku ~/.ssh/authorized_keys.

Powyższe polecenie, użyte bez żadnych dodatkowych argumentów, skopiuje pierwszy klucz SSH z listy dostępnych kluczy z domyślnego folderu .ssh .

Jeśli chcesz skopiować inny klucz z folderu .ssh lub klucz z innej lokalizacji, musisz jako argument podać jego ścieżkę. Jeśli serwer, do którego się łączysz obsługuje inny port niż domyślny (22), musisz również podać ten port:

ssh-copy-id -i ~/.ssh/myKeyName-ed25519.pub -p 234 login@host

Sposób II –  kopiowanie z użyciem komendy cat

Innym, być może nawet prostszym sposobem skopiowania klucza na serwer jest użycie komendy cat:

cat ~/.ssh/id_rsa.pub | ssh -p 234 [email protected] "cat >> ~/.ssh/authorized_keys"

Powyższa komenda wyświetla zawartość pliku klucza publicznego (cat ~/.ssh/id_rsa.pub), następnie nawiązuje połączenie z serwerem ( ssh -p 234 [email protected]) i wkleja wyświetloną zawartość do pliku authorized_keys umieszczonego pod podaną ścieżką (cat >> ~/.ssh/authorized_keys).

Plik authorized_keys to lista zaufanych kluczy publicznych, które mają prawo logować się na dany serwer przez SSH bez podawania hasła. Jeśli jednak ustawisz hasło dla swojego klucza SSH – to to hasło będzie trzeba podać przy logowaniu.

Po wpisaniu komendy system poprosi o hasło do serwera. Po jego podaniu nie zobaczysz żadnego komunikatu informującego o tym, że operacja się udała. Aby sprawdzić, czy tak się stało, możesz zalogować się na serwer i wyświetlić zawartość pliku authorized_keys, powinien się w nim znajdować Twój klucz publiczny.

Pamiętaj! Zabzpiecz odpowiednio swój klucz prywatny, ustawiając mu ograniczone prawa dostępu:

chmod 600 ~/.ssh/id_ed25519