SSH-KeyGen - tutorial

SSH służy do nawiązywania połączeń z kontem shellowym. Jest po bardzo bezpieczny protokół połączenia szyfrowanego. Zalogowanie się na konto shellowe wymaga jednak podania hasła, a co za tym idzie częste logowanie się może być uciążliwe lub niebezpieczne (wiele możliwości podejrzenia hasła lub hasło zapamiętane na komputerze). Możliwe jest jednak ułatwienie sobie codziennej pracy poprzez zastosowanie rad z tego tekstu.

W tym tekście pokażę, jakie czynności należy wykonać, żeby połączenie SSH pomiędzy dwoma komputerami odbywało się bez konieczności wpisywania hasła. Porady te można wykorzystać tylko w systemach Uniksowych (z tego, co mi wiadomo), tzn. działają pod Linuksem, w systemie Solaris itp.

Na początek

W tym tekście pokażę, jak łączyć się ze stacji roboczej z serwerem bez konieczności podawania hasła. Połączenia z serwera do stacji roboczej, pomiędzy serwerami i pomiędzy stacjami roboczymi wymagają zazwyczaj analogicznych kroków. Trzeba jednak pamiętać, że przeprowadzenie jednej takiej procedury umożliwia połączenia tylko w jednym kierunku. Żeby móc łączyć się bez haseł w obu kierunkach (co jest raczej nierozsądne z punktu widzenia bezpieczeństwa), należy wykonać identyczne czynności, ale zaczynając od drugiej maszyny.

Generowanie klucza na stacji roboczej

Najpierw musimy się zalogować na stacji roboczej na konto użytkownika, który w przyszłości będzie się łączył z serwerem bez użycia hasła. Potem musimy wygenerować klucz publiczny, w tym celu musimy wydać następujące polecenie:

$ ssh-keygen -t rsa

Jeżeli wszystko będzie w porządku oraz nigdy nie był generowany klucz publiczny, to powinny się pojawić następujące komunikaty:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/uzytkownik1/.ssh/id_rsa):

Możemy (chociaż nie musimy) podać nazwę pliku, w ktorym zostanie zachowany nasz klucz prywatny. Jest to o tyle ważne, ze musimy ten klucz potem znaleźć ;) Proponuję zostawić domyślną wartość i po prostu nacisnąć enter.

Następnie jesteśmy proszeni o podanie hasła do klucza i powtórzenie go:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Jeżeli naprawdę chcemy łączyć się z inną maszyną bez podawania hasła, to nie powinniśmy podawać nic i tylko naciskać enter. Inaczej każde logowanie wymagałoby podania hasła do klucza. Jednak jest to rozwiązanie bardzo niebezpieczne - uzyskując dostęp do jednej maszyny, włamywacz automatycznie zyskuje również dostęp do kolejnej.

Dostajemy ostateczne komunikaty z lokalizacją klucza prywatnego i publicznego (ten z rozszerzeniem ".pub") oraz "odciskiem" klucza:

Your identification has been saved in /home/uzytkownik1/.ssh/id_rsa.
Your public key has been saved in /home/uzytkownik1/.ssh/id_rsa.pub.
The key fingerprint is:
96:28:55:ad:95:c7:39:3f:a2:59:4c:e2:f6:13:d2:d5 uzytkownik1@komputer

Klucz publiczny i klucz prywatny zostały już wygenerowane. Teraz należy pamiętać o tym, ze klucz prywatny powinien zostać tylko u nas - jednoznacznie identyfikuje nas i jeśli ktoś go dostanie, łatwiej mu będzie uzyskać dostęp do serwera, z którym się łączymy bez hasła (chociaż będzie musiał m.in. znać nasz login).

Kopiowanie klucza publicznego na serwer

Aby serwer mógł nas "rozpoznać", musimy mu dostarczyć klucz publiczny który umożliwi naszą weryfikacje. Musimy więc skopiować go na serwer, np. przy pomocy polecenia "scp"

$ scp /home/uzytkownik1/.ssh/id_rsa.pub uzytkownik2@serwer:~/id_rsa.pub

Po naciśnięciu przycisku enter pojawia się prośba o podanie hasła (które oczywiście podajemy), a następnie rozpoczyna się przesyłanie pliku:

Password:
id_rsa.pub                         100%  398     0.4KB/s   00:00

Jeśli tuż przed podaniem hasła zostaniemy zapytani, czy chcemy dodać serwer do listy znanych znanych hostów, najlepiej odpowiedzieć twierdząco.

Samo skopiowanie klucza publicznego na serwer jednak nie wystarczy - musimy się połączyć z serwerem i dopisać go do listy akceptowanych kluczy. Zrobimy to za pomocą polecenia, które dopisze zawartość przesłanego wcześniej pliku do pliku z już wcześniej zaakceptowanymi kluczami:

$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

Użycie symbolu ">>" spowoduje dopisanie naszego klucza do końca pliku, bez zamieniania już istniejących. W przypadku, gdy plik nie istniał, zostanie automatycznie utworzony.

Po wykonaniu powyższych instrukcji będziemy mogli się logować bez używania hasła - o ile będziemy się łączyć z konta, na którym stworzyliśmy parę kluczy (prywatny i publiczny; lub z konta, na które zaimportowaliśmy klucz prywatny, aby używało go do łączenia się z innymi serwerami) z kontem, na którym dodaliśmy klucz publiczny do listy akceptowanych kluczy ("authorized_keys").

Uwagi

Porady zawarte w tutorialu można wykorzystywać również w innych sytuacjach, jak to napisałem na początku. Trzeba jednak wziąć pod uwagę możliwość włamania na nasze konto, a w konsekwencji brak jakichkolwiek ograniczeń w dostępie do komputerów, które zostały skonfigurowane do tego, aby łączyć się z nimi bez użycia haseł.

Najważniejsze dla nas konta powinniśmy więc traktować szczególnie i nie wyłączać wymagania hasła, nawet jeśli połączenie przychodzi z zaufanego źródła. Najlepszym rozwiązaniem w tej sytuacji jest używanie klucza prywatnego, który wymaga podania hasła.

Tutorial nie obejmuje wszystkich możliwych do zaistnienia sytuacji, jak specyficzna konfiguracja serwera.