SSH - klucze RSA (mozliwość logowania bez hasła)

Kategoria: Artykuły, etykiety: system, ssh

Dodany: 2009-08-06 11:44 (zmodyfikowany: 2009-12-23 10:46)
Przez: winnetou

Wyświetleń: 84274

SSH (Secure SHell) pozwala na zdalne połączenia z serwerem przy użyciu szyfrowanego połączenia. Nawiązanie połączenia wymaga podania:

  • nazwy użytkownika*
  • serwera (nazwy domenowej lub adresu IP)
  • portu (opcjonalnie jeżeli serwer działa na innym porcie niż 22)
  • hasła użytkownika

Przykłady:

ssh shell.dug.net.pl -l winnetou
ssh winnetou@shell.dug.net.pl
ssh shell.dug.net.pl -p 22

Krótkie objaśnienie:

Dwa pierwsze przykłady połączą się z serwerem ssh shell.dug.net.pl jako użytkownik winnetou. Login można podać albo po przełączniku -l albo podobnie do adresu mailowego user@serwer. Trzeci wpis połączy się z serwerem shell na porcie 22 (przełącznik -p określa port na na którym nasłuchuje serwer) "przedstawiając się" loginem lokalnego systemu.

* Podczas łącznia z maszyny z systemem unixowym przy pominięciu nazwy użytkownika ssh zgłosi się z lokalnym loginem.

Ale co zrobić gdy mamy kilka kont shellowych z różnymi loginami i/lub hasłami? Zapamiętywanie wszystkich trochę utrudnia życie. Jest na to sposób. SSH pozwala na uwierzytelnianie przy pomocy kluczy RSA. Jak się do tego zabrać? Na początek musimy wygenerować parę kluczy publiczny i prywatny. W tym celu użyjemy narzędzia ssh-keygen

ssh-keygen -t rsa -b 4096 

Przełącznik -t określa algorytm, który ma zostać wykorzystany do generowania kluczy, a opcja -b ilość bitów tworzonego klucza (domyślny rozmiar klucza szyfrującego to 2048bitów).

Akceptujemy domyślną lokalizację pliku z kluczem: $HOME/.ssh/id_rsa A następnie podajemy "passphrase", czyli frazę kodującą w oparciu, o którą zostanie wygenerowany klucz RSA.

NIE zostawiajmy tego pola pustego ani nie wpisujmy używanego hasła (czy to na lokalnej maszynie czy na zdalnej). Fraza powinna być stosunkowo długa, zawierać cyfry i znaki specjalne, wielkie i małe litery.

Frazę będziemy musieli podać 2 razy.

Po jej wygenerowaniu w $HOME/.ssh/ zostanie utworzony plik z kluczem publicznym id_rsa.pub.

Cała operacja generowana klucza powinna wyglądać mniej więcej tak:

winnetou@valhalla:~$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/winnetou/.ssh/id_rsa):
Created directory '/home/winnetou/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/winnetou/.ssh/id_rsa.
Your public key has been saved in /home/winnetou/.ssh/id_rsa.pub.
The key fingerprint is:
e6:34:48:15:63:60:3a:6d:25:8d:ab:86:b7:ac:66:3e winnetou@valhalla

Następnie powinniśmy zabrać prawa do odczytu do utworzonego pliku żeby inni użytkownicy nie mogli dobrać się pary kluczy. Czasami serwery OpenSSH odmawiają współpracy jeżeli prawa do katalogu $HOME/.ssh i plików w nim zawartych są zbyt duże.

Zabezpieczamy więc katalog domowy i katalog $HOME/.ssh

chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

Kolejnym krokiem jest "dystrybucja" klucza na każdy serwer, na który chcemy się logować.

ssh-copy-id winnetou@shell.dug.net.pl

Ostatnia czynność to przetestowanie i pierwsze logowanie. Logujemy się na zdalny serwer:

ssh winneotu@shell.dug.net.pl

Powinniśmy zostać poproszeni o podanie passhphrase

Enter passphrase for key '/home/winnetou/.ssh/id_rsa'

Jeżeli wszytko przebiegło bezbłędnie to nasz klucz RSA został dodany do $HOME/.ssh/authorized_keys po stronie serwera .

