Połączenie zdalne z systemem Linux
Możliwość nawiązania zdalnego połączenia z systemem jest nieoceniona, gdyż możemy wykonać czynności administracyjne zdalnie, bez fizycznej obecności. W tym wpisie pokażę, jak ustalić sesję zdalna z systemem Linux. Użyjemy dwóch rozwiązań, leciwego i nie polecanego, ale ciągle wykorzystywanego protokołu Telnet oraz rozwiązania bezpieczniejszego, czyli SSH.
W omówieniu tematu pomoże topologia sieciowa przedstawiona na rysunku poniżej.
Protokół Telnet
Rozpoczynamy od najstarszego rozwiązania, czyli Telnetu. Skonfigurujemy system Linux Ubuntu tak aby można było nim zarządzać zdalnie z wykorzystaniem tego protokołu.
Aby móc zestawić połączenie Telnet z systemem należy rozpocząć od instalacji niezbędnych pakietów (wykorzystamy telnetd) – wydajemy polecenie: apt install telnetd Po wydaniu komendy następuje instalacja oprogramowania.
Automatycznie po instalacji odpowiedni port umożliwiający nawiązanie połączenia powinien zostać otwarty (stan nasłuchiwania). W przypadku Telnetu jest to port TCP 23. Aby sprawdzić stan portów wydaj polecenie: netstat -tlpn Jak widać poniżej port TCP 23 jest w stanie nasłuchiwania (gotowy do nawiązania połączenia).
Port jest otwarty, możemy spróbować wykonać pierwsze połączenie. Ale zanim to zrobimy musimy poznać adres IP serwera – wydajemy polecenie: ip a Adres IP serwera to 10.0.0.103
Do zestawienia sesji zdalnej posłużymy się programem PuTTY. PuTTY jest bardzo popularnym a co najważniejsze bezpłatnym narzędziem za pomocą, którego możemy zestawiać połączenia Telnet, SSH czy Serial (połączenie realizowane m.in. za pomocą złącza RS232 celem konfiguracji urządzeń np. przełączniki lub routery Cisco). Program działa zarówno pod kontrolą systemu Windows jak i Unix/Linux a dostępny jest w formie portable jak i instalatora. Program pobierzemy z tej strony: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Po pobraniu aplikacji spróbujmy ją wykorzystać do ustanowienia połączenia Telnet. Uruchamiamy narzędzie i przechodzimy do gałęzi Session (domyślnie uruchomiona karta).
W polu Host Name określamy adres IP zdalnego systemu (można skorzystać również z nazwy DNS) – punkt 1 a następnie w polu Port określamy docelowy port usługi (przydatne, gdy usługa została skonfigurowana do działania na innym niż domyślnym porcie) – punkt 2. Kolejnym krokiem jest określenie sposobu prowadzenia dialogu z hostem docelowym – wybieramy Other a następnie Telnet – punkt 3.Sekcja Load, save or delete a stored session (punkt 4) służy do zapisu sesji połączeń tak by można było się do nich odwoływać bez podawania danych niezbędnych do zestawienia sesji.
Po wpisaniu danych hosta zdalnego wybieramy przycisk Open zostaje nawiązana sesja Telnet.
Śledzić ją możemy również po stronie serwera – użyj polecenia: systemctl status inetd
Alternatywą dla PuTTY jest użycie wiersza poleceń, aby móc użyć CLI należy zainstalować klienta Telnet. Klienta zainstalujemy po przejściu do Panelu sterowania a następnie wybraniu opcji Programy i funkcje Po otwarciu okna (z lewej strony) klikamy na opcję Włącz lub wyłącz funkcje systemu Windows (lub użyj okna Uruchom – wpisz: optionalfeatures) i wśród dostępnych funkcji odszukujemy Klient Telnet. Funkcję należy zaznaczyć a następnie wybrać OK. Po instalacji polecenie: telnet będzie dostępne z linii poleceń.
Aby nawiązać połączenie zdalne w oknie wiersza poleceń wydajemy polecenie: telnet <adres_hosta> np. telnet 10.0.0.103
Użycie protokołu Telnet nie jest rozwiązaniem polecanym, gdyż w protokole tym nie przewidziano, żadnych mechanizmów pozwalających na zabezpieczenie komunikacji. Oznacza to, że w przypadku przechwycenia ruchu sieciowego nasze hasło i login będzie można bez problemu odczytać. Poniżej przedstawiam zrzut, który obrazuje fakt zdobycia loginu i hasła (została przechwycona sesja pomiędzy hostem nawiązującym połączenie a serwerem).
Protokół Telnet używaj tylko wtedy, gdy nie ma innej możliwości.
Protokół SSH
Głównym zadaniem protokołu SSH (ang. Secure Shell) jest zabezpieczenie połączeń typu klient-serwer i stanowi alternatywę dla sesji wykorzystującej Telnet. Mając wybór użycia połączenia zawsze jest lepiej wybrać SSH.
W wielu wersjach systemu Ubuntu Server, serwer połączeń SSH jest dostępny. Jeśli tak nie jest zainstalujesz go za pomocą polecenia: sudo apt install openssh-server
Poprawność instalacji (oraz to czy serwer jest obecny w systemie i działa) zweryfikujesz za pomocą polecenia: /etc/init.d/ssh status lub systemctl status ssh.service Jak można stwierdzić po analizie poniższego zrzutu serwer jest uruchomiony (punkt 1) oraz że nasłuchuje na domyślnym porcie usługi, czyli porcie TCP 22 (punkt 2).
Dodatkową weryfikację możemy wykonać za pomocą znanego już nam polecenia: netstat Usługa SSH wykorzystuje port TCP 22.
Polecenie lsof (lista otwartych plików) zwraca procesy użytkownika, które aktywnie korzystają z systemu plików i te polecenie też może zostać użyte do weryfikacji działania usług Telnet czy SSH.
Wydaj polecenie: lsof -i:22 Wydanie komendy sprawdzi jaka usług nasłuchuje na porcie 22.
Gdy serwer jest aktywny można nawiązać z nim połączenie. Ponownie wykorzystamy aplikację PuTTY. W sekcji Connection type wybieramy SSH.
Przy pierwszym połączeniu należy zaakceptować „odcisk palca”.
Podobnie jak w przypadku Telnetu tak i do połączeń SSH można wykorzystać wiersz poleceń systemu Windows. Należy jednak doinstalować funkcję klienta protokołu SSH. Wywołujemy okno Funkcje opcjonalne a następnie klikamy w przycisk Wyświetl funkcje spośród dostępnych odszukujemy Klient OpenSSH. W systemie Linux nic nie trzeba wykonywać, klient jest zainstalowany.
Aby móc nawiązać połączenie z powłoką hosta należy wydać polecenie: ssh <użytkownik>@<adres_IP_systemu_zdalnego>
Wydajmy polecenie: ssh luk@10.0.0.103
Przy próbie zestawiania pierwszego połączenia jesteśmy proszeni a potwierdzenie tego faktu. – tzw. „odcisk palca” serwera nie został zweryfikowany. Aby móc nawiązać połączenie wprowadzamy: yes (samo y nie wystarczy) – punkt 1. Podajemy hasło użytkownika luk – punkt 2.
Połączenie SSH z wykorzystaniem systemu Windows zostało ustanowione.
W starszych wersjach systemu Windows nie ma funkcji klienta SSH, stosowne oprogramowanie należy pobrać i zainstalować samemu np. Solar PuTTY, SuperPuTTY, PuTTY Tray, ExtraPuTTY, KiTTY.
Informacja o „odcisku palca” zapisywana jest w pliku: C:\Users\<nazwa_użytkownia>\.ssh\known_hosts Czasem odcisk powiązany z adresem trzeba z pliku usunąć, jeśli tego nie zrobimy nie uda się nawiązać połączenia. Problem występuje, gdy w dwóch różnych systemach łączymy się z hostami, które mają przypisane identyczne adresy IP.
Sesja z hostem zdalnym przy wykorzystaniu protokołu SSH została poprawnie skonfigurowana. Aby pokazać wyższość tego rozwiązania nad protokołem Telnet (szczególnie w kwestii bezpieczeństwa) spójrz na zrzut poniżej w którym został przedstawiony fragment sesji SSH. Jak można zauważyć przesyłanych informacji nie da się już odczytać w tak prosty sposób jak to było w przypadku sesji Telnet.
Naszą transmisję z hostem zdalnym możemy dodatkowo zabezpieczyć poprzez wybranie rozwiązania opartego na zastosowaniu kluczy – klucza prywatnego oraz klucza publicznego.
Zastosowany mechanizm bazuje na parze kluczy (prywatnym i publicznym) to tzw. szyfrowanie asymetryczne, gdyż za pomocą jednego klucza następuje szyfrowanie wiadomości zaś za jej odszyfrowanie odpowiada klucz drugi.
Aby sesja w wykorzystaniem kluczy mogła zostać nawiązana musimy wykonać następujące czynności:
- Rozpoczynamy od wygenerowania pary kluczy poprzez wydanie polecenia: ssh-keygen -t rsa Klucze są generowane dla użytkownika luk na hoście, z którym będziemy chcieli ustanowić połączenie.
- Po wydaniu polecenia w pierwszej kolejności jest generowany klucz prywatny (domyślna nazwa klucza: id_rsa), klucze domyślnie zapisywane są w katalogu domowym użytkownika w ukrytym folderze .ssh Domyślną nazwę klucza i lokalizację możemy zmienić.
- Klucz dodatkowo zabezpieczamy hasłem.
- Po wygenerowaniu klucza prywatnego tworzony jest klucz publiczny – domyślna nazwa klucza to: id_rsa.pub, klucz zapisywany jest w tym samym katalogu co klucz prywatny.
- Graficzna mapa klucza.
Po wygenerowaniu pary kluczy należy je umieścić w odpowiedniej lokalizacji. I tu rodzi się pytanie – Gdzie i jaki klucz użyć? Klucz prywatny jest najważniejszy i to jego chronimy a jego użycie zostanie przedstawione za chwilę. Przechodzimy do klucz publicznego.
Domyślna lokalizacja klucza publicznego to serwer (host, z którym będziemy chcieli nawiązać połączenie), katalog umiejscowienia klucza to folder .ssh, folder jest umiejscowiony w domowym katalogu użytkownika, którego poświadczenia użyjemy do wykonania stosownych operacji na serwerze (w naszym przypadku jest to użytkownik luk).
Wygenerowana para kluczy znajduje się w folderze .ssh, który znajduje się w katalogu domowym użytkownika luk (/home/luk/.ssh). Po przejściu do katalogu .ssh sprawdzamy czy klucze faktycznie zostały wygenerowane (punkt 1). Po stwierdzeniu istnienia kluczy musimy wykonać zapis klucza publicznego użytkownika luk do pliku authorized_keys. Zapis najlepiej jest wykonać przy wykorzystaniu komendy: cat (polecenie wyświetla zawartość pliku) z przekierowaniem (symbol >>) do pliku authorized_keys. Wydanie polecenia przedstawionego na poniższym zrzucie (punkt 2) spowoduje dopisanie zawartości pliku id_rsa.pub (klucz publiczny) do pliku authorized_keys. Przy wydawaniu polecenia zwróć uwagę na symbol przekierowania, gdyż użycie symbolu: > spowoduje nadpisanie (zastąpienie) już istniejących danych.
Kopie klucza zweryfikujesz porównując ze sobą zawartość obu plików – pliku klucza publicznego i pliku authorized_keys.
Host zdalny został skonfigurowany. Przechodzimy do konfiguracji komputera, który połączenie będzie nawiązywał.
Połączenie SSH z wykorzystaniem kluczy zostanie nawiązane z hosta działającego pod kontrolą systemu Windows (dla Linuxa procedura przebiega identycznie). Aby operacja zestawiania połączenia zakończyła się sukcesem musimy wykorzystać plik klucza prywatnego. Klucz prywatny musimy umieścić w katalogu .ssh użytkownika, który będzie realizował połączenie. W pierwszej kolejności weryfikujemy istnienie katalogu .ssh (w systemie Windows – c:\Users\<katalog_Użytkownika>\.ssh; w systemie Linux – /home/<katalog_domowy>/.shh) jeśli go brak, należy go utworzyć (w systemie Linux użyj komendę: mkdir .ssh). W katalogu umieszczamy plik klucza prywatnego: id_rsa
Po wykonaniu opisanych czynności sprawdzamy, czy uda się nawiązać połączenie. Połączenie inicjujemy za pomocą znanej nam już komendy: ssh <nazwa_użytkownika>@<adres_komputera_zdalnego> Aby połączenie doszło do skutku należy podać hasło, które zostało ustalone na etapie generowania klucza.
W systemie Linux użycie pliku klucza generuje błąd o braku zabezpieczenia pliku klucza prywatnego (WARRNING: UNPROTECTED PRIVATE KEY FILE) i niemożności jego wykorzystania a co za tym idzie użycie pliku klucza prywatnego zostaje pominięte.
Powodem błędu są nałożone prawa na plik id_rsa. Aby móc wykorzystać plik klucza prywatnego należy dokonać modyfikacji praw. Stosowne uprawnienia nadamy np. wydając polecenie: chmod 600 id_rsa
Po zmianie uprawnień pliku wykonujemy kolejną próbę połączenia. Tym razem połączenie z wykorzystaniem pary kluczy udaje się nam nawiązać (oczywiście po podaniu hasła chroniącego plik klucza prywatnego) – punkt 2.
Alternatywą dla połączenia konsolowego jest użycie narzędzia PuTTY, ale zanim go użyjemy należy wykonać konwersję klucza prywatnego.
Do konwersi zostanie użyte narzędzie PuTTY Key Generator (do pobrania ze strony: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html nazwa pliku: puttygen, narzędzie jest standardowo dostępne w systemie, gdy pobraliśmy instalator programu PuTTY a nie wersję portable).
Po uruchomieniu programu z górnego menu wybieramy Converions a następnie Import key.
Aby dokończyć wczytywanie klucza należy wprowadzić hasło klucza prywatnego (oczywiście jeśli takowe hasło zostało zdefiniowane).
Po wprowadzeniu wszystkich danych import klucza prywatnego zakończy się sukcesem. Po wczytaniu klucza, aby zapisać go w wymaganym formacie należy wybrać przycisk Save private key
Po wybraniu opcji definiujemy nazwę oraz lokalizację zapisu pliku klucza.
Plik klucza prywatnego zostanie zapisany w formacie PPK i jest gotowy do użycia z narzędziem PuTTY.
Aby móc zestawić sesję zdalną z wykorzystaniem plików kluczy uruchamiamy aplikację PuTTY. Standardowo w sekcji Host Name określamy adres IP i port systemu zdalnego, dodatkowo musimy określić lokalizację pliku klucza prywatnego. Aby wykonać to zadanie przechodzimy do gałęzi SSH a następnie po jej rozwinięciu wybieramy Auth i Credentials. W polu Private key file for authentication wskazujemy ścieżkę do pliku klucza.
Po wprowadzeniu wszystkich danych wybieramy przycisk Open. Następuje próba zestawienia połączenia SSH, po podaniu hasła klucza prywatnego sesja zostaje nawiązana.
Ostatnią czynnością jest wyłączenie logowania za pomocą hasła. Edytujemy plik: /etc/ssh/sshd_config, po odszukaniu linii: PasswordAuthenticaton domyślną opcję yes zamieniamy na no. Z początku linii należy usunąć znak komentarza – #.
Po zrestartowaniu usługi (polecenie: systemctl restart ssh) próba nawiązania połączenia przy użyciu hasła kończy się niepowodzeniem.