SSH

Z openSUSE wiki

Niekompletny.png Ten artykuł jest niekompletny i wymaga rozbudowy. Szczegóły można znaleźć na stronie dyskusji.

SSH (Secure Shell) jest to program, który umożliwia logowanie do innych komputerów, kopiowanie plików między komputerami, zdalne wykonywanie poleceń na innych komputerach, łączenie sieci komputerowych za pomocą tzw. tuneli oraz przekazywanie (forwarding) środowiska graficznego X, czyli uruchamianie graficznych aplikacji na zdalnej maszynie i oglądanie ich na swoim komputerze. Logowanie do innych komputerów może być uwierzytelniane hasłem użytkownika, lub wygenerowanym kluczem. Cała transmisja danych pomiędzy komputerami jest szyfrowana. Program ten zastępuje mniej bezpieczne rlogin, rsh, rcp, rdist i telnet.

Spis treści


Implementacja OpenSSH w SUSE składa się z dwóch części:

  • klienta ssh, który umożliwia logowanie się na inne maszyny
  • demona sshd, który umożliwia logowanie się do komputera, na którym jest uruchomiony

Do czego używać?

Najczęściej używamy ssh do wykonywania poleceń na zdalnej maszynie, jak np. instalowanie oprogramowania na serwerze, przeglądanie logów systemowych. Wtedy używamy polecenia ssh w postaci uzytkownik@adres_lub_nazwa_maszyny. Często wykorzystuje się również polecenie scp, które służy do bezpiecznego kopiowania plików na inną maszynę, np. nowe pakiety RPM, które chcemy zainstalować na maszynie bez dostępu do internetu. Więcej o tych poleceniach można przeczytać w dalszej części artykułu.

Jak włączyć ?

Jeśli chcemy umożliwić logowanie do swojego komputera przez ssh, musimy uruchomić demona sshd i odblokować na firewallu port 22, który jest wykorzystywany przez ssh.

Uruchamiamy YaST >> System >> Usługi systemowe odszukujemy sshd i upewniamy się czy jest włączony.

Następnie w YaST przechodzimy do Zabezpieczenia i użytkownicy >> Zapora sieciowa >> Dozwolone usługi. Z listy usług wyszukujemy SSH i klikamy dodaj, następnie dalej i akceptuj.

Jeśli chcemy uruchomić usługę jednorazowo, możemy wykonać polecenie:

/etc/init.d/sshd start

Wyłączenie usługi podobnie:

/etc/init.d/sshd stop

Żeby sprawdzić czy działa ssh działa możemy wykonać

ssh localhost

Zostaniesz zapytany o hasło użytkownika, z którego wykonałeś polecenie. Po zalogowaniu otrzymasz znak zachęty, taki jaki standardowo masz ustawiony w konsoli. Żeby się wylogować naciśnij Ctrl+d.

Konfiguracja SSH

Oczywiście konfiguracja OpenSSH składa się z dwóch odrębnych części, jednej dla demona, jeśli takiego uruchamiamy na naszej maszynie i jest to plik: /etc/ssh/sshd_config. Konfiguracja klienta OpenSSH jest osobna dla każdego konta w systemie i znajduje sie w katalogu ~/.ssh, jednakże istnieje również plik /etc/ssh/ssh_config, w którym znajduje się konfiguracja ogólna, wspólna dla wszystkich. Kolejność wczytywania konfiguracji dla klienta:

  1. opcje podane w linii poleceń
  2. opcje zawarte w pliku ssh_config z katalogu domowego
  3. opcje zawarte w pliku /etc/ssh/ssh_config

Teraz omówimy zawartość plików konfiguracyjnych, najpierw najważniejsze opcje.

sshd_config

Host 
Ogranicza listę hostów, które mają dostęp do usługi ssh na tym hoście. Dostęp mają tylko hosty, które pasują do zdefiniowanego tutaj wzorca. Wzorzec to np.: *.co.uk - hosty z domeny co.uk, 192.168.0.? - hosty posiadające IP z zakresu 192.168.0.[0-9], można też zabraniać dostępu określonym hostom from="!*.dialup.example.com,*.example.com". Można podać kilka wzorców oddzielając je przecinkami.
BatchMode 
Tryb batchowy. Jeśli jest włączony, ssh nie pyta o hasło. Możliwe wartości to yes i no. Opcja ta jest użyteczna tylko jeśli mamy potrzebę uruchamiania skryptów korzystających z ssh, które nie używają haseł. Zaleca się ustawić wartość no i rozwiązać to kluczami dla odpowiedniego użytkownika, ale o tym w dalszej części.
CheckHostIP 
Określa czy sprawdzać klucz hosta w pliku known_hosts. Możliwe wartości yes i no. Domyślna wartość: yes.
Compression 
Włącza/Wyłącza kompresję transmisji. Domyślna wartość: no. Pamiętajmy, że włączona kompresja zwiększa szybkość przesyłania danych, ale zwiększa także zużycie zasobów komputera.
ConnectionAttempts 
Dopuszczalna liczba prób połączenia na sekundę przed odrzuceniem połączenia. Domyślna wartość: 1
Port 
Port, na którym działa usługa. Domyślna wartość: 22.
PermitRootLogin 
Określa czy umożliwić zdalne logowanie na użytkownika root. Domyślna wartość zależy od dystrybucji linuksa. Zaleca się ze względów bezpieczeństwa ustawić no i logować się na konto zwykłego użytkownika, a potem zrobić su. Jeśli nie możemy zalogować się na świeżo zainstalowany system na użytkownika root, to warto sprawdzić tę opcję. :)
X11Forwarding 
Określa czy uruchomić forwarding środowiska graficznego X. Możliwe wartości to yes i no. Domyślna wartość zależy od dystrybucji linuksa, w SUSE yes.
PrintMotd 
Określa czy wyświetlać komunikat powitalny z pliku /etc/motd po zalogowaniu. Możliwe wartości yes i no. Domyślnie opcja zakomentowana.
UsePAM 
Określa czy korzystać z modułów uwierzytelniania PAM. Domyślnie na SUSE yes i lepiej tego nie zmieniać.


