Logowanie do SSH za pomocą klucza – generowanie kluczy w PuTTY

Dotychczas sam logowałem się do swojego serwera poprzez SSH z wykorzystaniem zwykłego hasła. Parę dni temu w związku z jednym zleceniem zainteresowałem się kluczami SSH, dzięki którym można również uzyskać dostęp do SSH1. Zaleta jest taka, że nie musimy każdorazowo wpisywać hasła. Właściwie… w przypadku kluczy niezabezpieczonych hasłem (tzw. passphrase) nie musimy w ogóle podawać hasła. Wystarczy wskazać ścieżkę do klucza w programie, za pomocą którego łączymy się do naszego serwera (PuTTY, WinSCP, Filezilla, Total Commander…).

[info]Dla własnego bezpieczeństwa odradzam „zabiegi” tworzenia kluczy bez passphrase. W razie niepowołanego dostępu do naszego dysku i kradzieży pliku z kluczem jesteśmy delikatnie powiedziawszy w czarnej dziurze. Warto więc podać hasło i zaszyfrować klucz. Dzięki odpowiednim programom możliwe jest jednorazowe podanie hasła2, co znacząco upraszcza pracę. Ale o tym w dalszej części wpisu.[/info]

Zaletą SSH jest fakt, że możemy zdefiniować sposób dostępu do naszego serwera za pośrednictwem hasła, klucza,  czy też za pomocą protokołu Kerberos (który jest mi na chwilę obecną obcy). Możemy również dla użytkownika root zabronić dostępu za pośrednictwem hasła. Dzięki czemu będzie możliwe zalogowanie się na to konto jedynie za pomocą klucza, lub protokołu Kerberos. Dziś jednak skupimy się tylko i wyłącznie na kluczach i ich generowaniu za pomocą PuTTY 3.

Co będzie potrzebne

Do poprawnego wygenerowania klucza, oraz późniejszego poprawnego funkcjonowania będziemy potrzebować następujących programów:
[dl href=”http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe” title=”PuTTY”]Pobierz program PuTTY[/dl]

[dl href=”http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe” title=”PuTTYgen”]Pobierz program PuTTYgen[/dl]

