Zabawa w SSHowanego

Transkrypt

Zabawa w SSHowanego
Rozwiązania
Zabawa w SSHowanego
Zabawa
w SSHowanego
Wojciech Terlikowski
[email protected]
W czasach gdy niemal każdy komputer podłączony jest do sieci, czy to niewielkiej domowej
lub osiedlowej, czy też do Internetu niesłychanie ważnym zagadnieniem staje się zapewnienie
bezpieczeństwa komunikacji między stacjami roboczymi. Protokół SSH, dzięki silnej ochronie
kryptograficznej, znakomicie się do tego nadaje. Artykuł ma na celu przybliżenie czytelnikowi
szerokich możliwości oferowanych przez SSH również w mniej znanych zastosowaniach takich jak
przekierowanie portów i tworzenie tuneli.
Z
SSH zetknął się chyba każdy, kto pracował z
systemami linuksowymi. Bezpieczna powłoka (secure shell) towarzyszy większości administratorów w wykonywaniu codziennych
obowiązków, jest również niezastąpiona dla wielu użytkowników wszędzie tam, gdzie szybko i sprawnie trzeba
wykonać jakieś czynności na zdalnym systemie, a jednocześnie mieć poczucie bezpieczeństwa jakie daje szyfrowany protokół.
Szyfrowany telnet
innymi przez SSH jest brak szyfrowania transmisji, szczególnie dotkliwy podczas procesu uwierzytelniania.
Taka luka bezpieczeństwa pozwala na podsłuchanie sesji i zdobycie informacji nie tylko o tym jakie polecenia wykonujemy na zdalnym systemie, ale również poznanie naszego loginu i hasła, co może w konsekwencji prowadzić do
przejęcia kontroli nad naszym kontem. Przeprowadzenie takiego ataku nie wymaga głębokiej wiedzy ani bardzo skomplikowanych narzędzi. Wystarczy prosty program podsłuchujący ruch w sieci (sniffer) jakich wiele bezpłatnych można znaleźć w Internecie. Używanie telnetu było do zaakceptowania w sieciach, których użytkownicy mieli do siebie dużo zaufania i nie obawiali się, że ktoś będzie chciał się włamać do ich komputera. Pamiętam, że jeszcze na początku
studiów do niektórych serwerów wydziałowych mieliśmy
dostęp przez telnet, ale z czasem był on zastępowany przez
SSH. Wówczas była to jeszcze nowość, ale dająca więcej
bezpieczeństwa, bo szyfrowana.
Kiedy po raz pierwszy miałem okazję korzystać z zasobów Internetu, jeszcze w latach dziewięćdziesiątych ubiegłego stulecia, do zalogowania się na zdalne serwery używałem telnetu.
Jest to proste narzędzie, pozwalające na otwarcie sesji
na innym komputerze w sieci. Połączenie do serwera telnetu umożliwia wykonywanie poleceń na zdalnym systemie. Rozwiązanie to ma jednak wadę, która zadecydowała
o jego niemal całkowitym zaniku, przynajmniej w środowi- Trochę historii
skach uniksowych i uniksopodobnych, w tym w Linuksie. Protokół SSH został opracowany w połowie lat dziewięćSłabością, która zadecydowała o wyparciu telnetu między dziesiątych na Politechnice w Helsinkach przez jednego z
42
styczeń 2010
Rozwiązania
Zabawa w SSHowanego
pracowników naukowych – Tatu Ylönena jako
odpowiedź na atak, polegający na podsłuchaniu
i przechwyceniu haseł przesyłanych przez protokoły nieszyfrowane. Celem projektu było zastąpienie narzędzi takich jak telent, rlogin i rsh
przez rozwiązania podobne, ale zapewniające
wyższy stopień bezpieczeństwa dzięki ochronie kryptograficznej. Po piętnastu latach możemy powiedzieć, że niewielu linuksowym administratorom zdarza się wykorzystywać rlogin,
czy rsh, są pewnie i tacy, którzy nie wiedzą,
że coś takiego istniało, natomiast niemal wszyscy znają SSH.
Kilka lat po opracowaniu pierwszej wersji protokołu powstała, najpopularniejsza
obecnie, implementacja zarówno serwera jak
i klienta – OpenSSH. Projekt ten jest rozwijany przez zespół OpenBSD na licencji BSD.
Wolna licencja jak również bogactwo możliwości jakie daje OpenSSH, pozostając w pełnej zgodności ze specyfikacją protokołu, zapewniły tej implementacji dużą popularność.
Obecnie OpenSSH jest wykorzystywane przez
wiele systemów operacyjnych jak Sun Solaris,
Mac OS X, BSD, Novell Netware, IBM AIX,
HP UX, urządzenia sieciowe Cisco, Juniper,
HP, Dell, Alcatel oraz niemal wszystkie dystrybucje Linuksa.
Niedawno ukazała się nowa wersja
OpenSSH 5.3. Chociaż nie wnosi ona znacznych zmian do programu, to ma znaczenie historyczne, ponieważ została wydana dziesięć
lat po powstaniu projektu i publikacji pierwszej wersji produktu.
Podczas instalacji serwera warto zwrócić uwagę na moment przedstawiony na Rysunku 2
Metody generowania kluczy i kryptografia
asymetryczna mogą być temetem osobnego artykułu, tu skupię się na kwestiach najistotniejszych
dla użytkownika. Przede wszystkim, klucz prywatny jest tajny i może być znany tylko właścicielowi, w tym wypadku serwerowi SSH. Klucz
publiczny jest jawny, ale stanowi parę do prywatnego i dlatego oba muszą być wygenerowane razem. W związku z tym klucze nie mogą być dostarczane z pakietem oprogramowania, jak na
przykład plik z domyślną konfiguracją, ale trzeba je wygenerować każdorazowo podczas instalacji programu. Ponowna instalacja OpenSSH,
związana np. ze zmianą dystrybucji, spowoduje,
że powstanie nowa para kluczy. Spowoduje to,
że odciski palca (fingerprints) serwera zapamiętane przez klientów staną się niekatulane i będzie
je trzeba zaktualizować.
Po pomyślnie zakończonej instalacji przystępujemy do konfiguracji serwera
OpenSSH. Będziemy modyfikować prosty,
tekstowy plik z konfiguracją: /etc/ssh/sshd_
config. Bezpieczeństwo wymaga, aby serwer
używał protokołu w wersji drugiej (SSH-2).
Zapewnia to wpis Protocol 2. W pierwotnej
specyfikacji wykryto poważne luki bezpieczeństwa, dlatego została zastąpiona przez
SSH-2. Wersja druga nie tylko jest bezpieczniejsza od SSH-1, ale dodaje do protokołu nowe możliwości. Wspierają ją wszystkie współczesne klienty SSH. Obie wersje
nie są ze sobą kompatybilne i czasami trzeba
w kliencie wymusić użycie SSH-1 jeśli będziemy chcieli połączyć się z serwerem, który nie wspiera SSH-2. Na szczęście takich
serwerów jest coraz mniej.
Drugą opcją konfiguracyjną, którą zmienimyna serwerze jest wyłączenie możliwości logowania na konto roota. W tym celu wystarczy
wpis PermitRootLogin no. W dalszym ciągu
możemy wykonywać czynności administracyjne logując się przez SSH na konto zwykłe-
Zabawa się rozpoczyna
Jak wspomniałem, OpenSSH jest dostępne
w repozytoriach niemal każdej dystrybucji Li- Rysunek 1. Popularność różnych implementacji ssh od czasu pojawienia się OpenSSH. Wyraźnie widać,
nuksa, więc zainstalowanie go nie stanowi żad- że OpenSSH z ponad 80% udziałem jest zdecydowanie najczęściej używaną implementacją. Źródło: [3]
nego problemu. SSH to program sieciowy dlatego do przetestowania go potrzebować będziemy
sieci komputerowej, a w najprostszym przypadku dwóch komputerów. Jeden z nich posłuży za
serwer SSH, nazwijmy go bolek, drugi to komputer biurkowy – lolek, na którym zainstalujemy
klienta SSH. Z tej maszyny będziemy się logować do bolka. Oba komputery pracują pod kontrolą dystrybucji Debian GNU/Linux dlatego by
zainstalować serwer OpenSSH należy wykonać
na bolku:
jas@bolek$ sudo aptitude install
openssh-server
natomiast na lolku instalujemy klienta poleceniem:
jan@lolek$ sudo aptitude install
openssh-client
Rysunek 2. Instalacja serwera OpenSSH. Widoczny moment generowania kluczy kryptograficznych
www.lpmagazine.org
43
Rozwiązania
Zabawa w SSHowanego
go użytkownika, a następnie uzyskując uprawnienia roota poprzez skorzystanie z polecenia
su - lub odpowiednio skonfigurowanego pakietu sudo. Takie ograniczenie wydaje się niepotrzebnym utrudnieniem dla użytkowników
sieci lokalnych, ale jest bezwzględnie zalecane jeżeli serwer ma być dostępny z Internetu. Potwierdzają to moje własne doświadczenia. Zdarzyło mi się, że w kilka minut po podłączeniu nowego serwera do Internetu znalazłem w dzienniku systemowym ślady dziesiątek nieudanych prób zalogowania przez SSH
na konto roota podejmowanych przez komputery z całego świata. Gdybym nie zablokował
tej możliwości, przypuszczalnie musiałbym
Teraz możemy połączyć się przez lolka
odłączyć komputer od Sieci i zacząć usuwać z serwerem SSH bolek. Robimy to wydając
skutki włamania.
polecenie:
Po takich zmianach ustawień należy zrestartować usługę ssh:
jan@lolek$ ssh jas@bolek
jas@bolek$ sudo /etc/init.d/ssh
Domyślna konfiguracja klienta jest wystarczająca, ale w razie potrzeby można ją zmienić
modyfikując plik /etc/ssh/ssh_config na komputerze lolek. Podobnie jak na serwerze jest to
prosty plik tekstowy.
Rysunek 3. Połączenie do SSH po zmianie odcisku palca. Po usunięciu wpisu z ~/.ssh/known_hosts znów
jesteśmy proszeni o potwierdzenie tożsamości serwera
Rysunek 4. Przykład zastosowania ssh do tunelowania X11. Gra Kmahjongg uruchomiona na zdalnym
serwerze
44
lub:
restart
styczeń 2010
jan@lolek$ ssh bolek -l jas
gdzie bolek jest serwerem, na który się logujemy, natomiast jas to identyfikator użytkownika na tym serwerze. Zamiast nazwy komputera
(hostname) można podać jego adres IP lub pełną nazwę domenową np. bolek.example.com,
co jest konieczne gdy komputer znajduje się
w Internecie w zupełnie innej domenie niż nasza. Jeśli na obu systemach używamy tego samego loginu można go nie podawać przy nawiązaniu połączenia, wtedy SSH zaloguje nas
na konto o takiej samej nazwie jak lokalne.
Jeśli pierwszy raz łączymy się do serwera, SSH wyświetli odcisk palca (patrz rys. 3)
i zapyta czy na pewno na tej maszynie chcemy otworzyć sesję. Po potwierdzeniu tożsamości serwera zostaniemy zapytani o hasło na
komputerze bolek, a jego odcisk palca zostanie zapisany w pliku ~/.ssh/known_hosts. Od
tej pory, jeśli serwer zmieni odcisk zostaniemy o tym poinformowani przy próbie logowania (patrz Rysunek 3). Sytuacja taka następuje gdy serwer został zastąpiony nową maszyną, lub gdy nastąpiła reinstalacja systemu,
w tym pakietu OpenSSH. Zazwyczaj administratorzy powiadomią nas wcześniej o takim zdarzeniu. Jeśli mamy pewność, że odcisk
faktycznie się zmienił i łączymy się z właściwym komputerem należy usunąć linijkę z pliku ~/.ssh/known_hosts o numerze podanym w
komunikacie. W naszym przypadku jest to linia numer 7. Przy kolejnej próbie logowania
zostaniemy poproszeni o akceptację odcisku
palca nowego klucza.
Po poprawnym zalogowaniu możemy
pracować na serwerze bolek, wydając polecenia jakbyśmy mieli otwartą lokalną konsolę. Sesję kończymy komendą exit lub skrótem klawiszowym [Ctrl+D] tak samo jak
w przypadku pracy lokalnej.
Czy używanie ssh jest równie wygodne
jak praca lokalna? A co z aplikacjami graficznymi? Spróbujmy uruchomić grę Kmahjongg.
Niestety, próba zakończy się wyświetleniem komunikatu błędu cannot connect to X server, co oznacza , że serwer X nie znalazł odpowiedniego miejsca do wyświetlenia graficznego
okienka gry. Nie wyświetli go w tekstowej konsoli, w której działa ssh, może jednak wykorzystać do tego graficzny pulpit komputera lolek.
Rozwiązania
Zabawa w SSHowanego
Taki efekt można osiągnąć przez odpowiednią
konfigurację X11, tak by programy uruchamiane na bolku były wyświetlane na ekranie lolka.
Można również wykorzystać do tego SSH. Protokół ten, daje możliwość przekierowania X11
(X11 forwarding), z której skorzystamy. Wystarczy rozpocząć nową sesję SSH dodając
przy uruchamianiu przełącznik -X:
kładanych przez protokół X, czasem użycie
tej opcji może okazać się konieczne. Jeśli zachodzi potrzeba uruchomienia wielu programów graficznych na zdalnym komputerze, to
wartym rozważenia rozwiązaniem jest VLC.
Za jego pomocą można udostępnić cały graficzny pulpit klientowi usługi. W wielu przypadkach może to okazać się wygodniejsze
i bardziej efektywne od zastosowania przejan@lolek$ ssh -X bolek -l jas
kierowania X. SSH jest wciąż bardzo popularną i często jedyną tego typu usługą dostępOperacja taka ustawia przekierowanie X11 ną na serwerze.
na klienta SSH i sprawia, że programy graficzne działające na bolku będą wyświetla- Nie tylko zdalna sesja
ły swe okna na lolku. Starujemy ponownie Poznaliśmy już możliwości protokołu SSH
kmahjongg:
związane z pracą na zdalnym systemie, ale
co zrobić gdy chcemy przenieść pliki z jednejas@bolek$ kmahjongg &
go komputera na drugi? W przypadku plików
tekstowych można je skopiować do schowDodanie znaku &, powoduje uruchomienie ka i wkleić do edytora otwartego na zdalgry w tle, tak by nie blokować dostępu do nym komputerze. Może to być nawet wykonsoli na bolku. Po chwili na ekranie kom- godne dopóki nie pojawi się konieczność
putera lolek pojawi się się okienko Kmah- kopiowania dużych plików, lub zbiorów bijongg. Inną opcją, pozwalającą na przekiero- narnych. Rodzina protokołów RSH miała w
wanie X11 jest -Y, tak zwane zaufane prze- tym celu RCP, którego używało się podobkierowanie X (trusted X forwarding). Jest nie jak zwykłego kopiowania plików poleceono mniej bezpieczne, ponieważ nie spełnia niem cp. Ponadto istnieje protokół FTP, słuwszystkich standardów bezpieczeństwa na- żący do transferowania plików między komputerami w sieci, jednak żaden z nich nie szyListing 1. Przykładowy skrypt zmieniający konfifruje transmisji. Na szczęście w rodzinie progurację wielu serwerów za pomocą SSH
tokołów SSH znalazły się ich odpowiedniki:
SCP – bezpieczne kopiowanie (secure copy)
for SERVER in bolek reksio uszatek
i SFTP – bezpieczny protokół transferu plikoralgol
ków (secure file transfer protocol). Tego drudo
giego nie należy mylić z FTPS – rozszerzessh jas@$SERVER 'echo
niem FTP. Zarówno SCP jak i SFTP są szynameserver 10.12.15.254 > /etc/
frowane i zapewniają takie samo bezpieczeńresolv.conf'
stwo transmisji jak SSH. Oba są dostarczadone
ne z OpenSSH, więc żeby z nich korzystać
nie musimy niczego instalować dodatkowo.
Listing 2. Generowanie kluczy kryptograficz-
Polecenia scp używamy podobnie jak zwykłego cp:
jan@lolek$ scp jas.jpeg jas@bolek:
/tmp/
Jak widać na przykładzie różnicą jest człon jas@bolek: wskazujący, że kopiowanie ma odbywać się do katalogu na serwerze bolek z uprawnieniami użytkownika jas. Należy zwrócić
uwagę na dwukropek (:) rozdzielający część
sieciową od ścieżki w systemie plików. Jeśli chcemy skopiować plik w przeciwną stronę
z serwera bolek na komputer lolek, robimy to
poleceniem:
jan@lolek$ scp jas@bolek:/tmp/
obraz.png ./obrazek.png
Spowoduje to skopiowanie pliku /tmp/
obraz.png do bieżącego katalogu i nadanie mu
nazwy obraz.png. Jedną z bardziej użytecznych opcji używanych z scp jest -r. Pozwala
ona na rekurencyjne skopiowanie całego katalogu wraz z zawartością. Polecenie:
jan@lolek$ scp -r jas@bolek:/etc/ ./
skopiuje całą zawartość katalogu /etc na serwerze bolek do bieżącego katalogu. Składnia
scp dopuszcza również użycie znaków specjalnych powłoki np.:
jan@lolek$ scp jas@bolek:~/zdjecia/
*.jpeg ~/
skopiuje wszystkie pliki o rozszerzeniu jpeg
(*.jpeg) z katalogu zdjecia do katalogu domowego lokalnego użytkownika. Symbole występujące w ścieżkach serwera są interpretowane
nych wykorzystywanych do autoryzacji w SSH
jan@lolek$ ssh-keygen
Generating public/private rsa key
pair.
Enter file in which to save the key
(/home/jan/.ssh/id_rsa):
Created directory '/home/jan/
.ssh'.
Enter passphrase (empty for no
passphrase):
Enter same passphrase again:
Your identification has been saved
in /home/jan/.ssh/id_rsa.
Your public key has been saved in
/home/jan/.ssh/id_rsa.pub.
The key fingerprint is:
2d:4f:15:7b:60:51:66:ac:5b:90:32:
58:83:a1:b4:28 jas@lolek
Rysunek 5. Okno programu gftp z otwartą sesją SSH
www.lpmagazine.org
45
Rozwiązania
Zabawa w SSHowanego
przez jego powłokę nie przez scp. W wyniku
czego skrypt, korzystający z takich symboli będzie działał różnie z różnymi maszynami w zależności od tego jaki system pracuje po stronie
serwera i jakiej powłoki używa. Takiego uzależnienia od platformy nie ma drugi z wymienionych protokołów służących do kopiowania
plików. SFTP, bo o nim mowa, pozwala na interaktywną pracę na zdalnym systemie plików
podobnie jak FTP. Logujemy się poleceniem:
jan@lolek$ sftp jas@bolek
a następnie za pomocą poleceń takich jak get i
put możemy kopiować pliki z i na serwer. Jeśli
ktoś preferuje pracę w środowisku graficznym
to może skorzystać z jednej z wielu graficznych
nakładek na SFTP takich jak gftp czy WinSCP.
śli uda się napisać skrypt, który wykona za nas
chociaż część żmudnej pracy to zaoszczędzony czas możemy poświęcić na przyjemniejsze
zajęcia, na przykład czytanie ostatniego numeru Linux+. Przypuśćmy, że administrujemy
siecią, w której właśnie zmienił się adres serwera DNS. Nowy adres to 10.12.15.254. Musimy teraz zmienić konfigurację wszystkich
serwerów w sieci, modyfikując zawartość pliku /etc/resolv.conf. Jeśli są to trzy serwery to
można zalogować się na każdy z nich osobno i
ręcznie wykonać polecenie:
echo 'nameserver 10.12.15.254' >
/etc/resolv.conf
Kiedy będzie ich kilkadziesiąt to zadanie takie
staje się żmudne i czasochłonne. Ponadto nie
trudno tu o pomyłkę. Z pomocą w takiej syUżycie SSH w skryptach
tuacji przychodzi nam SSH. Pozwala ono na
W pracy administratora (i nie tylko) bardzo li- wykonanie polecenia w trybie wsadowym, bez
czy się umiejętność automatyzacji zadań. Je- otwierania interaktywnej sesji, a po zakończe��������
������
��������
������
�������
���������
������
����������
������������������
���
���������������������
�������������
����
Rysunek 6. Zastosowanie odwrotnego tunelu SSH do połączenia do serwera znajdującego się za zaporą ogniową
niu powraca do powłoki klienta, z której zostało wywołane.
jan@lolek$ ssh jas@bolek 'echo
nameserver 10.12.15.254 > /etc/
resolv.conf'
Takie polecenie powoduje wywołanie komendy
echo na serwerze bolek z przekierowaniem wyjścia do pliku /etc/resolv.conf na tymże serwerze,
a następnie powrót do powłoki na lolku. W rezultacie zawartość pliku /etc/resolv.conf zostanie
zmieniona na nameserver 10.12.15.254, czyli to co chcieliśmy osiągnąć. Teraz wystarczy wywołać skrypt dla każdego z naszych serwerów i
rekonfiguracja gotowa.
Bardzo wygodne, prawda? Jednak skrypt
nie działa tak sprawnie jak byśmy sobie tego
życzyli, ponieważ przy logowaniu do każdego z serwerów trzeba podawać hasło. I na to
jest rada. Uwierzytelnienie przez podanie hasła nie jest jedyną możliwością w SSH. Istnieje wariant logowania przez klucz publiczny (public key) oraz za pomocą GSSAPI. To
ostatnie pozwala na zarządzanie autoryzacją
w SSH za pośrednictwem zewnętrznych mechanizmów, takich jak Kerberos. Skupmy się
na metodzie klucza publicznego, ponieważ jest
prosta i nie wymaga od nas używania dodatkowego oprogramowania. Najpierw musimy mieć
parę kluczy, która będzie identyfikować naszego klienta, czyli użytkownika jan na komputerze lolek, logującego się na konto jaś na komputer bolek. Do generowania kluczy użyjemy
programu ssh-keygen dostarczanego razem
z OpenSSH. Hasło (paraphrase) do klucza pozostawiamy puste.
Następnie kopiujemy wygenerowany
klucz publiczny do pliku .ssh/authorized_keys
w katalogu domowym użytkownika, na którego będziemy się logować na serwerze bolek.
jan@lolek$ ssh jas@bolek 'mkdir ~/
.ssh/'
jan@lolek$ scp ~/.ssh/id_rsa.pub
jas@bolek:~/.ssh/authorized_keys
Przy wykonywaniu polecenia scp po raz ostatni podajemy hasło. Następne logowanie do
bolka będzie możliwe już bez hasła. Dzięki temu możemy wykonać skrypt sprawniej,
gdyż nie będzie wymagał od nas ingerencji
i podawania haseł.
Bardzo pomocne przy administrowaniu
komputerem, są potoki (pipes). Dzięki nim
możemy łączyć możliwości wielu niedużych
programów jak na przykład cat, grep czy wc
w skomplikowane narzędzia. W SSH również
nie mogło zabraknąć obsługi potoków. Załóż-
Rysunek 7. Konfiguracja Firefoksa do użycia serwera pośredniczącego
46
styczeń 2010
Rozwiązania
Zabawa w SSHowanego
my, że uruchamiamy program i chcemy, by
wszystkie jego krytyczne komunikaty (zaczynające się od ERROR:) były zapisywane na zdalnym serwerze. Rejestrowanie zdarzeń z krytycznych usług na innych komputerach jest dobrą praktyką bezpieczeństwa. Bardziej zaawansowane konfiguracje można osiągnąć za pomocą demona syslog. W tym momencie wystarczy
nam proste użycie SSH.
Przy użyciu potoków łączymy funkcjonalności
programu grep, który wybiera tylko interesujące nas komunikaty ssh, zapewniającego transfer logów na inny serwer i cat, zapisującego je
do pliku logów.
Kopię zapasową serwisu www można wykonać poleceniem:
den z zainstalowanym tam klientów konsolowych. Na dłuższą metę okaże się to niezbyt wygodne. Uciążliwa będzie na przykład obsługa załączników, wymagająca przesyłania plików między serwerem a komputerem domowym. Do zastosowania wygodniejszego rozwiązania, wykorzystującego przekierowanie portów SSH, potrzebna nam będzie podstawowa wiedza na temat konfiguracji protokołów pocztowych. Wystarczy wiedzieć, na którym porcie słucha tunelowana usługa. Najprostszym źródłem informacji na ten temat jest plik /etc/services. Można dowiedzieć się z niego, że protokołowi POP3 odpowiada port 110, zaś SMTP – 25. W przykładach
z tunelami połączenia SSH będą nawiązywane w
obie strony – również do naszego komputera domowego, więc przyda się zainstalowanie na nim
serwera OpenSSH.
Polecenie pozwalające na zabezpieczenie transmisji SMTP będzie wyglądało następująco:
jan@lolek$ tar -czf - /var/www/* |
jan@lolek$ ssh [email protected]
ssh jas@bolek 'cat > ~/backup/backup_
ia.edu.pl
jan@lolek$ ./skrypt.sh | grep
'^ERROR:' | ssh jas@bolek 'cat >>
/var/log/skrypt.log'
www.tar.gz'
Alternatywnym rozwiązaniem jest spakowanie
plików lokalnie, a następnie przesłanie paczki
za pomocą SCP. Wersja z użyciem potoku jest
jednak bardziej elegancka i oszczędza nam zamieszania z tymczasowym plikiem archiwum.
Istnieje również opcja OpenSSH, pozwalająca na kompresję przesyłanego strumienia danych. Włącza się ją za pomocą przełącznika
-C. W czasach rozpowszechnienia sieci szerokopasmowych nie jest to często używana opcja,
ale niekiedy może usprawnić pracę. Zwłaszcza
wtedy, gdy trzeba będzie przesyłać dobrze kompresujące się dane, np. pliki tekstowe, przez sieć
o niedużej przepustowości.
Wchodzimy w tunel
Tunele sieciowe są potężnym i bardzo wygodnym narzędziem, dzięki któremu można zabezpieczyć transmisję protokołów nieszyfrowanych
oraz ominąć niektóre ograniczenia wprowadzone przez zapory ogniowe. W SSH tunele realizowane są za pomocą przekierowania portów (port
forwarding). Rozważmy prostą sytuację, w której
dzięki tunelowaniu, uzyskamy bezpieczny dostęp
do nieszyfrowanej usługi pocztowej. Na serwerze wydziałowym mamy konto pocztowe i konto powłoki dostępne przez SSH. Niestety administrator udostępnił pocztę tylko przez nieszyfrowane protokoły POP3 i SMTP. Jeśli nie chcemy,
aby nasze dane były przesyłane niezabezpieczonym kanałem możemy posłużyć się SSH. Najprostszym rozwiązaniem jest zalogowanie się
do powłoki serwera i obsługa poczty przez je-
-L 8025:localhost:25
Składnia komendy jest trochę skomplikowana.
Pierwsza część ssh [email protected] jest już znana. Opcja -L oznacza, że
SSH będzie nasłuchiwać na lokalnym porcie o
numerze 8025 i to jest jeden koniec tunelu. Drugi podawany jest po dwukropku w postaci host:
port, w naszym przypadku localhost:25. Należy zaznaczyć, że zamiast 8025 można wybrać którykolwiek z wolnych portów, jednak do
użycia numerów 1024 i mniejszych trzeba mieć
uprawnienia roota. Kolejną ważną i powodującą prawdopodobnie najwięcej nieporozumień
rzeczą jest nazwa hosta na drugim końcu tunelu. Jest ona podawana względem komputera, na
który się logujemy, czyli w tym przypadku localhost oznacza poczta.naszauczelnia.edu.pl.
W ten sposób zestawiliśmy szyfrowany tunel
z lokalnego portu 8025 do portu 25 na wydziałowym serwerze poczty. Skoro nauczyliśmy się
już tunelowania możemy przekierować drugi
port – ten do odbierania poczty.
jan@lolek$ [email protected].
edu.pl -L 8025:localhost:25 -L 8100:
localhost:110
Teraz wystarczy skonfigurować ulubionego
klienta poczty i wskazać mu localhost:8025 jako serwer SMTP do wysyłania poczty, zaś localhost:8110 do jej odbierania. Dzięki temu możemy jednocześnie cieszyć się komfortowym
korzystaniem z poczty i bezpieczeństwem jakie daje ochrona kryptograficzna kanału. Warto przy tym pamiętać, że tunel działa tak długo jak długo otwarta jest sesja SSH, po zakończeniu połączenia do localhost:8025 i localhost:
8110 przestaną działać.
Gdy już poznaliśmy podstawy tuneli załóżmy bardziej skomplikowaną sytuację. Wewnątrz sieci akademickiej znajduje się serwer, na którym wykonujemy projekt serwisu
WWW. Mamy dostęp do niego zarówno przez
SSH na standardowym porcie 22 jak i HTTP na
porcie 80, ale tylko z komputerów w sieci wydziałowej. Co zrobić gdy chcemy popracować
nad projektem siedząc w domu? Możemy zalogować się przez SSH na serwer pocztowy,
z którego mamy bezpośredni dostęp do komputera projektowego. Nie jest to jednak zbyt wygodne, ponieważ na obu tych serwerach mamy
do dyspozycji wyłącznie przeglądarki tekstowe,
które nie wspierają nowoczesnych technologii
WWW takich jak Java Script czy CSS. Najwy-
Listing 3. Plik konfiguracyjny tsocks.conf
local = 192.168.0.0/255.255.255.0
local = 10.0.0.0/255.0.0.0
server = 127.0.0.1
server_type = 5
server_port = 8080
Listing 4. Instalacja pakietu tsocks na serwerze w DMZ
jan@firmowy$ wget http://ftp.icm.edu.pl/pub/Linux/debian/pool/main/t/
tsocks/tsocks_1.8beta5-9.1_amd64.deb
jan@firmowy$ scp tsocks_1.8beta5-9.1_amd64.deb jan@serwerfirmowy:~/
jan@firmowy$ ssh jan@serwerfirmowy
jan@serwerfirmowy$ su jan@serwerfirmowy# cd ~jan
jan@serwerfirmowy#dpkg -i tsocks_1.8beta5-9.1_amd64.deb
www.lpmagazine.org
47
Rozwiązania
Zabawa w SSHowanego
godniej byłoby użyć lokalnego Firefoksa z Firebugiem i innymi dodatkami, ale bezpośrednio
na adres serwera projektowego się nie połączymy. W takiej sytuacji możemy zestawić tunel
SSH za pomocą polecenia:
jan@lolek$ ssh [email protected]
lnia.edu.pl -L 9080:projekty:80 -L
9022:projekty:22
Teraz, po wpisaniu adresu http://localhost:
9080/janek/ przeglądarka wyświetli projekt
strony, nad którym można dalej bez przeszkód
popracować. Dostęp do powłoki serwera projektowego uzyskujemy przez SSH:
jan@lolek$ ssh localhost -l janek -p
9022
gdzie janek to nazwa naszego użytkownika
na serwerze projektowym, a opcja -p pozwala
otworzyć połączenie na porcie innym niż standardowy 22, w tym wypadku na 9022.
Czasem zabezpieczenia sieci wydziałowej
są bardziej rygorystyczne i nie pozwalają na
logowanie się na serwer projektowy z serwera pocztowego. Wtedy, by móc pracować nad
projektem z domu, potrzebny będzie komputer
domowy z serwerem SSH osiągalny z sieci Internet. W czasie pobytu na uczelni musimy dostać się do komputera projektowego i otworzyć
z niego sesję SSH na serwerze domowym za
pomocą polecenia.
janek@projekty$ ssh -R 9022:
localhost:22 [email protected]
Opcja -R oznacza, że zestawiony zostanie tunel odwrotny z lolka na serwer projektowy.
Po powrocie do domu można wykorzystać ten
tunel by zalogować się bezpośrednio do komputera projektowego wywołując komendę:
jan@lolek$ ssh localhost -l janek -p
9022
W Sieci
•
•
•
•
•
•
•
•
•
48
oraz zestawienia drugiego tunelu po por- mocą przekierowania portów SSH warto roztu HTTP.
ważyć kilka przypadków jak z podobnie zabezpieczonej sieci się wydostać.
jan@lolek$ ssh localhost -l janek -p
Wiele sieci firmowych blokuje dostęp do
9022 -L 9080:localhost:80
niektórych usług, np. wybranych serwerów
WWW, pozostawiając tylko te uznane za nieZnów składnia polecenia staje się nieco skom- zbędne. Niestety, może to skutecznie utrudnić
plikowana. Czytelnika może zaniepokoić uży- pracę i warto poznać sposób na obejście takiego
cie localhost. Część ssh localhost -l ja- ograniczenia. Z pomocą przyjdzie serwer SSH
nek -P 9022 jest już znana i wbrew pozo- dostępny w Internecie. Najlepiej gdyby była to
rom powoduje zalogowanie na serwer projek- maszyna, na której mamy uprawnienia roota,
towy mimo, iż używamy adresu localhost, aby w razie potrzeby móc skonfigurować SSH.
co sugerowałoby raczej lokalny komputer. Tu- Załóżmy, że administrator sieci firmowej zablonel odwrotny łączy port 9022 hosta lokalnego kował nasze ulubione serwisy WWW, ale poi port SSH maszyny projektowej, dlatego te- zostawił możliwość logowania się na serwery
raz połączenie do localhost:9022 otwiera se- SSH. Możemy użyć jednego z takich serwerów
sję na zdalnym komputerze. Druga część po- jako pośrednika sieciowego (proxy) i przy jelecenia również jest nam znana: otwiera tunel go pomocy uzyskać dostęp do zablokowanych
z portu 9080 lokalnego komputera na port 80 usług. Polecenie:
komputera z którym się łączymy. Tu localhost oznacza serwer projektowy. Podobnego jan@firmowy$ [email protected]
polecenia użyliśmy przy zabezpieczaniu pro- -D 8080
tokołów pocztowych.
Bardzo często nasz komputer domowy otwiera sesję na komputerze domowym,
nie ma stałego adresu IP i nie można mu wte- a opcja -D sprawia, że będzie on działał jako
dy przypisać nazwy DNS. W takiej sytuacji na- serwer pośredniczący (proxy) typu SOCKS
leży skorzystać z usługi dynamicznego DNS dynamicznie tworząc tunele do wybieranych
oferowanego np. przez serwis dyndns.org. Po- przez nas adresów. Jeszcze tylko musimy odlega ona na przypisaniu komputerowi o zmien- powiednio skonfigurować przeglądarkę ustanym adresie IP stałej nazwy DNS. Dzięki temu wiając proxy typu SOCKS i podając localhost
można nawiązać z nim połączenie SSH nawet jako adres serwera i port 8080 – taki sam jaki
jeśli nie wiemy jaki aktualnie ma adres. Sytu- został określony przy wywołaniu SSH. Takie
acja jest bardziej skomplikowana, gdy ani ser- ustawienia pozwalają na połączenie się z serwer projektowy ani nasz komputer domowy wisami, które zostały oficjalnie zablokowane
nie są osiągalne z Internetu. Możliwe jest wte- przez administratora sieci, dzięki tunelowaniu
dy użycie publicznie dostępnego serwera SSH, komunikacji przez komputer domowy.
np. jednego z serwisów oferujących bezpłatW wielu sieciach ograniczenia nakładane na
ne konta na maszynach uniksowych i linukso- ruch sieciowy są większe. Administratorzy uniewych [7]. Warto zwrócić uwagę na to czy regu- możliwiają połączenia przez SSH blokując port
lamin serwera nie zabrania używania go w ce- 22 na zaporze ogniowej (firewall). Pozostaje jelu zestawiania tuneli i proxy. W wielu serwi- dynie możliwość używania portów 80 (HTTP),
sach jest to zabronione, bo powoduje wzmożo- 443 (HTTPS) i 8080 (alternatywne HTTP). Nany ruch sieciowy.
leży wtedy serwer SSH skonfigurować tak, aby
Skoro wiemy już wiele na temat uzyski- pracował na jednym z trzech dozwolonych porwania dostępu do zabezpieczonej sieci za po- tów np. na 443. W tym celu dodajemy wpis
Port 443 do pliku konfiguracyjnego demona
OpenSSH /etc/ssh/sshd_config. Po zmianie trzeba pamiętać o restarcie usługi i można nawiązać
połączenie z komputera firmowego wpisując:
http://jakilinux.org/aplikacje/sztuczki-z-ssh/ – Artykuł o sztuczkach z SSH cz.1
http://jakilinux.org/aplikacje/sztuczki-z-ssh-2-tunele/ – Część druga artykułu.
http://www.openssh.com/ – strona projektu OpenSSH
http://winscp.net/ – WinSCP, klient SCP i SFTP dla systemów Windows
http://www.chiark.greenend.org.uk/~sgtatham/putty/ – Putty, klient SSH dla
systemów Windows
http://gftp.seul.org/ – GFTP, graficzny klient m.in. SFTP.
http://www.red-pill.eu/freeunix.shtml – lista darmowych kont SSH
http://fuse.sourceforge.net/sshfs.html – SSHFS
http://roumenpetrov.info/openssh/ – Rozszerzenie X.509 dla OpenSSH.
styczeń 2010
jan@firmowy$ [email protected]
-D 8080 -p 443
Nie zmieniając konfiguracji przeglądarki znów
mamy dostęp do zablokowanych serwisów.
Nie jest to jednak rozwiązanie w pełni satysfakcjonujące. Co prawda Firefox wspiera
obsługę proxy typu SOCKS, ale wiele programów tego nie potrafi. W takiej sytuacji pomoc-
Rozwiązania
Zabawa w SSHowanego
nym może okazać się program tsocks. Pozwala on korzystać z proxy SOCKS programom,
które nie wspierają konfiguracji z takim typem pośrednika. Dla aplikacji taki sposób połączenia jest przezroczysty, tak jakby łączył się
z siecią bezpośrednio. Instalujemy tscocks na
komputerze firmowym poprzez
jan@firmowy$ sudo aptitude install
tsocks
a następnie konfigurujemy w pliku /etc/
tsocks.conf jak na Listingu 3.
Parametr local określa, jakie adresy mają być traktowane jako lokalne. Oznacza to, że
proxy nie będzie stosowane do połączenia z nimi. Parametr server zawiera adres serwera pośredniczącego. W tym wypadku jest to lokalny
komputer firmowy czyli localhost (127.0.0.1).
Parametr server-port wskazuje, na którym
porcie nasłuchuje pośrednik, jest to ten sam
port co przy opcji -D polecenia ssh. Ostatni
z parametrów server_type to typ proxy, wpisujemy tu 4 lub 5. Po zapisaniu konfiguracji
możemy korzystać z dobrodziejstw jakie oferuje program. Polecenie:
Zabezpieczenia potrafią jednak być bardzo
uciążliwe nie tylko dla włamywaczy, ale i dla
użytkowników. Przyjmijmy, że na naszym serwerze obok istniejącej już witryny w PHP trzeba
uruchomić drugą stronę napisaną w Perlu. Zazwyczaj wymaga to zainstalowania wielu bibliotek Perla, a ich ręczne instalacja zajęłaby pół
dnia. Kilka godzin pracy polegającej na szukaniu modułów w repozytoriach, lub CPAN, pobieraniu ich, a następnie kopiowaniu na serwer
i instalowaniu jeden po drugim to perspektywa,
która może zniechęcić. Na szczęście SSH pozwala nam zaoszczędzić tego wysiłku. Na serwerze WWW jest już zainstalowane OpenSSH,
ale braknie pakietu tsocks. Pobierzemy go ręcznie z jednego z serwerów lustrzanych Debiana,
skopiujemy i zainstalujemy.
Jak widać na powyższym przykładzie dużo pracy jest z instalacją ręczną nawet jednego pakietu.
Po instalacji konfiguracja tsocks będzie
wyglądała tak samo jak na Listingu 3. Trzeba jeszcze tylko zestawić tunel odwrotny i uruchomić serwer pośredniczący. Zaczniemy od
ponownego zalogowania się na serwer WWW
jan@firmowy$ ssh jan@serwerfirmowy -R
jan@firmowy$ tsocks audacious
8022:localhost:22
powoduje, że tscocks uruchamia odtwarzacz muzyki Audacious. Wszystkie żądania sieciowe,
z wyjątkiem tych do adresów zdefiniowanych
w parametrze local, tak uruchomionego odtwarzacza będą obsługiwane przez tsocks i przesyłane przez proxy zbudowane w oparciu o SSH.
Teraz połączenia na port 8022 serwera będą przekierowywane do komputera firmowego. Polecenie:
Ucieczka
ze strefy zdemilitaryzowanej
wydane z serwera WWW połączy nas do komputera lokalnego. Dodatkowo ustawi proxy na
porcie 8080 za pośrednictwem którego będzie
można łączyć się z Internetem, tunelując ruch
przez komputer lokalny. Kolejnym krokiem
jest otwarcie drugiej sesji SSH i wykonanie jako root polecenia:
Mamy już wystarczająco dużo doświadczenia z SSH, aby przystąpić do bardziej zaawansowanego zadania. Pozwoli ono wykorzystać i utrwalić zdobytą do tej pory wiedzę. Przypuśćmy, że administrujemy firmowym serwerem WWW. Systemem operacyjnym komputera jest Debian i mamy do niego
dostęp przez SSH. Nikt nie będzie nam blokował dostępu do serwera, ale jak się często
zdarza maszyna została umieszczona w strefie zdemilitaryzowanej (DMZ). DMZ to podsieć, do której jest dostęp z sieci firmowej jak
i z Internetu, ale komputery w niej się znajdujące nie mogą nawiązywać połączeń na zewnątrz strefy. Jest to powszechna praktyka
bezpieczeństwa. Jeśli intruz przejąłby kontrolę nad serwerem znajdującym się w takiej
strefie to nie może się z niego połączyć do
komputerów pracowników firmy ani do Internetu, w celu np. rozsyłania SPAMu lub atakowania innych maszyn.
jan@serwerfirmowy$ ssh jan@localhost
-p 8022 -D 8080
jan@serwerfirmowy# tsocks aptitude
a następnie wybranie i zainstalowanie niezbędnych pakietów oprogramowania. Po zakończonej pracy zamykamy wszystkie sesje
SSH a tym samym tunele. Ponieważ tsocks zostało już zainstalowane i skonfigurowane, następnym razem w podobnej sytuacji będzie
można rozpocząć od zestawiania tuneli.
Trudno jest przecenić wartość SSH. Jest
ono czymś więcej niż tylko szyfrowanym następcą telnetu i rlogin. Pozwala na zdalne wykonywanie poleceń podobnie jak RSH, szyfrując kanał transmisji. Umożliwia kopiowanie plików przez SCP jako bezpieczna alternawww.lpmagazine.org
tywa dla RCP. Zastępuje FTP przez bezpieczny
protokół SFTP. Dzięki SSH możemy przekierować porty, tworzyć tunele i przekierowywać sesje X11 między różnymi komputerami w sieci.
Zastosowanie autoryzacji przez klucze pozwala na proste stosowanie SSH w skryptach, nie
wymagających interakcji użytkownika. Możemy również utworzyć pośrednika sieciowego,
który zostanie wykorzystany przez przeglądarkę WWW lub inne programy.
Rozwiązania bazujące na SSH
W tym rozdziale przedstawionych zostanie kilka
rozszerzeń i rozwiązań bazujących na SSH.
Bardzo wygodnym narzędziem dla wielu
użytkowników może okazać się SSHFS (SSH
File System). Pozwala on na zamontowanie
fragmentu systemu plików zdalnego serwera
na lokalnej maszynie i używanie go jako dodatkowy dysk. Rozwiązanie to wykorzystuje
połączenie SSH i FUSE, czyli system plików
w przestrzeni użytkownika.
Innym ciekawym rozwiązaniem wykorzystującym SSH jest protokół FISH. Został on
opracowany na potrzeby programu mc (Midnight Commander) do kopiowania plików za
pomocą zdalnych wywołań powłoki. Wspiera nie tylko SSH, ale również RSH. W praktyce jednak wykorzystuje ten pierwszy. Protokół, poza Midnight Commanderem, jest używany m.in. w popularnym menedżerze plików
KDE – Konquerorze.
W artykule została przedstawiona możliwość autoryzacji w SSH za pomocą klucza
kryptograficznego, ale warto również wiedzieć,
że zostało opracowane rozwiązanie pozwalające na logowanie za pomocą certyfikatów X509.
Certyfikaty, czyli bardziej zaawansowana wersja kluczy, oprócz samego materiału kryptograficznego zawierają informację o właścicielu
certyfikatu i ścieżce certyfikacji – organizacjach
odpowiedzialnych za jego wystawienie. Rozszerzenie jest rozwijane niezależnie od głównej
gałęzi projektu OpenSSH.
To jednak nie wszystko.Wachlarz pomysłów na wykorzystanie SSH jest bardzo szeroki
i zależy od inwencji i potrzeb użytkowników.
O autorze
Autor jest z wykształcenia inżynierem
elektroniki, Linuksem interesuje się od
ośmiu lat. Na co dzień używa go tak w
pracy, jak i w domu a jego ulubione dystrybucje to Gentoo i Debian.
Kontakt z autorem:
[email protected]
49

Podobne dokumenty