Rozpoczynamy od najstarszego rozwiązania czyli Telnetu. Spróbujemy tak skonfigurować system Linux Ubuntu 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 tak więc wydajemy polecenie: apt-get install xinetd telnetd Po wydaniu komendy nastąpi instalacja oprogramowania niezbędnego do zestawienia sesji Telnet.
Automatycznie po instalacji oprogramowania 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).
Zanim przejdziemy dalej chwilkę zatrzymajmy się przy użytej komendzie netstat. Polecenie netstat służy między innymi do wyświetlania aktywnych połączeń sieciowych a także portów, na których komputer nasłuchuje. Wydana komenda: netstat -tlpn spowoduje użycie następujących opcji:
-t - pokaż tylko porty TCP/IP,
-l - pokaż porty tylko w trybie nasłuchiwania (LISTEN),
-p - pokaż PID procesu związanego z otwartym portem,
-n - pokaż adresy IP bez ich rozwiązywania.
W przypadku portów UDP należy użyć flagi: -u np. pokaż porty TCP oraz UDP w stanie nasłuchiwania: netstat -tul
Jeśli wszystko się zgadza powinno udać nam się nawiązać połączenie zdalne z hostem przy wykorzystaniu protokołu Telnel.
Ale nie zawsze wszystko może zacząć działać od razu o ile w przypadku Linux Ubuntu 14.04 nie było żadnych problemów to już przy wersji 16.04 takowe nastąpiły. Po instalacji niezbędnych pakietów nawiązanie połączenia nie było możliwe.
Aby rozwiązać ten problem pierwsze nasze kroki powinniśmy skierować ku katalogowi: /etc/xinetd.d i sprawdzić czy istnieje plik: telnet W przypadku jego braku należy go utworzyć a jego zawartość powinna być następująca:
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
Po ewentualnym utworzeniu pliku należy wydać polecenie: sudo /etc/init.d/xinetd restart celem ponownego uruchomienia serwera i wprowadzenia nowych ustawień.
Po wprowadzeniu zmian powinno udać nam się zestawić połączenie Telnet. Jak widać poniżej tak też się stało.
Status i stan serwera możemy sprawdzić po wydaniu polecenia: sudo /etc/init.d/xinetd status
Domyślny port 23 usługi Telnet możemy zmienić poprzez edycję pliku: /etc/services Po otwarciu pliku odnajdujemy linię odnoszącą się do usługi Telnet i zmieniamy domyślną wartość portu 23 na pożądaną.
Aby móc zestawić połączenie z systemu Windows przy wykorzystaniu wiersza poleceń w pierwszej kolejności musimy 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 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>
Dokładniejszy opis narzędzia: telnet znajdziesz w wpisie: Nie samym GUI człowiek żyje. Rzecz o CMD
Opis narzędzi graficznych przedstawiono w dalszej części wpisu.
Jak wiadomo (i co już nie raz podkreślałem) użycie protokołu Telnet nie jest rozwiązaniem z punktu bezpieczeństwa zbyt trafnym gdyż w protokole tym nie przewidziano, żadnych mechanizmów pozwalających na zabezpieczenie całej 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.
Jeśli już nie mamy wyjścia to przynajmniej warto zabezpieczyć możliwość nawiązania połączenia z systemem do zaufanych hostów. Aby określić komputery, które mają prawo do zestawienia połączenia należy edytować plik: /etc/xinetd.d/telnet i do bieżącej konfiguracji dodać linię: only_from = <adres_IP/adres_sieci> Możemy określić adres IP hosta bądź zakres hostów poprzez definicję sieci. Definicję hostów możemy również przeprowadzić poprzez podanie nazwy domeny np. only_from = .slow7.pl
Inne przydatne parametry:
- no_access = 192.168.120.{101,105} - zabronienie połączenia, hosty o podanych adresach IP nie będą mogły zestawić sesji Telnet (w ten sam sposób możemy zdefiniować hosty mogące połączenie nawiązać),
- access_times = 7:00-10:00 22:00-23:00 - określenie czasu w którym może nastąpić połączenie,
- instances = 2 - ustawia maksymalną liczbę równocześnie realizowanych połączeń (parametr zdefiniowany w pliku: /etc/xinetd.conf),
- log_on_failure += <rejestrowane_parametry> - rejestrowanie zdarzeń związanych z nieudanym logowaniem,
- log_on_success += <rejestrowane_parametry> - rejestrowanie zdarzeń związanych z udanym logowaniem,
- log_type = FILE <ścieżka_do_pliku> - określenie pliku dziennika.
Parametry, które podlegają zapisowi w pliku dziennika to:
- ATTEMPT - rejestruje fakt dokonania nieudanej próby logowania (log_on_failure),
- DURATION - rejestruje czas trwania połączenia (log_on_success),
- EXIT - rejestruje fakt zakończenia usługi (log_on_success),
- HOST - rejestruje adres IP zdalnego hosta (log_on_failure i log_on_success),
- PID - rejestruje identyfikator procesu odbierającego żądanie (log_on_success),
- USERID - rejestruje nazwę zdalnego użytkownika (log_on_failure i log_on_success).
Poniżej jeszcze przykład konfiguracji serwera Telnet z uwzględnieniem niektórych powyższych opcji.
Jak widać logi serwera Telnet są zapisywane w zdefiniowanym pliku: telnet.log, którego lokalizacja została zdefiniowana na katalog: /var/log/ Przykład zawartości pliku dziennika serwera zaprezentowano poniżej.
Protokół SSH (ang. Secure Shell - bezpieczna powłoka) został stworzony jako rozwiązanie, którego głównym zadaniem 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.
Konfigurację połączenia SSH rozpoczynamy od instalacji niezbędnych pakietów. Aby móc nawiązać połączenie SSH należy zainstalować bibliotekę: openssh-server Instalację przeprowadzimy wydając polecenie: sudo apt-get install openssh-server
Poprawność instalacji możemy zweryfikować wydając polecenie: /etc/init.d/ssh status 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).
Aby sprawdzić czy serwer rzeczywiście nasłuchuje na porcie TCP 22 możemy posłużyć się znanym nam już poleceniem: netstat
Dodatkową weryfikację możemy wykonać posługując się poleceniem: lsof -i:22 Wydanie komendy sprawdzi jaka usług nasłuchuje na zdefiniowanym porcie 22.
Wiemy już, że serwer SSH działa spróbujmy więc dokonać połączenia. W pierwszym kroku do nawiązania połączenia użyjemy systemu Linux a w następnym przykładzie systemu z rodziny Windows.
Połączenie nastąpi z hosta na którym jest zainstalowany system Ubuntu 14.04. A więc przed nawiązaniem połączenia sprawdzamy dostępność hosta (punkt 1) – serwer SSH o adresie IP 192.168.1.132 jest dostępny.
Aby móc nawiązać połączenie z powłoką hosta należy wydać polecenie: ssh <adres_IP_systemu_zdalnego> - punkt 2.
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 3.
Aby w pełni nawiązać połączenie musimy jeszcze podać hasło przypisane do konta luk – punkt 4.
Po podaniu hasła sesja zdalna z hostem o adresie IP 192.168.1.132 zostaje ustanowiona – punkt 5.
W przykładzie powyżej doszło do pewnego uproszczenia. Uważnemu Czytelnikowi na pewno przyjdzie do głowy pytanie – Skąd protokół wiedział by prosić o hasło przypisane do konta luk? Odpowiedź – zbieg okoliczności gdyż następuje połączenie z konta w systemie lokalnym o takiej samej nazwie jak ta zdefiniowana w systemie zdalnym. W naszym przypadku użytkownik z konta luk (komputer nawiązujący połączenie) chce się połączyć z system zdalnym wykorzystując poświadczenia przypisane również do konta luk.
Co zrobić jeśli chcemy do połączenia użyć poświadczenia innego konta? Należy połączenie wywołać za pomocą innej komendy. Aby móc zestawić połączenie z systemem zdalny z użyciem określonych poświadczeń wydajemy polecenie: ssh <nazwa_konta>@<adres_IP_systemu_zdalnego> Poniżej przykład zestawienia połączenia z konta lokalnego root z kontem zdalnym luk.
Połączenie SSH z wykorzystaniem systemu Linux zostało ustanowione.
Co zrobić w sytuacji w której połączenie będzie realizowane z komputera pracującego pod kontrolą systemu Windows? Do zestawienia zdalnej sesji SSH posłużymy się programem Putty. PuTTY jest bardzo popularnym a co najważniejsze bezpłatnym narzędziem za pomocą, którego możemy zestawić połączenie SSH lecz nie tylko gdyż program może również pełnić rolę klienta Telnet, Rlogin 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: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Po pobraniu aplikacji spróbujmy ją wykorzystać do ustanowienia połączenia SSH. 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 SSH - punkt 3.
Sekcja Load, save or delete a stored session 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. Podczas pierwszego połączenia będziemy poproszeni o zaakceptowanie alertu bezpieczeństwa związanego z brakiem w bazie tzw. „odcisku palca”. Wybieramy Tak.
Aby nasze połączenie doszło do skutku będziemy musieli podać login oraz hasło użytkownika. Jak widać poniżej po podaniu danych uwierzytelniających udało nam się zestawić połączenie z hosta o adresie IP 192.168.1.10 z hostem zdalnym 192.168.1.132
Tak jak wspomniałem z narzędzia PuTTY można również korzystać w systemie Linux.
Ci którzy preferują wiersz poleceń zainteresują się programem OpenSSH. System Windows domyślnie nie ma zaimplementowanych narzędzi za pomocą, których można by było zestawić połączenie SSH. Aby uzupełnić tę lukę wystarczy ze strony: https://sourceforge.net/projects/opensshwindows/ pobrać wyżej wspomnianą aplikację. Instalacja programu przebiega w sposób standardowy.
Aby przy pomocy pobranego i zainstalowanego narzędzia nawiązać połączenie SSH w pierwszym kroku należy przejść do katalogu instalacyjnego, domyślna ścieżka instalacji to: c:\program files\OpenSSh for Windows\bin (w przypadku systemu 64-bitowego ścieżka instalacji będzie miała postać: c:\program files (x86)\OpenSSh for Windows\bin)
Proces nawiązywania sesji rozpoczniemy po wydaniu polecenia: ssh <nazwa_użytkownika>@<adres_IP_hosta_zdalnego> Po zaakceptowaniu połączenia oraz podaniu danych uwierzytelniających połączenie z hostem zdalnym zostaje nawiązane.
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 bazujący na parze kluczy (prywatnym i publicznym) jest określane jako 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:
1 - 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.
2 - 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ć.
3 - Klucz dodatkowo zabezpieczamy hasłem.
4 - 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.
5 - 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). Miejsce zapisu klucza publicznego zostało zdefiniowane w pliku: /etc/sshd_config w sekcji: AuthorizedKeysFile Edycja danych zawartych w tym pliku pozwoli nam na określenie dowolnej lokalizacji składowania kluczy publicznych użytkowników (w pliku mogą być zawarte klucze publiczne wielu użytkowników).
W naszym przypadku para kluczy została zapisana w folderze .ssh, który oczywiście jest umiejscowiony w katalogu domowym użytkownika luk. Po przejściu do katalogu .ssh (punkt 1) sprawdzamy czy klucze faktycznie zostały wygenerowane (punkt 2). 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 3) 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.
Fakt dokonania zapisu zawartości pliku klucza publicznego do pliku authorized_keys możemy sprawdzić porównując je ze sobą. Jak widać poniżej zawartość plików jest ze sobą zgodna - informacje zawarte w kluczu publicznym zostały prawidłowo przeniesione.
Host zdalny został skonfigurowany. Czas więc przejść 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 Linux z konta użytkownika root. 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 sprawdzamy fakt istnienia katalogu .ssh w folderze domowym użytkownika root - punkt 1. W razie jego braku z pomocą komendy: mkdir .ssh należy go utworzyć. Gdy katalog istnieje (bądź po jego utworzeniu) umieszczamy w nim plik klucza prywatnego: id_rsa (punkt 2 - zostało użyte polecenie cp odpowiedzialne za wykonanie procesu kopiowania) Po wykonaniu procesu kopiowania klucza prywatnego sprawdzamy poprawność wykonanych operacji - punkt 3. Klucz prywatny użytkownika luk został zapisany w katalogu .ssh użytkownika root.
Po wykonaniu opisanych czynności czas sprawdzić czy uda nam się nawiązać połączenie. Połączenie inicjujemy za pomocą znanej nam już komendy: ssh <nazwa_użytkownika>@<adres_komputera_zdalnego> Wydanie polecenia 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 musimy dokonać takiej modyfikacji praw by tylko użytkownik nawiązujący połączenie mógł z tego pliku skorzystać. Uprawnienia do odczytu i zapisu pliku id_rsa przez użytkownika root nadamy wydając polecenie: chmod 600 id_rsa - punkt 1
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.
Co zrobić jeśli połączenie SSH z wykorzystaniem kluczy chcemy zestawić przy wykorzystaniu systemu Windows? Aby móc uzyskać połączenie z hostem zdalnym należy ponownie użyć narzędzia PuTTY. Lecz zanim będziemy mogli użyć PuTTY musimy dokonać konwersji pliku klucza prywatnego tak aby móc go użyć z programem.
Do przeprowadzenia konwersi użyjemy dedykowanego programu 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 móc 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 by 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 został 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. Lokalizację klucza prywatnego określamy po wybraniu przycisku Browse.
Po wprowadzeniu wszystkich danych nie pozostaje nam nic innego jak kliknąć na przycisk Open. Następuje próba nawiązania połączenia SSH, która jak widać poniżej po podaniu hasła do klucza prywatnego zostaje ustalona.
Udało nam się nawiązać połączenie SSH z wykorzystaniem klucza prywatnego i publicznego, połączenie nastąpiło z systemu Windows przy wykorzystaniu narzędzia PuTTY.
Wraz z instalacją obsługi funkcji SSH uzyskujemy możliwość bezpiecznego kopiowania plików. Kopiowanie plików może zostać zrealizowane za pomocą protokołu SCP lecz także protokołu SFTP.
Protokół SCP (ang. Secure copy) do wykonania procesu przesyłu plików pomiędzy zdalnymi hostami korzysta z zabezpieczonego połączenia. Oprócz zapewnienie bezpieczeństwa transferu plików (choć w implementacji protokołu brak funkcji uwierzytelniania) przy wykorzystaniu SSH zapewnia on przekazanie wraz z przesyłanym plikiem jego atrybutów.
SFTP (ang. SSH File Transfer Protocol) – to protokół komunikacyjny typu klient-serwer, który umożliwia przesyłanie plików poprzez sieć TCP/IP. Wykorzystanie protokołu FTP do zapisu/odczytu plików gwarantuje nam poprawność przeprowadzanej operacji lecz bez zachowania bezpieczeństwa – nasze hasła i dane tak samo jak przy użyciu protokołu Telnet nie są szyfrowane, co potencjalnie naraża nas na ich kradzież. Znaczną poprawę bezpieczeństwa przynosi protokół SFTP, który nie wymaga obecności serwera FTP, a przesyłane dane są szyfrowane z wykorzystaniem klucza szyfrującego. SFTP nie powinien być mylony z protokołem FTPS, który jest rozszerzeniem protokołu FTP.
Przetestujmy więc przesył plików z wykorzystaniem wyżej wspomnianych protokołów. Rozpoczniemy od protokołu SCP z wykorzystaniem hosta pracującego pod kontrolą systemu Linux.
Aby przesłać plik na host zdalny musimy użyć polecenia, którego ogólna składnia przedstawia się następująco: scp <ścieżka_do_pliku_wysyłanego> <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_zapisu_przesyłanego_pliku> Poniżej na zrzucie przedstawiono przykład w którym przesłano plik: do_wyslania, plik został zapisany w katalogu domowym użytkownika luk (znak tyldy oznacza katalog domowy). Do wysłania użyto poświadczeń użytkownika luk.
Po przejściu na hosta zdalnego i wydaniu polecenia: ls widać iż plik został przesłany prawidłowo.
Podczas korzystania z narzędzia scp mamy szereg flag za pomocą, których możemy skonfigurować narzędzie. Poniżej kilka z nich:
-1 - wymuszenie użycia pierwszej wersji protokołu,
-2 - wymuszenie użycia drugiej wersji protokołu,
-4 - adresacja oparta o IPv4,
-6 - adresacja oparta o IPv6,
-B - włączenie trybu wsadowego,
-P <port> - zdalny por na którym została uruchomiona usługa serwera SSH (przydatne w sytuacjach w których SSH działa na niestandardowym porcie),
-i <ścieżka_do_pliku_klucza> - opcja wykorzystywana podczas ustanawiania połączenia opartego o klucze,
-l <limit> - definicja limitu transferu danych (wartość ta wyrażana jest w Kb/s),
-p - nakaz zachowania atrybutów pliku tj. czas modyfikacji, prawa dostępu,
-r - włącza kopiowanie rekurencyjne (przydatne w sytuacji kiedy chcemy wykonać kopiowanie wszystkich plików zawartych w katalogu),
-q - uruchomienie paska postępu,
-v - włącza tryb debugowania (opcji tej użyj gdy występuje problem z przekazywaniem plików).
Aby proces kopiowania przeprowadzić z lokalizacji zdalnej na host lokalny należy użyć polecenia: scp <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_pliku_kopiowanego> <lokalizacja_zapisu_pliku>
W przypadku systemu Windows możemy skorzystać m.in z narzędzia wiersza poleceń scp zawartego po instalacji OpenSSH (opis narzędzi wykorzystujących GUI za chwilę). Aby zapisać plik na hoście zdalnym należy skorzystać z bliźniaczego polecenia scp dostępnego w systemie Linux. Składnia polecenia jest identyczna. Poniżej przedstawiono przykład zapisu pliku: do_wyslania_2.txt i tak jak to opisano w poprzednim kroku plik również zapiszemy w katalogu domowym użytkownika luk z wykorzystaniem tych samych poświadczeń.
Po wysłaniu pliku sprawdzamy fakt zapisu po stronie hosta zdalnego. Ponowne wydanie polecenia: ls przekonuje nas o prawidłowości wykonania całej operacji.
Do zapisu plików z wykorzystaniem protokołu SCP możemy również użyć narzędzia pscp zawartego po instalacji programu PuTTY (aplikacje możemy pobrać oddzielnie). Aby przesłać plik należy skorzystać z komendy: pscp <ścieżka_do_pliku_wysyłanego> <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_zapisu_przesyłanego_pliku> Poniżej przykład zapisu pliku: do_wyslania_3.txt
Sprawdzenie poprawności z wykorzystaniem polecenia: ls potwierdza fakt zapisu pliku.
Pomimo możliwości skorzystania z narzędzi opartych o protokół SCP znacznie częściej wykorzystuje się te wspierające SFTP (m.in. dlatego iż za pomocą SFTP możemy skorzystać z transmisji opartej o uwierzytelnienie oparte o klucze). Znacznie łatwiej do przesyłu plików używać narzędzi graficznych ponieważ aplikacje te ułatwiają nam wykonanie całości zamierzonych zadań w szczególności gdy trzeba przeglądać złożone struktury katalogów. Jednym z takich narzędzi jest: mc (pierwowzorem narzędzia był stary, dobry Norton Commander - Ci trochę starsi na pewno wiedzą o co chodzi). Po pobraniu i zainstalowaniu programu (operację wykonujemy w systemie Linux) wybieramy z Menu opcję Lewy bądź Prawy a następnie Połączenie SFTP. Wybranie opcji umożliwi nam nawiązanie połączenia z hostem zdalnym.
Aby móc nawiązać połączenie w oknie Połączenie SFTP z komputerem podajemy nazwę użytkownika oraz adres IP hosta zdalnego.
Aby dokończyć zestawianie połączenia niezbędne będzie również hasło użytkownika.
Po wprowadzeniu wszystkich niezbędnych danych połączenie z wykorzystaniem protokołu SFTP zostaje ustanowione. Po ustaleniu połączenia możemy przeprowadzać operacje związane z kopiowaniem plików (oczywiście proces kopiowania odbywa się w obu kierunkach).
Narzędzie mc umożliwia nam także zestawienie połączenia po powłoce. Wybranie żądania dostępne jest po wybraniu opcji: Połączenie po powłoce Uzyskanie połączenia przebiega w analogiczny sposób jak z wykorzystaniem protokołu SFTP. Po zestawieniu połączenia uzyskujemy możliwość wykonywania poleceń, których działanie będzie przeprowadzane na hoście zdalnym.
Jednym z narzędzi za pomocą, którego będziemy mogli przesłać pliki z wykorzystaniem protokołu SFTP jest aplikacja psftp (dostępna po instalacji PuTTY lub do pobrania jako oddzielny plik). Narzędzie wykorzystuje wiersz poleceń.
Aby móc korzystać z narzędzia należy wywołać polecenie: psftp (punkt 1) a następnie za pomocą komendy open <nazwa_użytkownika>@<adres_hosta> (punkt 2) określić dane niezbędne do nawiązania połączenia z hostem zdalnym. Po podaniu hasła sesja zostaje ustalona. Wydanie polecenia wylistowania plików na hoście zdalnym kończy się sukcesem (punkt 3) - połączenie zostało zestawione prawidłowo.
Opis dostępnych opcji uzyskamy (jak to jest zazwyczaj przy użyciu narzędzi opartych o wiersz poleceń) po wydaniu polecenia help.
Przydatne komendy:
! - uruchomienie komendy, polecenie jest wykonywanie lokalnie,
bye - kończenie sesji SFTP,
cd - zmiana katalogu, polecenie wykonywane na hoście zdalnym,
chmod - zmiana uprawnień pliku, polecenie wykonywane na hoście zdalnym,
close - zamknięcie sesji lecz bez wyjścia z programu psftp,
del - skasowanie pliku, polecenie wykonywane na hoście zdalnym,
dir - listening katalogów i plików,
get - pobranie pojedynczego pliku z serwera
help - pomoc,
lcd - ustalenie lokalnej lokalizacji zapisu ściąganych plików,
lpwd - sprawdzenie lokalnej lokalizacji zapisu,
ls - wylistowanie zawartości folderu,
mget - pobranie wielu plików z hosta zdalnego,
mkdir - utworzenie katalogu na hoście zdalnym,
mput - wysłanie wielu plików na serwer,
mv - przeniesienie bądź zmiana nazwy plików,
open - nawiązanie sesji z hostem zdalnym,
put - wysłanie pliku na serwer,
pwd - sprawdzenie lokalizacji zapisu pliku,
reget - kontynuacja ściągania pliku,
ren - przeniesienie bądź zmiana nazwy plików,
reput - kontynuacja przesyłania pliku,
rm - usunięcie pliku ze zdalnej stacji roboczej,
rmdir - usunięcie folderu ze zdalnej stacji roboczej.
Prócz narzędzi działających w wierszu poleceń możemy skorzystać z tych opartych o interfejs graficzny. Jednym z takich programów działających pod kontrolą systemu Windows jest WinSCP. Program ten umożliwi nam wykonanie operacji bezpiecznego przesyłania plików z wykorzystaniem SSH (SCP/SFTP). Aplikacja ta jest również klientem FTP.
Po pobraniu narzędzia z strony: https://winscp.net/eng/download.php przechodzimy do jego instalacji (aplikacja dostępna jest również w wersji portable). Po uruchomieniu pliku instalatora będziemy mogli dokonać wyboru przebiegu procesu instalacji - wybieramy: Niestandardowa instalacja
Wybranie opcji pozwoli nam na określenie komponentów (wraz z językiem interfejsu), które zostaną zainstalowane wraz z programem.
Na kolejnym ekranie możemy zdecydować o opcjach dodatkowych takich jak: aktualizacje automatyczne, lokalizacji skrótów czy dodanie katalogu instalacyjnego do zmiennej PATCH (przydatne podczas korzystania z wiersza poleceń gdyż by wywołać dane narzędzie nie musimy znajdować się w katalogu instalacyjnym programu).
Ostatnią decyzją jest określenie stylu interfejsu programu. Możemy wybrać pomiędzy stylem znanym z Eksploratora bądź z takiego narzędzia jak Total Commander.
Po określeniu wszystkich opcji nastąpi instalacja programu.
Po uruchomieniu narzędzia w oknie Zaloguj możemy określić protokół z którego będziemy korzystać.
Połączenie z hostem następuje po podaniu nazwy hosta, portu oraz danych uwierzytelniających.
Wybranie opcji Logowanie spowoduje wykonania połączenia z hostem zdalnym. Podczas nawiązywania pierwszego połączenia będziemy musieli zaakceptować odcisk palca serwera.
Wybranie Tak spowoduje ustanowienie połączenia. Jak widać poniżej sesja z hostem zdalnym została nawiązana.
Po ustanowieniu połączenia oprócz kopiowania plików będziemy mieli możliwość skorzystania z konsoli. Konsola umożliwia nam wydawanie poleceń, które będą wykonywane na hoście zdalnym.
Dodatkowo gdy mamy zainstalowane narzędzie PuTTY możemy je bezpośrednio wywołać z okna programu WinSCP. Po uruchomieniu PuTTY zostanie nawiązana osobna sesja z hostem zdalnym.
WinSCP umożliwia uzyskanie połączenia również z wykorzystaniem mechanizmu opartego o klucz prywatny i publiczny. Jako podsumowanie całego wpisu przyjmijmy o to taki scenariusz iż do połączenia asymetrycznego wykorzystamy parę kluczy wygenerowanych za pomocą narzędzia PuTTYgen. Logowanie na hoście zdalnym zostanie wykonane na koncie luk.
Narzędzie PuTTYgen możemy uruchomić bezpośrednio z poziomu WinSCP (o ile zostało zainstalowane) wybierając po uruchomieniu programu przycisk Narzędzia a następnie Uruchom PuTTYgen. PuTTYgen możemy również pobrać bezpośrednio z sieci.
Po uruchomieniu aplikacji PuTTYgen wybieramy opcję Generate. Domyślne parametry klucza możemy pozostawić bez zmian tj. RSA i długość klucza 2048.
Aby zakończyć generowanie kluczy poruszamy kursorem w obrębie okna uruchomionej aplikacji.
Po wygenerowaniu kluczy, klucz prywatny zabezpieczamy hasłem – punkt 1 a następnie za pomocą przycisku Save public key zapisujemy klucz publiczny – punkt 2. Ostatnią czynnością jaką musimy wykonać to zapis klucza prywatnego, klucz zapisujemy z wykorzystaniem opcji Save private key – punkt 3.
Aby móc zestawić połączenie asymetryczne należy wygenerowany klucz publiczny zapisać w pliku authorized_keys. Klucz prześlemy z wykorzystaniem protokołu SFTP – na tym etapie wykorzystujemy poświadczenia konta luk, należące do użytkownika, którego konto znajduje się na hoście zdalnym.
Przed ustanowieniem połączenia warto w opcjach aplikacji WinSCP włączyć wyświetlanie ukrytych folderów (ponieważ plik authorized_keys jest zapisany w ukrytym folderze .ssh). Włączenie pokazywania ukrytych plików zrealizujemy po przejściu do Ustawień programu WinSCP (aby włączyć ustawienia należy w głównym oknie programu wybrać przycisk Narzędzia a następnie Preferencje) i wybraniu gałęzi Panele. Stosowna opcja znajduje się w sekcji Ogólne.
Po ustanowieniu połączenia plik w którym zapisano wygenerowany klucz publiczny kopiujemy do katalogu .ssh (folder ten powinien znajdować się w katalogu domowym użytkownika luk). W scenariuszu tym kopiowany plik nosi nazwę: klucz_publiczny
Po przekopiowaniu pliku: klucz_publiczny jego zawartość kopiujemy do pliku authorized_keys. Operację tę wykonamy za pomocą znanego już nam polecenia: cat.
Po zapisie klucza publicznego czas by podjąć próbę nawiązania połączenia zdalnego. Testową próbę wykonamy za pomocą narzędzia PuTTY. Po skonfigurowaniu narzędzia jak widać poniżej próba kończy się niepowodzeniem, gdyż serwer odrzucił nasz klucz.
Winą odrzucenia klucza jest format jego zapisu. Aby móc wykorzystać klucz publiczny z narzędziem OpenSSH należy dane zawarte w nim odpowiednio sformatować. Musimy wykonać dwie czynności.
Po otwarciu pliku zawierającego klucz publiczny (dokonujemy tego w dowolnym edytorze tekstu) kasujemy zaznaczone na poniższym zrzucie linie.
Druga czynność jaką musimy wykonać to umieszczenie całości wygenerowanych danych w jednym wierszu poprzez usunięcie znaków końca wiersza (całość klucza musi być zapisana w pojedynczym wierszu) a następnie umieszczeniu na początku wiersza zapisu: ssh-rsa. Tak zmodyfikowany plik należy zapisać a następnie umieścić jego zawartość w pliku authorized_keys.
Tu muszę przyznać się że zamierzony efekt (próba połączenia zakończona sukcesem) da się osiągnąć znacznie łatwiej gdyż już na etapie wygenerowania pary kluczy przez narzędzie PuTTYgen można było uzyskać odpowiedni format klucza publicznego. Wystarczyło przekopiować dane z sekcji Key do pliku tekstowego by w następnym kroku umieścić je w pliku authorized_keys.
Lecz specjalnie wybrałem ścieżkę na okrętkę by pokazać na jakie trudności możemy się natknąć przy próbie konfiguracji połączenia SSH z wykorzystaniem kluczy wygenerowanych za pomocą innych narzędzi.
Po umieszczeniu danych klucza publicznego na serwerze zdalnym możemy przejść do zestawienia sesji SFTP z wykorzystaniem narzędzia WinSCP oraz klucza prywatnego.
Po uruchomieniu WinSCP w pierwszym kroku określamy adres hosta zdalnego (pola Nazwa użytkownika oraz Hasło specjalnie zostały puste – podczas ustanawiania połączenia program poprosi o te dane) – punkt 1. W kroku drugim określamy lokalizację klucza prywatnego (ścieżkę do klucza prywatnego określimy po wybraniu przycisku Zaawansowane a następnie w nowo otwartym oknie w sekcji Parametry identyfikacyjne dostępnej w gałęzi SSH --> Uwierzytelnienie) – punkt 2.
Po konfiguracji narzędzia WinSCP możemy przeprowadzić próbę połączenia. Jak widać poniżej opuszczone parametry musimy podać w trakcie nawiązywania połączenia. Połączenie odbywa się z wykorzystaniem klucza prywatnego. Aby połączenie mogło zostać sfinalizowane podajemy hasło chroniące klucz prywatny.
Wszystko przebiegło po naszej myśli - udało nam się ustanowić sesję SFTP z wykorzystaniem uwierzytelnienia opartego o szyfrowanie asymetryczne.
Konfiguracja systemu Linux odnośnie nawiązywania połączeń zdalnych nie jest trudna a mam nadzieję, że poradnik ten wątpliwości w tej kwestii rozwiewa.
BIBLIOGRAFIA:
SSH Tutorial for Linux - Support Documentation
How can the Telnet service on Ubuntu Server 14.04 LTS be enabled? - Ask Ubuntu
Install and Enable Telnet server in Ubuntu Linux - Ubuntu Sharing
xinetd Configuration Files Fixing “WARNING: UNPROTECTED PRIVATE KEY FILE!” on Linux
Key-Based SSH Logins With PuTTY
Microsoft Word - ANSI_C_Linux_SSH - ANSI_C_Linux_SSH.pdf
SCP copy windows local file to linux remote folder - Server Fault
Komentarze