[#] Użyteczne opcje ssh - praca zdalna

( Ostatnio zmieniony czw., 12/06/2008 - 14:18 )
 

Ssh oferuje oprócz logowania na zdalnej maszynie, inne ciekawe opcje, takie jak bezpieczna praca ze zdalnymi plikami czy też możliwość zautomatyzowanego wykonywania komend na zdalnym komputerze, bez konieczności logowania.

SSH pracuje w trybie klient-serwer. Oznacza to, że na komputerze, do którego chcemy się łączyć, należy zainstalować i wystartować serwer SSH (/etc/init.d/ssh start) oraz, jeśli to konieczne, odblokować na firewallu port 22, z którego domyślnie korzysta protokół SSH. Po tej operacji powinniśmy już móc zalogować się na zdalny serwer, na konto istniejącego na nim użytkownika:

ssh użytkownik@serwer

Jeśli po podaniu hasła pojawił się zmieniony prompt w stylu użytkownik@ser­wer:~$ oznacza to, że jesteśmy już zalogowani na zdalnym serwerze i możemy wykonywać polecenia dokładnie tak, jak robimy to lokalnie w konsoli.

SCP – Bezpieczne kopiowanie

Integralną częścią pakietu SSH jest program SCP (secure copy), służący do bezpiecznego kopiowania plików na zdalny komputer z działającym serwerem SSH oraz ze zdalnego komputera na komputer lokalny. Duet SSH+SCP jest doskonałym zamiennikiem serwera FTP, który jak wiadomo nie grzeszy bezpieczeństwem. W najprostszej postaci, skopiowanie pliku z użyciem SCP sprowadza się do wydania komendy:

scp plik.txt użytkownik@serwer:~/
  • polecenie to skopiuje lokalny plik plik.txt na zdalny serwer o nazwie serwer do katalogu domowego użytkownika użytkownik. Zamiast ~/ możemy podać oczywiście dowolną, inną ścieżkę na zdalnym serwerze, do której mamy dostęp w trybie zapisu, np. /tmp czy /home/public, etc.

Aby skopiować plik ze zdalnego serwera na lokalny komputer również użyjemy programu scp:

scp użytkownik@serwer:~/plik.txt .
  • skopiuje plik plik.txt znajdujący się w katalogu domowym użytkownika użytkownik na komputerze serwer do lokalnego katalogu, w którym aktualnie się znajdujemy.

Inne przydatne opcje SCP:

-r – kopiuje rekursywnie (z podkatalogami) podany katalog,

-P port – używa innego portu niż standardowy 22 (oczywiście używamy tej opcji w przypadku, gdy zdalny serwer SSH nasłuchuje na niestandardowym porcie).

Jeśli nie lubimy trybu konsoli i bardziej odpowiada nam praca w GUI lub trybie pseudo graficznym, możemy skorzystać z graficznego klienta SCP. Funkcję logowania przez SSH zawiera m.in. program Midnight Commander (opcja połączenie przez powłokę). W środowisku Windows możemy skorzystać z programu WinSCP, interfejsem przypominający Total Commandera (do którego zresztą również istnieje wtyczka wspierająca SCP).

SSH bez hasła – generujemy klucze

Jeśli nie chcemy przy każdym połączeniu przez SSH lub próbie skopiowania pliku podawać hasła (co może być uciążliwe) zastosujmy uwierzytelnianie za pomocą kluczy – publicznego i prywatnego.

Zestaw kluczy generujemy lokalnie poleceniem ssh-keygen. Poniżej przykładowy efekt działania komendy generującej klucz asymetryczny typu RSA lub DSA:

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/użytkownik/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/użytkownik/.ssh/id_rsa.
Your public key has been saved in /home/użytkownik/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Przy pytaniu o hasło należy wcisnąć ENTER – utworzony zostanie klucz bezhasłowy. Po wykonaniu tego polecenia, wygenerowane zostały dwa klucze. Klucz prywatny został zapisany w pliku /home/użytkow­nik/.ssh/id_rsa i nie powinniśmy go udostępniać nikomu. Drugi klucz, publiczny, pojawił się w pliku /home/użytkow­nik/.ssh/id_rsa­.pub i ten klucz będziemy mogli pokazać całemu światu.

Abyśmy z naszego lokalnego komputera mogli logować się bez hasła (a jedynie z użyciem klucza) na zdalny serwer musimy już tylko dodać wpis o naszym kluczu publicznym do pliku authorized_keys2 znajdującego się w katalogu ~/.ssh na serwerze zdalnym. Aby to zrobić, wystarczy wykonać poniższe polecenia:

scp /home/użytkownik/.ssh/id_rsa.pub  użytkownik@zdalny_serwer:~/
ssh użytkownik@zdalny_serwer

cat id_rsa.pub >> .ssh/authorized_keys2
chmod 700 .ssh
chmod 600 .ssh/authorized_keys2
rm id_dsa.pub

Trzecie z tych poleceń wykonujemy już oczywiście na zdalnym serwerze. Po tej operacji wszelkie akcje wykonywane na zdalnym serwerze za pośrednictwem SSH nie będą wymagały uwierzytelniania z użyciem hasła, co na pewno znacznie ułatwi nam pracę.

Uwaga: aby również ze zdalnego serwera można było połączyć się z lokalnym komputerem bez hasła, należy wykonać analogiczą, odwrotną operację (wygenerować klucz publiczny i prywatny na serwerze zdalnym i skopiować publiczną część na komputer lokalny). Uwierzytelnianie za pomocą kluczy jest operacją jednostronną, tzn. klucz prywatny można zweryfikować kluczem publicznym, ale nie odwrotnie. Wykonujemy polecenia na zdalnym systemie

Jeśli już umiemy logować się zdalnie bez hasła, to dlaczego nie chcielibyśmy wykonać zdalnie polecenia na serwerze bez konieczności logowanie się na nim? No, przynajmniej ukrywając ten proces. Do czego mogłaby się nam przydać taka funkcjonalność? Na przykład do szybszego kopiowania dużych katalogów zawierających sporą liczbę plików. Komenda:

tar cf - ./* | ssh użytkownik@zdalny_serwer 'cd /tmp; tar xf -';\
 date ;  play /usr/share/sounds/gaim/arrive.wav;

spowoduje utworzenie archiwum zawierającego wszystkie pliki z lokalnego katalogu i przesłanie go nie do pliku, lecz bezpośrednio na zdalny serwer. Następnie, na zdalnym serwerze pliki są “w locie” wyodrębniane z archiwum i zapisywane do katalogu /tmp. Na koniec na lokalnym komputerze odtwarzany jest dźwięk informujący o wykonaniu zadania. Zysk spowodowany kopiowaniem jednego pliku zamiast kilkuset jest różny, ale prawie zawsze znaczący. Przy testowanych 217 MB danych z katalogu domowego (głównie małe pliki) kopiowanie danych w ramach sieci lokalnej przy pomocy strumienia przesyłanego z użyciem kombinacji TAR i SSH było prawie 3 razy szybsze niż tradycyjne rekursywne kopiowanie z użyciem SCP (wyniki odpowiednio: 1,5 minuty i 4,5 minuty).

Jak się okazało, gdy serwer zdalny znajduje się w sieci lokalnej, kompresja przesyłanego strumienia danych jest bezcelowa. Kompresja z użyciem Gzip okazała się wprawdzie nieco bardziej wydajna niż czysta archiwizacja, ale tylko nieznacznie, podczas gdy kompresja Bzip2 (wydajniejsza jeśli chodzi o rozmiar docelowego pliku, lecz wolniejsza) zupełnie nie nadaje się do tego rodzaju operacji. Oczywiście, jeśli serwer, na który chcemy skopiować dane znajduje się w innej sieci, kompresja może okazać się bardziej celowa.

X11 forwarding – uruchamiamy zdalnie aplikacje graficzne

Do nieznanych często funkcji SSH należy przekazywanie w sieci sesji protokołu X, dzięki czemu uruchomić możemy praktycznie każdy program graficzny na zdalnym komputerze. Wystarczy połączyć się ze zdalnym komputerem z opcją -X:

ssh -X user@serwer

a każde polecenie wymagające sesji X będzie korzystać z tej znajdującej się na lokalnym komputerze, z którego uruchomiliśmy połączenie. Możemy na stałe włączyć opcję X11 Forwarding, edytując plik /etc/ssh/ssh_config (opcja ForwardX11 yes). Aby opcja ta zadziałała, przekazywanie X11 musi być włączone również po stronie serwera (plik /etc/ssh/sshd_c­onfig). Domyślna wartość różni się w zależności od dystrybucji Linuksa.

Oczywiście, możemy również uruchomić program za pomocą jednego polecenia, podając je pomiędzy dwoma apostrofami, np:

ssh -X user@serwer 'firefox'

Możliwe że opcja -Y będzie bardziej użyteczna. „man ssh“

W zależności od lokalnej konfiguracji serwera X, może okazać się niezbędna autoryzacja zewnętrznych połączeń, przy pomocy komendy xhost. Przykładowo, polecenie xhost + zaakceptuje chwilowo wszelkie zewnętrzne aplikacje. Jeśli planujemy korzystać z tej opcji na stałe, zalecana jest naturalnie bardziej bezpieczna konfiguracja serwera X.

Oczywiście szybkość działania aplikacji graficznych odpalanych przez SSH bardzo zależy od przepustowości naszego oraz zdalnego połączenia internetowego. Przy łączu typu DSL bez problemu możemy uruchamiać nawet dość wymagające aplikacje, jak Skype czy Thunderbird.

SSHFS – Montujemy zdalny katalog

Praca na zdalnym serwerze za pomocą SSH może być nieco uciążliwa, zwłaszcza jeśli często musimy kopiować różne pliki w obu kierunkach. Wykorzystanie protokołu fish:// z Midnight Commandera czy Konquerora jest połowicznym rozwiązaniem – fish bywa zawodny, a także jest zdecydowanie wolniejszy niż dostęp przez czyste SSH. Idealnym rozwiązaniem byłaby możliwość montowania zdalnych zasobów dostępnych przez SSH. Od pewnego czasu możliwość taka istnieje dzięki kombinacji sshfs oraz fuse.

Fuse to moduł do jądra Linux (od niedawna znajduje się on już w podstawowej wersji jądra 2.6) pozwalający na montowanie systemów plików przez użytkownika nie posiadającego praw roota. Sshfs to program tworzony przez autora fuse, umożliwiający montowanie zdalnych zasobów poprzez SSH. Filozofia jest bardzo prosta – zasób SSH montowany jest w lokalnym katalogu. Od momentu zamontowania możemy wykonywać na nim prawie wszystkie operacje, dokładnie tak jakby był to katalog dostępny lokalnie.

Instalacja fuse i sshfs:

sudo apt-get install sshfs fuse

Następnie należy dodać swojego użytkownika do grupy fuse np. komendą:

usermod -a -G fuse użytkownik

lub edytując plik /etc/group

UWAGA! : opcja usermod -G grupa,[…] (bez -a)
Lista dodatkowych grup, do których również należy użytkownik. Każda grupa oddzielona jest od następnej przecinkiem, bez wtrąconej spacji. Do grup odnoszą się te same ograniczenia, które obowiązują przy grupie podanej w opcji -g.
**Jeżeli użytkownik jest obecnie członkiem grupy, której nie podano na liście, to zostanie z niej usunięty.
** ZASTOSUJ ARGUMENT „-a“ ! pozwoli to dodać użytkownika do grupy bez usuwania z istniejących grup.

Należy jeszcze załadować moduł fuse:

sudo modprobe fuse

Po przelogowaniu w konsoli możemy już spróbować zamontować zdalny katalog z użyciem sshfs:

mkdir ~/zdalny_serwer
sshfs użytkownik@zdalny_serwer:/tmp ~/zdalny_serwer

Powyższa komenda spowoduje zamontowanie katalogu /tmp na zdalnym serwerze w katalogu ~/zdalny_serwer. Skopiowanie jakiegoś pliku do tego katalogu spowoduje przezroczysty transfer tego pliku do katalogu domowego użytkownika na zdalnym serwerze. Podobny efekt będą miały inne operacje, jak tworzenie/usu­wanie/edycja plików, nadawanie praw, etc.

Po zakończeniu pracy możemy odmontować katalog poleceniem:

fusermount -u ~/zdalny_serwer

Nic nie stoi na przeszkodzie, żeby dodać wpis o montowaniu przez sshfs do pliku /etc/fstab
w celu automatycznego montowania podczas startu systemu.

sshfs#użytkownik@zdalny_serwer:/tmp    \
/home/użytkownik/zdalny_serwer/    fuse    defaults    0 0

Przedtem wypada również dodać do pliku /etc/modules wpis dotyczący modułu fuse. W innym wypadku katalog zdalny nie zamontuje się.

Tunel zwrotny SSH

Często jest potrzeba do dostania się maszyny „schowanej“ za bramką internetową. W przypadku rozwiązań typu NAT lub Masquarading, bezpośrednie połączenie się ze schowanym komputerem z zewnątrz nie jest możliwe. Możliwa jest natomiast inicjalizacja połączenia ssh z docelowego komputera i zalogowanie się na niego przez tak zwany tunel zwrotny.

Tunel ten tworzymy wywołując na docelowym komputerze następujące polecenie:

ssh user@server -R 7777:localhost:22

Podany numer portu – 7777 – jest przykładowy. Może być to dowolny numer portu nieużywany na komputerze server. Takie polecenie spowoduje utworzenie tunelu zwrotnego – na docelowy komputer można się zalogować z komputera server przez wydanie polecenia:

ssh localhost -p 7777

Jeżeli tunel ma być aktywny przez dłuższy czas, warto uruchamiając tunel podać dodatkowe polecenie, którego aktywność zabezpieczy przez zerwaniem połączenia uznanego za nieużywane. Przykładowo:

ssh user@server -R 7777:localhost:22 "/bin/sh -c 'while true; do sleep 5; \
echo +; done'"

Jeszcze lepszym rozwiązeniem jest użycie programu autossh. Program ten pozwala na uruchomienie tunelu z wykorzystaniem dodatkowego portu monitorującego – zerwane lub zablokowane połączenia są automatycznie wznawiane. Przykładowe wywołanie autossh mogłoby wyglądać następująco:

Instalacja autossh:

sudo apt-get install autossh

Użycie:

autossh -fN -M 7778 -R 7777:localhost:22 user@server

Opcja -f powoduje przejście autossh w tło, opcja -N jest przekazywana do ssh – zakazuje wykonywania komend – tylko przekierowywanie portów (zwiększa to bezpieczeństwo). Numer portu do monitorowania, tu przykładowo 7778, może być również dowolny, ale unikalny.

Oczywiście pozostaje problem, jak na docelowym komputerze, który jest niedostępny, uruchomić tunel. Możemy podyktować odpowiednie polecenie przez telefon, ale na dłuższą metę warto dodać albo odpowiednie wywołanie ssh np. do crontaba, albo uruchomienie autossh przez skrypty startowe systemu.

Zobacz także:

„http://ni.re­coverydata.pl/con­tent/automatyc­zna-administracja-serwerami-przez-ssh“

http://www.sshkeychain.org/…s-HOWTO.html#toc6

http://www.linuxfocus.org/…cle278.shtml

http://www.szarp.com.pl/…tml/ssh.html

Opracowane na podstawie: http://jakilinux.org/…uczki-z-ssh/

Twoja ocena: Brak Średnio: 5 (2 głosy)

Odpowiedzi : 3

Ostatni komentarz : pt., 11/02/2011 - 02:37

Mam problem z uruchomienie logowania bez hasła w skrypcie. Jeśli próbuje uruchomić skrypt pod root to muszę podawać hasło usera zdalnego. Natomiast jeśli najpierw przeloguję się na usera tego samego co zdalny to skrypt odpala się bez żądania o hasło i pobiera spakowany plik.
Polecenie użyte w skrypcie:
scp backup@192.168.11.7:~plik /katalog_docelowy
Co jest nie tak?
Jeśli w skrypcie dam najpierw su - backup, to nic się nie dzieje i dopiero jak wpiszę exit w konsoli to skrypt rusza tylko, że żąda hasła do połączenia zdalnego. Czemu spod użytkownika root nie można zalogować się na użytkownika backup bez hasła?

Bo nie możesz się zalogować bez hasła na usera z innej maszyny. Gdyby tak było mógłbyś się zalogować na DOWOLNEGO usera na DOWOLNEJ maszynie. Wystarczyłoby jedynie mieć jakiegoś linuksa z rootem.

dziękuje .Jest bardzo fajnie.

Dodaj nową odpowiedź

Informacja:

Osoby zamieszczające wypowiedzi naruszające prawo lub prawem chronione dobra osób trzecich, mogą ponieść z tego tytułu odpowiedzialność karną lub cywilną. Upewnij się, że twoja wypowiedź nie godzi w niczyje mienie.

  • Internal paths in single or double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or path. Paths to files in single or double quotes, written as "files:somefile.ext", for example, are replaced with the appropriate URL that can be used to download the file.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <strong> <blockquote> <code>
  • Znaki końca linii i akapitu dodawane są automatycznie.

Więcej informacji na temat formatowania

Łapirobot
Proszę odpowiedzieć
a
5
Q
D
w
z
s
p
T
N
Enter the code without spaces and pay attention to upper/lower case.