[dl href=”http://the.earth.li/~sgtatham/putty/latest/x86/pageant.exe” title=”Pageant”]Pobierz program Pageant[/dl]

Żaden z programów nie wymaga instalacji.

Generowanie klucza

Pierwszą rzeczą4, którą musimy zrobić jest wygenerowanie klucza za pomocą PuTTYgen.

  1. Uruchamiamy program;
  2. W dolnym polu „Number of bits in a generated key” możemy zdefiniować liczbę bitów w wygenerowanym kluczu (np. 1024, 2048, 4096). W sieci znalazłem informację iż wartość 1024 dobra jest dla tymczasowych kluczy, 2048 dla kluczy na rok, a 4096 na dłużej. Nawet na 5 lat… Wg mnie kwestia sporna, sam jednak podałem wartość 4096;
  3. Następnie klikając na Generate zaczynamy generowanie klucza. W tym celu musimy poruszać kursorem myszki po pustym, szarym polu – do momentu, aż klucz zostanie wygenerowany.
Generowanie klucza PuTTYgen

Po poprawnym wygenerowaniu klucza ujrzymy okno z nowo wygenerowanym kluczem i trzema polami, w które możemy wpisać tekst.

Wygenerowany klucz PuTTYgen

Pierwszym z nich jest Key comment – w polu tym wpisujemy komentarz do nowo wygenerowanego klucza. Może to być nasz adres e-mail, lub adres naszej strony, albo login. Dzięki temu możemy w prosty sposób zidentyfikować nasz klucz na liście w Pageant oraz na serwerze w pliku z kluczami (opis później).
Pozostałe dwa pola dotyczą wygenerowanej frazy/hasła (tzw. passphrase). W jednym i drugim polu musimy wpisać to samo hasło, dzięki któremu później możemy zdekodować klucz.

Gdy zakończymy uzupełnianie danych klucza o te dane, możemy go zapisać. W tym celu klikamy na przycisk Save private key. Wybieramy lokalizację, w której chcemy zapisać plik i podajemy jego nazwę. Ja zrobię to w: D:\klucz.ppk

[warn]Pamiętajcie, by po zapisaniu klucza nie zamykać okna PuTTYgen. Będziemy potrzebowali skopiować klucz na nasz serwer w celu autoryzacji wygenerowanego klucza. Jeśli jednak omyłkowo zamkniemy okno, możemy ponownie otworzyć klucz za pomocą PuTTYgen klikając w File / Load private key.[/warn]

Dodanie klucza na nasz serwer

Pozostały nam teraz ostatnie rzeczy do zrobienia, by za pomocą klucza móc się zalogować do naszego serwera SSH. Musimy dodać wygenerowany klucz do odpowiedniego pliku na naszym serwerze, oraz podać ścieżkę do klucza w programie PuTTY.

Logujemy się na nasz serwer SSH za pomocą hasła, czyli tak, jak zwykle. Z programu PuTTYgen kopiujemy klucz z szarego pola (wcześniej ruszaliśmy tam myszką).

[info]Klucz rozpoczyna się od frazy ssh-rsa, a kończy naszym komentarzem, który zdefiniowaliśmy w polu Key comment. Dla przykładu: ssh-rsa AAAAB3NzaC1yc2EAA…== keepmind.eu[/info]

Pozostaje nam teraz tylko dodać klucz do pliku ~/.ssh/authorized_keys. Wykonujemy więc następujące polecenia:

#przechodzimy do folderu .ssh naszego użytkownika. Dla roota będzie to /root/.ssh, dla użytkownika zwykłego /home/user/.ssh
cd ~/.ssh/
#dodajemy zdefiniowany klucz do pliku authorized_keys
echo tutaj_wklej_klucz_ssh-rsa.... >>authorized_keys

Ostatnią rzeczą do zrobienia jest wskazanie PuTTY lokalizacji naszego klucza, za pomocą którego będziemy mogli się teraz zalogować na nasz serwer. Uruchamiamy więc program PuTTY, ładujemy sesję do połączenia z naszym serwerem i przechodzimy do zakładki  Connection / SSH / Auth. W polu na samym dole podajemy ścieżkę do utworzonego przez nas klucza prywatnego.

Wskazanie ścieżki do klucza w PuTTY

Wracamy następnie do sesji (Session) i klikając na sesję naszego serwera klikamy na Save. Dzięki temu nie będziemy musieli ponownie definiować ścieżki klucza – konfiguracja zostanie zapamiętana.

Pytanie o passphrase podczas logowania

Logujemy się do naszego serwera, ale podczas łączenia serwer/program prosi nas o passphrase – chcemy uniknąć podawania tego hasła każdorazowo. Do tego celu wykorzystamy program Pageant.

Dodawanie klucza do Pageant

Uruchamiamy wcześniej pobrany program Pageant. Domyślnie program załaduje się do traya. Klikamy dwukrotnie na jego ikonkę, w celu przywołania okna programu. Widzimy tam dwa przyciski:

  1. Add Key;
  2. Remove Key.

Interesuje nas ten pierwszy przycisk. Klikamy więc na niego w celu dodania klucza do programu. Program zapyta nas o hasło (passphrase). Po zatwierdzeniu wygenerowany przez nas klucz zostanie dodany do listy.

Dodany klucz do programu Pageant

Od tej chwili, gdy uruchomimy PuTTY w celu zalogowania się na naszym serwerze nie będziemy musieli podawać każdorazowo hasła. Pageant zapamiętał passphrase i będzie ją trzymał do momentu, gdy wyłączymy program, lub się wylogujemy (co jest równoznaczne z zakończeniem programu).

Logowanie do serwera z wykorzystaniem zapamiętanego klucza i passphrase

By maksymalnie uprościć ładowanie klucza do programu Pageant możemy utworzyć skrót do niego, tak by automatycznie ładował klucz na listę. By tego dokonać tworzymy standardowy skrót do programu (prawoklik / Nowy / Skrót). Po utworzeniu skrótu do programu klikamy prawym przyciskiem myszy i wybieramy Właściwości. W polu Element docelowy podajemy ścieżkę do programu oraz do naszego klucza, które oddzielamy spacją. Dla przykładu:

Skrót Pageant
  1. D:\pageant.exe D:\klucz.ppk
  2. ″D:\folder ze spacja\w nazwie\pageant.exe″ ″D:\lokalizacja klucza\klucz.ppk″

[info]Jak widzicie, jeśli lokalizacja zawiera spacje w nazwie używamy cudzysłów.[/info]

Zabronienie logowania za pomocą hasła

Możemy skonfigurować nasz serwer SSH tak, by użytkownik root nie mógł zalogować się na serwer za pomocą hasła, tylko z użyciem klucza. Do tego celu potrzebujemy zmodyfikować plik /etc/ssh/sshd_config. Interesuje nas linia:

#PermitRootLogin yes

Pierwszą rzeczą, którą musimy zrobić jest usunięcie hasha (#) i zastąpienie frazy „yes” frazą „without-password”. Linia ta powinna wyglądać zatem następująco:

PermitRootLogin without-password

Zapisujemy plik i restartujemy serwer SSH:

#dla CentOS zadziała polecenie
service sshd restart
#dla innych systemów konieczne może być wydanie polecenia
/etc/init.d/sshd restart

Od tej pory będziemy mogli zalogować się na użytkownika root jedynie za pomocą utworzonego przez nas klucza.

[warn]Należy się wcześniej upewnić, że wygenerowany przez nasz klucz został dodany do pliku /root/.ssh/authorized_keys, tak by klucz został autoryzowany dla użytkownika root. W przeciwnym razie zablokujemy sobie dostęp do serwera.[/warn]

Na zakończenie

By nauczyć się generowania klucza i sposobu jego wykorzystania wykorzystałem stronę http://www.howtoforge.com/ssh_key_based_logins_putty oraz przydały mi się informacje z manuala sshd_config. Wpis jednak został od podstaw napisany przeze mnie, zrzuty są również mojego autorstwa. Zrobiłem to dlatego, by mi się to utrwaliło w pamięci.

Ikona wpisu pochodzi z programu PuTTYgen, którego właścicielem są ci Panowie.

  1. Chodzi o to, że można uzyskać dostęp do serwera z wykorzystaniem samego klucza, bez podawania hasła użytkownika. []
  2. Załadowany klucz jest ważny podczas jednej sesji. Po wylogowaniu się musimy ponownie wpisać hasło dla klucza. []
  3. Samo PuTTY nie daje możliwości generowania kluczy. Do tego celu są osobne narzędzia dostarczane przez autora programu. []
  4. Oczywiście z góry zakładam, że PuTTY mamy skonfigurowane odpowiednio i bez problemu możemy zalogować się na naszym serwerze przez SSH, a nasza sesja jest zapisana. []

Komentarze

5 odpowiedzi na „Logowanie do SSH za pomocą klucza – generowanie kluczy w PuTTY”

  1. Świetnie wszystko opisałeś. Właśnie dla mnie jako początkującego skorzystanie z putty.gen wydaje się stosunkowo proste. Właśnie zakupiłem swojego pierwszego VPS i zaczynam się nieco uczyć. Minimalnie pamiętam bo w okolicach 2000 – 2000 ćwiczyłem irssi, psybnc i własnego shella ale to jednak za mało.

    Zacząłem od konfiguracji OpenVPN i śmiga. Później ufw chociaż mimo tego, że zablokowałem niby cały ruch przychodzący poza SSH to OpenVPN działa i nie wiem czy nie zrobiłem czegoś źle.

    Teraz czas właśnie na bezpieczniejszą autoryzację za pomocą kluczy.

    Wklejanie klucza: rozumiem, że za pomocą komendy echo „: #dodajemy zdefiniowany klucz do pliku authorized_keys echo tutaj_wklej_klucz_ssh-rsa…. >>authorized_keys ” wywołuje ten plik i wklejam normalnie tekst klucza do tego wywołanego pliku w konsoli?

    1. 2000 – 2000? ;) Mały chochlik chyba.

      A zablokowałeś wszystkie porty poza 22? Rozumiem, że dajesz sobie dostęp na konkretne static IP, a nie otwierasz poszczególne porty. Nie wiem jak w przypadku UFW, ale dla iptables wygląda to tak:
      iptables -A INPUT -s 127.0.0.1 -j ACCEPT
      iptables -A INPUT -s TWOJE_IP -j ACCEPT
      iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
      iptables -P INPUT DROP
      iptables -P FORWARD DROP
      iptables -P OUTPUT ACCEPT
      service iptables save
      service iptables restart
      (opisane we wpisie Migracja na VPS – problemy z nią związane)

      Dokładnie tak. Może być jedynie problem że w kluczu RSA występują znaki typu „, ’, ` i nie będzie się chciał wkleić, ale wykonanie komendy:
      echo jakiś_tekst >> plik
      zapisze „jakiś_tekst” do plik. A dokładniej dopisze na końcu tego pliku. Jeśli wykonałbyś polecenie: echo jakiś_tekst > plik, to zawartość pliku zostanie nadpisana.

      Do zarządzania VPSem i firewallem polecam Webmin + csf. Istnieje dedykowany moduł dla Webmina do zarządzania.

  2. Mam takie ustawienia ufw:
    Default: deny (incoming), allow (outgoing), deny (routed)
    New profiles: skip
    To Action From
    — —— —-
    22/tcp ALLOW IN Anywhere
    22 ALLOW IN Anywhere
    22/tcp (v6) ALLOW IN Anywhere (v6)
    22 (v6) ALLOW IN Anywhere (v6)
    Czyli zgodnie z tym co chciałem do mojego VPS (z zewnątrz) jest dostęp tylko przez SSH wszystko inne jest zablokowane zgadza się?

    Zastanawia mnie właśnie to, że po tym jak ustawiłem : deny incoming mogę się połączyć z OpenVPN. Generalnie chcę oczywiście taką możliwość ale sądziłem, że po takim ustawieniu firewalla nie uda się i będę musiał jeszcze podawać wyjątki na openvpn (chociaż jeszcze nie wiem jak to zrobić).

    Czy dobrze myślę, że skoro połączenie openvpn jest możliwe to musiałem zrobić coś źle?

    1. A wrzuć jeszcze wynik „iptables -L -n”. Zgaduję, że iptables wrzucił jakąś swoją regułę. ufw jest tylko nakładką na niego.

  3. Klucze zaimplementowane. Rozumiem już jak to działa.
    dzięki

Skomentuj Kamil Gruba Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *