
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 {{SSH}} [1]Chodzi o to, że można uzyskać dostęp do serwera z wykorzystaniem samego klucza, bez podawania hasła użytkownika.. 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…).
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]Samo PuTTY nie daje możliwości generowania kluczy. Do tego celu są osobne narzędzia dostarczane przez autora programu..
Co będzie potrzebne
Do poprawnego wygenerowania klucza, oraz późniejszego poprawnego funkcjonowania będziemy potrzebować następujących programów:
Żaden z programów nie wymaga instalacji.
Generowanie klucza
Pierwszą rzeczą [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., którą musimy zrobić jest wygenerowanie klucza za pomocą PuTTYgen.
- Uruchamiamy program;
- 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;
- 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.
Po poprawnym wygenerowaniu klucza ujrzymy okno z nowo wygenerowanym kluczem i trzema polami, w które możemy wpisać tekst.
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
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ą).
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.
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.
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:
- Add Key;
- 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.
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).
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:
- D:\pageant.exe D:\klucz.ppk
- ″D:\folder ze spacja\w nazwie\pageant.exe″ ″D:\lokalizacja klucza\klucz.ppk″
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.
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.
Wyjaśnienia
↑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. |
Ś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?
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.
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?
A wrzuć jeszcze wynik „iptables -L -n”. Zgaduję, że iptables wrzucił jakąś swoją regułę. ufw jest tylko nakładką na niego.
Klucze zaimplementowane. Rozumiem już jak to działa.
dzięki