Korzystanie z kluczy

Korzystanie z kluczy zwiększa bezpieczeństwo, ponieważ złamanie hasła jest prostsze niż uzyskanie dostępu do klucza prywatnego. Poza tym jeśli używasz wielu maszyn, na każdej innego hasła na konto roota czy też inne, ciężko zapamiętać je wszystkie. Kiedy korzystasz z kluczy musisz pamiętać tylko hasło do swojego klucza, albo wcale.

Krótki tutorial

Na potrzeby tego tutoriala zakładamy, że jesteś zalogowany na maszynie laptop jako użytkownik user i chcesz korzystać z klucza rsa, żeby zalogować się na maszynę mainframe.

Generujemy klucz

user@laptop:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

Jeśli chcesz zapisać klucz w innym pliku niż domyślnie sugerowany podaj ścieżkę do tego pliku, jeśli nie naciśnij enter.

Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):

Katalog został ~/.ssh został utworzony jeśli wcześniej go nie było. Teraz decydujesz czy chcesz chronić klucz hasłem. Jeśli tak, to podaj i powtórz hasło, jeśli nie, naciśnij enter dwa razy.

Rezultat:

Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
32:23:e4:11:34:45:0e:7f:81:00:d2:b2:72:f2:62:1c user@laptop

Zaleca się przeniesienie kluczy na pendrive lub inny nośnik. I najważniejsze: nie udostępniaj ich nikomu. Jeśli chcesz użyć innego algorytmu do generowania kluczy, jak na przykład dsa, to podaj jego typ po parametrze -t.

Umieszczamy klucz publiczny na zdalnej maszynie Żeby korzystać z klucza, musimy dodać klucz publiczny do pliku authorized_keys (dla rsa) lub authorized_keys2 (dla dsa) w katalogu ./ssh dla użytkownika dla ktorego wygenerowaliśmy klucz (w tym wypadku /home/user/.ssh/authorized_keys).

user@laptop:~> cd .ssh
user@laptop:~> scp id_rsa.pub user@mainframe:/home/user/id_rsa.pub

Tym razem jeszcze będziemy proszeni o hasło.

Logujemy się do zdalnej maszyny:

user@laptop:~> ssh user@mainframe
user@mainframe:~>

Jeśli katalog .ssh i plik authorized_keys nie istnieją, to je tworzymy:

user@mainframe:~> mkdir .ssh
user@mainframe:~> touch authorized_keys
user@mainframe:~> chmod 600 authorized_keys

Dołączamy swój klucz do authorized_keys i usuwamy plik z kluczem:

user@mainframe:~> cat id_rsa.pub >> .ssh/authorized_keys
user@mainframe:~> rm id_rsa.pub

Wylogowujemy się z maszyny:

user@mainframe:~> exit
Connection to mainframe closed.
user@laptop:~>

Logujemy się już za pomocą klucza Z kluczem rsa uzywamy opcji -1 z kluczem dsa -2

user@laptop:~> ssh -1 -v user@mainframe

Jeśli przy generacji kluczy zdefiniowaliśmy hasło, teraz musimy je podać. Opcja -v, czyli tak zwany tryb gadatliwy używamy przy pierwszym logowaniu, żeby latwiej zdiagnozować ewentualne błędy. I to wszystko.


Wyłączenie możliwości logowania się na root

Sprawdźmy plik sshd_config oraz opcję PermitRootLogin, która odpowiada za logowanie się na użytkownika root:

cheops:~ # grep -i root /etc/ssh/sshd_config
#PermitRootLogin yes                        
# the setting of "PermitRootLogin without-password".
#ChrootDirectory none   

Jak widzimy powyżej opcja jest zakomentowana. Oznacza to mniej więcej tyle, że w tym momencie istnieje możliwość logowania się na root:

cheops:~ # ssh root@cheops
The authenticity of host 'cheops (127.0.0.2)' can't be established.
RSA key fingerprint is 92:6a:13:6d:70:05:3b:f6:b1:1b:3a:06:42:d0:17:d3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'cheops' (RSA) to the list of known hosts.
Password:
Last login: Sat Apr 17 09:30:49 2010 from cheops
Have a lot of fun...

Ale my dążymy do tego aby zabronić userom logowanie się na root. Więc wylogowujemy się:

cheops:~ # logout
Connection to cheops closed.

Edytujemy więc plik sshd_config:

cheops:~ # emacs /etc/ssh/sshd_config

Oraz logujemy się ponownie:

cheops:~ # ssh root@cheops
Password:
Last login: Sat Apr 17 09:48:06 2010 from cheops.egipt.pl
Have a lot of fun...

Jak widzimy nadal istnieje możliwość logowania się na root. Przyczyną tego stanu rzeczy jest brak restartu serwera sshd:

cheops:~ # /etc/init.d/sshd restart
Shutting down SSH daemon                                                                              done
Starting SSH daemon                                                                                   done

Po restarcie serwera próbujemy logować się ponownie:

cheops:~ # ssh root@cheops
Password:
Password:
Password:
Permission denied (publickey,keyboard-interactive).

Zobacz też