Od tej pory przy każdym logowaniu zamiast hasła do konta bedziemy musieli podać passphrase. Jest to o tyle wygodne, że musimy zapamiętać tylko jedno hasło do kilku maszy. A jak się ma sprawa z lgowaniem bez hasła? Otóż są 2 możliwości rozwiązania tego:

  • mało elegancka - czyli niebezpieczna
  • bardziej elegancka - czyli bezpieczna.

Opcja malo elegancka. Podczas tworzenia klucza RSA passphrase pozostawiamy puste. Jeżeli zdecydujemy się na taki krok to nalezy zadbać o to żeby nikt nie dobral się do wygenerowanych ponieważ uzyska dostęp do wszystkich Twoich kont shellowych i nie będzie musiał znać żadnego hasła.

Opcja bardziej elegancka to wykorzystanie ssh-agent. Najpierw musimy go uruchomić wydając polecenie ssh-agent. Wynik powinien być zbliżony do tego:

winnetou@valhalla$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-gDQmZ27313/agent.27313; export SSH_AUTH_SOCK;
SSH_AGENT_PID=27314; export SSH_AGENT_PID;
echo Agent pid 27314;

Następnie powinniśmy wyeksportować zmienne SSH_AUTH_SOCK oraz SSH_AGENT_PID tak aby klinet ssh mógł korzystać z agenta.

winnetou@valhalla$ export SSH_AUTH_SOCK;
winnetou@valhalla$ export SSH_AGENT_PID;

Prostsza metoda, po której nie musimy nic eksportować to uruchomienie agenta w ten sposób:

winnetou@valhalla$ eval `ssh-agent`

znaczek ` to odwrócony cudzysłów.

Aby nie uruchamiać agenta ręcznie po każdym logowaniu do systemu to do pliku $HOME/.bash_profile wystarczy dopisać linijke eval `ssh-agent`. To jeszcze nie wszystko. Agent SSH działa ale jego bufor jest pusty. Aby dodać do niego klucz musimy skorzystać z polecenia ssh-add.

winnetou@valhalla$ ssh-add ~/.ssh/identiy
Need passphrase for /home/winnetou/.ssh/identity
Enter passphrase for /home/winnetou/.ssh/identity
(enter passphrase)

Tutaj podajemy passphrase.

Rozwiązanie to ma jeszcze jedną wadę. Wymaga podania frazy przy każdym otworzonym terminalu. Dopóki pracujemy na jednej kosoli/terminalu to wszystko jest OK - raz podajemy frazę i używamy ssh do woli. Jednak na ogół mamy otwartych kilka terminali. I gdzie tu to udogodnienie? Otóż trzeba zastosować jeszcze jeden trick - wykorzystamy keychain.

Najpierw musimy zainstalować ten pakiet poniewż nie wchodzi on w skład OpenSSH:

apt-get install keychain

Jak działa keychain? Otóż sprawdza on czy ssh-agent jest uruchomiony. Jeżeli tak to z pliku $HOME/.ssh-agent pobiera zmienne SSH_AUTH_SOCK oraz SSH_AGENT_PID aby wykorzystać bieżącą sesje agenta zamiast uruchamiać nową. Jeżeli agent nie jest uruchomiony to uruchamia go w ten sam sposób co polecenie eval `ssh-agent`.

Skoro już mamy zainstalowany keychain należy go odpowiednio skonfigurować. Edytujemy plik $HOME/.bash_profile i dopisujemy do niego (przed ostatnią linijką):

/usr/bin/keychain ~/.ssh/id_rsa ~/.ssh/id_dsa
source ~/.ssh-agent > /dev/null

Teraz przy każdym uruchomieniu powłoki logowania (czyli przy zalogwowaniu do systemu ale nie przy otwarciu terminala!) bedziemy proszeni o podanie fraz szyfrujących dla wszystkich kluczy wymienionych przy wywołaniu keychain. Od teraz możemy nawiązywać połączenia ssh i używać scp bez podawania hasła/passphrase

Wiecej informacji na temat: keychain, ssh-agent, ssh-add, ssh-keygen uzyskamy w pomocy

man keychain
man ssh-agent
man ssh-keygen
man ssh-add

Uwaga końcowa: Serwer SSH, na który chcemy się logować za pomocą klucza RSA musi być odpowiednio skonfigurowany - wymagany jest poniższy wpis.

RSAAuthentication yes

Wszelkie uwagi proszę kierować na:

  • e-mail: wilkosz.p\małpa/gmail.com
  • JID: winnetou\małpka/jabster.pl

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks