HOME
DO_STR_GLOWNEJ_WYSZUKIWARKI
 
 
SSHD - tlumaczenia

 

Pobierz spakowaną witrynę gorzow-wlkp.pl/linux

Jeżeli pragniesz poznać Linuksa Mandrake (obecnie Mandriva), to... dobrze trafiłeś. Witryna została zauważona przez twórców magazynu KOMPUTER ŚWIAT 5/2004(141) str. 46 poprzez umieszczenie linku oraz magazynu CHIP 4/2004 (str.114) poprzez umieszczenie artykułu opisującego ten serwis internetowy. Jak na hobbystyczną stronę o Linuksie to miłe ;) Acha... na stronie mandrakelinux.pl/informacje podano też link z opisem cytuję "duży zbiór praktycznych informacji o Mandrake" (mam ją w swoim archiwum - klub.chip.pl/twarogal).

Zapraszam do zadawania pytań na FORUM oraz mailem. Chętnie udzielę (bezpłatnie) odpowiedzi. Oficjalne ceny za jedną poradę na stronie MandrakeSoftPL (mam ją w moim archiwum z dnia 2.05.2004) wahają się od 20 do 350 zł.

 


 

Lista artykułów o SSH dostępnych na tej witrynie:
  • Podstawy: część pierwsza zawiera wyjaśnienia podstawowych tematów związanych z najprostszym skonfigurowaniem ssh. Logowanie do shella odbywa się poprzez wpisanie hasła systemowego usera. Ponadto polecam notatkę o szyfrowanym sftp.
     
  • Podstawy: część druga (jesteśmy na niej), to tłumaczenie z angielskiego na polski doskonałego artykułu o konfigurowaniu ssh autorstwa Vincenta Danena.
     
  • VNC, czyli zdalne przejmowanie Pulpitu w szyfrowanym tunelu SSH.
     
  • Uruchomienie programu wymagającego X-Window pod tunelem ssh (opcja X11Forwarding yes w sshd)

 


 

Na sąsiedniej stronie opisałem najbardziej prymitywny sposób logowania się za pomocą ssh - poprzez wysłanie w sieć hasła shellowego (bez użycia tzw. kluczy). Czas na lepsze rozwiązanie. Poniższy artykuł to perełka znaleziona w Internecie na stronie Mandrake. Niestety, napisana w języku angielskim może nie być dostępna dla wielu Polaków. Przetłumaczyłem ją na spółkę z córką i zachęcam do praktycznego zastosowania.

Wstęp od tłumacza (czyli ode mnie ;).


Logowanie za pomocą haseł jest uważane za mało bezpieczne, ponieważ ktoś może je podsłuchać i w konsekwencji przeprowadzić atak podszywania. Wskazane jest więc (na serwerze) wyłączyć tą możliwość (w pliku /etc/ssh/sshd_config wiersz PasswordAuthentication no) i nauczyć się tworzenia tzw. tunelu szyfrowanego opartego na kluczach. Metoda kluczy, czyli tzw. kryptografia publiczna polega na wygenerowaniu dwóch kluczy: publicznego (do szyfrowania danych) i prywatnego (do odszyfrowywania danych), które posiadają unikalną cechę - mimo, że nie są do siebie podobne, prowadzą do identycznego rozwiązania po użyciu algorytmów szyfrujących.

Autor artykułu Making the most of OpenSSH nie zajmował się rozwiązywaniem problemów konfiguracyjnych, przyjmując, że pisze dla znawców Linuksa. Dlatego proponuję pierw przeczytać stronę ssh1.php i skonfigurować połączenie ssh oparte na uwierzytelnianiu hasłem.




*




Oryginał (w wersji angielskiej) znajduje się na stronie
www.mandrakesecure.net/en/docs/openssh.php

Kopia wersji angielskiej jest także w moim archiwum.



*


"Making the most of OpenSSH" jest świetnym opracowaniem autorstwa Vincenta Danena opisujacym konfigurację OpenSSH. Tekst podzielono na 6 części, z których każda może być samodzielnym artykułem. Czytelnik dopiero poznający Linuksa powinien wiedzieć, że demona sshd oraz klienta ssh można zainstalować pobierając najnowsze paczki z domowej strony projektu http://www.openssh.com . Ponieważ firma MandrakeSoft nadzoruje aktualizację i informuje użytkowników o zauważonych błędach - polecam jej dystrybucję dla nowicjuszy. Dodatkowym atutem Mandrake jest automatyzacja procesów instalacyjnych i konfiguracyjnych OpenSSH, co skutkuje oddaniem produktu prawie gotowego do użycia.



*



Podczas opisu wydawanych poleceń możesz natknąć się na taki zapis:

$ ssh-add -d ~/.ssh/id_rsa
Znak dolara $ sygnalizuje, że polecenie jest wydane z pozycji zwykłego użytkownika (znak # symbolizuje roota).

Znak tyldy ~ jest skrótem ścieżki dostępu do katalogu domowego usera i w niniejszym opracowaniu oznacza /home/uzytkownik



*



Zacznę od... zacytowania fragmentu kończącego artykuł:
Powinno zostać jasno stwierdzone, że OpenSSH to duży, elastyczny i z całą pewnością niezbyt łatwy program. By wydobyć możliwie wiele z OpenSSH trzeba przekopać się przez sterty stron i plików konfiguracyjnych...




Mandrake Secure: Making the most of OpenSSH
Data utworzenia: 20 Sierpień 2002
Autor: Vincent Danen



OpenSSH zastępuje stare, wysłużone i nieprzydatne w dzisiejszych czasach protokoły telnet czy rsh. Stał się standardem używanym do logownia na odległych komputerach obsługiwanych przez Linuksa, BSD i innych UNIXopodobnych systemach. Jest bazowany na ostatniej darmowej wersji oryginalnego SSH (wersja 1.2.12) dostępnego na licencji BSD. Ponieważ SSH stał się tzw. programem komercyjnym (for-profit), jego darmowa wersja OpenSSH (non-profit) szybko zyskała popularność jako w pełni funkcjonalne zastępstwo dla komercyjnego SSH.


OpenSSH został wprowadzony w Linuksie Mandrake począwszy od wersji Mdk_7.2 oraz jako część kompletu "crypto" od wersji Mdk_7.0. Mimo, że teoretycznie telnet i rsh są nadal dostępne, używanie tych protokołów jako narzędzi umożliwiających logowanie na odległym serwerze nie jest polecane. Używanie OpenSSH jest dużo lepszym pomysłem.


Jednym z problemów związanych z OpenSSH jest jego nadmierna złożoność. OpenSSH oferuje zbyt wiele opcji, zarówno po stronie klienta jak i dla serwera. Niestety czyni go to skomplikowanym w użyciu i jest przyczyną błędów w konfiguracji. OpenSSH mimo, że jest narzędziem bezpieczeństwa, ma niestety bardzo bogatą historię błędów w zabezpieczeniach. MandrakeSoft zanotował osiem wykrytych błędów związanych z bezpieczeństwem od października 2000 r. (do 20.08.2002). Czy czyni to używanie OpenSSH niepolecanym? Absolutnie nie. Możliwość zaistnienia dziury w bezpieczeństwie OpenSSH zawsze będzie możliwa (choćby ze względu na złożoność kodu), jednakże korzyści mocno przeważają nad wadami (i podobnymi protokołami do odległego logowania: telnetem, rsh). Używanie OpenSSH jest dużo bezpieczniejsze niż używanie np. telnetu.


Oczywiście, używanie OpenSSH (lub każdego z SSH) może być tak złożone lub tak proste jak sam zechcesz, by było. Spróbujemy sprawić, by używanie OpenSSH stało się proste, jednocześnie pozwalając Ci dobrać się do niektórych ze świetnych cech, jakie posiada.


Mimo, że niniejsza notatka jest nastawiona dla Linuksa Mandrake, robienie użytku z tych informacji na każdym systemie unixowym, obsługującym OpenSSH nie powinno być związane z praktycznie żadnymi odstępstwami od tego, co znajduje się tutaj (różne mogą być umiejscowienia plików i katalogów).




*



Dostęp bez hasła.
Używanie Publicznych/ Prywatnych Kluczy z OpenSSH




Jedną z najlepszych cech OpenSSH jest możliwość używania publicznie dostępnych kluczy, by zalogować się na odległy serwer. OpenSSH szyfruje całą komunikację, ale od chwili ustalenia połączenia. Nie jest wskazane wysyłanie hasła zanim nie nastąpi szyfrowanie połączenia. O wiele bezpieczniej jest użyć kluczy publicznych i dopiero potem ewentualnie uwierzytelnić się dodatkowo poprzez hasło.


Zaczynamy...


Załóżmy, że jesteś Jasiem. Masz swój komputer z kontem jasiu i administrujesz poprzez SSH odległy serwer Kazia. Serwer Kazia ma zainstalowany (poza sshd) serwer pocztowy obsługujący użytkownika jasiu osadzonego na shellowym koncie (dla naszej wygody konta na obu komputerach nazwaliśmy jasiu), z którego odbierasz swoją pocztę. Podczas gdy jesteś wystarczająco przebiegły, by za pomocą SSH chronić informacje, które wysyłasz (hasła, komendy używane podczas administracji itd.), jednocześnie używasz regularnego klienta POP3 by odbierać swoją pocztę POP3. Zapominasz, że komunikacja POP3 jest kompletnie widoczna: hasło POP3 zostanie wysłane bez żadnego zabezpieczenia, o treści przesyłki nie wspomnę. Z litości nad Tobą przyjmuję jednak, że nie tyle zapomniałeś, ile pragniesz ustawić serwer POP3 pracujący pod SSL w najbliższej przyszłości, a dotychczas po prostu nie miałeś na to czasu ;) . Niestety, póki co - wszystkie złośliwe, ciekawskie osoby mogą przy pomocy sniffingu (podsłuchiwania-obwąchiwania) dostać Twoje hasło POP3. Jako, że nie używasz żadnego oprogramowania wirtualnie hostującego pocztę, a konto POP3 jest połączone z Twoim shellowym kontem, praktycznie wysyłasz swoje informacje o logowaniu do sieci w sposób umożliwiający ich podglądanie. Atakujący może więc zwąchać Twój login oraz hasło shellowe po to, by otrzymać dostęp do systemu (prawdopodobnie w miarę możliwości przy pomocy telnetu).


To jest zły scenariusz. Jest na szczęście kilka prostych sposobów, by złagodzić problem.

  • Pierwszym jest użycie systemu wirtualnie hostującego pocztę, który oddziela użytkowników poczty od użytkowników systemu. Dzięki temu użytkownicy poczty nie będą mieli konta shellowego.
  • Drugim sposobem jest użycie szyfrowania w komunikacji POP3 poprzez wykorzystanie POP3 pracującego pod SSL.
  • Ostatnią metodą jest użycie kluczy SSH i nią się teraz zajmiemy.


Powyższy scenariusz zmieni się na lepsze, gdy przyjmiemy, że administrator Kaziu skonfigurował serwer OpenSSH, tak by odrzucał autentykację hasłem. Wszyscy, którzy chcą połączyć się z serwerem muszą mieć ważny klucz do konta, na które chcą wejść. Czyli: NIE MA KLUCZA - NIE MA DOSTĘPU. Wyłączona autentykacja hasła oznacza, że nikt nie musi znać hasła shellowego. Jasiu może się zalogować na serwerze Kazia, ponieważ publiczny klucz Jasia został umieszczony na serwerze Kazia i istnieje pełna zgodność pary kluczy: publicznego (na serwerze Kazia) i prywatnego (na komputerze Jasia). W tym wypadku nikt nie ma szansy przechwycić nazwy użytkownika oraz hasła do shella, gdyż... nie używa się tych danych do logowania.

Zalety kluczy SSH są więc jasne i niepodważalne.

Proponuję, by pierwszym etapem nauki była obsługa SSH za pomocą kluczy, bez używania hasła shellowego. Musimy więc na komputerze-kliencie (po zainstalowaniu klienta ssh) wygenerować parę kluczy składającą się z klucza publicznego i prywatnego. Teoretycznie SSH obsługuje trzy typy kluczy: RSA1, RSA2 i DSA. Wskazane jest lekceważenie RSA1 (zarówno jako udostępniony protokół w OpenSSH i jako typ klucza), by zamiast tego skoncentrować się na używaniu RSA2 i DSA. Ja osobiście wolę klucze DSA. Różnicą pomiędzy kluczami RSA1 i RSA2 jest używany protokół SSH. Klucze RSA1 są używane z protokołem nr 1, a RSA2 (zwykle nazywane po prostu kluczami RSA) z protokołem nr 2. Klucze DSA mogą być używane jedynie z protokołem 2.

Aby wygenerować parę kluczy DSA, wykonaj jako użytkownik jasiu (na komputerze Jasia) zlecenie:

$ ssh-keygen -t dsa

Wykreujesz w ten sposób 1025 bitową parę kluczy DSA. Prywatny klucz zostanie utworzony na Twojej stacji, w pliku /home/jasiu/.ssh/id_dsa . Natomiast publiczny w tym samym katalogu, ale w pliku /home/jasiu/.ssh/id_dsa.pub (miejsce publicznych kluczy na odległym serwerze jest w pliku ~/.ssh/authorized_keys i do niego skopiujesz zawartość /home/jasiu/.ssh/id_dsa.pub).
Jeśli chcesz używać klucza RSA2, użyj komendę:
$ ssh-keygen -t rsa
a jeżeli upierasz się przy kluczu RSA1, wpisz:
$ ssh-keygen -t rsa1


Zostaniesz zapytany o tzw. przepustkę czyli passphraze (specjalnie jest to nazywane przepustką, a nie np. hasłem), by zabezpieczyć prywatny klucz. Przepustka może zawierać od 10 do 30 znaków, powinna być trudna do zgadnięcia, wskazane jest bezlitosne mieszanie liter, cyfr, interpunkcji i pustych spacji. Treść przepustki czyli passphraze zapisz na kartce i... ukryj w sejfie. Przepustka no i oczywiście prywatny klucz muszą być za wszelką cenę chronione. Plik z prywatnym kluczem powinien mieć restrykcyjne prawa dostępu (powrócę później do tego tematu).

Zmianę przepustki czyli passphraze wykonasz za pomocą tej komendy:

$ ssh-keygen -p -f /home/jasiu/.ssh/id_dsa

To zlecenie zmusza ssh-keygen, by zmienił przepustkę czyli passphraze do prywatnego klucza przechowywanego w pliku ~/.ssh/id_dsa (prywatny klucz DSA). Będziesz zapytany o starą przepustkę i o nową. Nie ma sposobu na odzyskanie treści przepustki, więc jeżeli kiedyś zapomnisz ją - będziesz musiał wygenerować nowy klucz, wykasować stary i rozprowadzić nowy publiczny klucz (~/.ssh/id_dsa.pub) po serwerach, na których chcesz go używać.

Upewnij się, że na odległym komputerze Kazia jest zainstalowany serwer sshd. Ponadto dopilnuj, aby Kaziu wprowadził właściwe wpisy do pliku /etc/hosts.allow no i... udostępnił serwer sshd dla świata poprzez firewalla.

Teraz, gdy pierwszy krok jest skończony, musisz skopiować zawartość publicznego klucza znajdującego się na Twojej stacji (w domowym katalogu, w pliku ~/.ssh/id_dsa.pub) i umieścić na odległym serwerze (tym na którym chcesz się zdalnie logować w przyszłości) do pliku ~/.ssh/authorized_keys (w nowym wierszu). Jak to zrobić? Teoretycznie są dwa sposoby.

  • Pierwszy, nierozsądny - gdy na odległym serwerze ustawiona jest opcja autentykacji hasłem shellowym. Możesz w takich okolicznościach "na upartego" skopiować ze swojej stacji zawartość pliku ~/.ssh/id_dsa.pub do docelowego pliku ~/.ssh/authorized_keys (znajdującego się na koncie domowym odległego serwera), ale narażasz się na możliwość wykradzenia-zwąchania jego treści.
  • W drugim przypadku musisz w bezpieczny sposób (np. pocztą lub SMS) wysłać publiczny klucz ~/.ssh/id_dsa.pub (pobrany z katalogu domowego ze swojej stacji) do administratora odległego serwera, by umieścił jego zawartość na Twoim koncie shellowym w pliku ~/.ssh/authorized_keys.

Sumując.
Docelowe miejsce publicznych kluczy jest w pliku ~/.ssh/authorized_keys na odległym serwerze. Na przykład, komputer A jest Twoim domowym komputerem, a komputer B jest Twoim systemem pracy, do którego chcesz mieć dostęp SSH. Prywatny klucz musi pozostawać na komputerze A (w pliku ~/.ssh/id_dsa), podczas gdy zawartość publicznego klucza z komputera A (~/.ssh/id_dsa.pub) powinna być skopiowana do ~/.ssh/authorized_keys na odległy komputer B. Opisywany plik /.ssh/authorized_keys może zawierać więcej niż jeden klucz, więc jeśli masz domowy system i laptopa, możesz wygenerować dwa oddzielne klucze, po jednym dla każdego urządzenia, przechowując oba publiczne klucze na serwerze, pozwalającym ci na połączenie bez hasła zarówno z domu, jak i z laptopa. Uwaga: wykonaj dwa oddzielne klucze, po jednym dla każdego urządzenia (to ważne).

Oczywistym jest, że jeśli używasz klucza protokołu 2, serwer musi popierać protokół 2. Nie powinno być z tym problemu, gdyż protokół 2 uznano za bezpieczniejszy niż protokół 1 i w związku z tym jest bardziej preferowany. Niektóre dystrybucje Linuksa mają unieszkodliwiony protokół 1, podczas gdy na Mandrake, w OpenSSH domyślnym wybieranym protokołem jest protokół 2, ale z możliwością cofnięcia się do protokołu 1.

Jeżeli chcesz skopiować jakiś plik za pomocą ssh, zostaniesz zapytany o przepustkę czyli passphraze lokalnie. Przepustka odblokuje prywatny klucz umożliwiający zalogowanie do odległego serwera bez wymieniania haseł w sieci.

Uwaga na koniec - nie ufaj nikomu.

Wyjaśnię to na przykładzie. Jeśli Jaś wysyła swój publiczny klucz (/home/jasiu/.ssh/id_dsa.pub) do Kazia (który jest administratorem odległego systemu), prosząc Kazia o wprowadzenie go do pliku ~/.ssh/authorized_keys (oczywiście na na serwerze Kazia, na koncie jasiu), Kaziu nie powinien zaufać samemu kluczowi, jeżeli Jaś nie dostarczy mu klucza fizycznie (np. na dyskietce, przez zaufaną osobę). Jeśli Jaś wyśle klucz e-mailem do Kazia, Kaziu musi założyć, że klucz jest nielegalny, jako że e-mail jest niebezpiecznym środkiem transportu. Przypuśćmy, że jednak w końcu udało się dostarczyć do Kazia klucz publiczny Jasia. Zależnie od poziomu paranoi Kazia można dalej sprawdzać i upewniać się co do autentyczności klucza. W takich okolicznościach Jasiu może zadzwonić do Kazia i powiedzieć mu jaki jest "odcisk palca klucza" (zaraz wyjaśnię co to takiego). Dylemat jest podobny do oznaczania kluczy w GnuPG i pojawia zawsze, gdy mamy do czynienia z sytuacją, gdy używana jest niebezpieczna metoda transportu publicznego klucza (najlepiej osobiście samolotem:). Kaziu podczas rozmowy telefonicznej może upewnić się, że osoba z drugiej strony słuchawki to Jasiu w prosty sposób: przy pomocy "odcisku palca klucza". Otrzymać go można poprzez wpisanie zlecenia:

$ ssh-add -l id_dsa.pub

Pokaże się tzw. "odcisk palca klucza" publicznego DSA Jasia.

$ ssh-add -l id_dsa.pub
1024 61:ed:d2:82:35:b4:54:3d:92:26:f8:48:69:21:de:c3 /home/joe/.ssh/id_dsa (DSA)

Kaziu może podobnie użyć tej samej komendy na kluczu, który Jaś twierdzi, że mu wysłał. Jeśli oba odciski palców się zgadzają, to oznacza, że osoba po drugiej stronie słuchawki ma ten sam klucz publiczny. Można więc pośrednio przyznać, że klucz jest prawidłowy i legalny.

To mniej więcej objaśnia jak używać publicznych/prywatnych kluczy w OpenSSH, prócz kluczy hostowych. Klucze hostowe są opisane w sekcji Server Configuration.


*


Używanie tzw. Agentów SSH.


Chociaż używanie kluczy jest korzystniejsze od używania haseł, istnieje szczególny minus. Ponieważ przepustka czyli passphraze powinna być długa i trudna do odgadnięcia, ponowne jej wklepywanie za każdym razem może być nieporęczne i po prostu zwyczajnie denerwujące. Aby tego uniknąć, OpenSSH proponuje użycie Agenta-SSH, który zapisze treść prywatnego klucza (np. ~/.ssh/id_dsa) do swojej pamięci. Uchroni to Ciebie przed koniecznością wklepywania przepustki czyli passphraze za każdym razem, gdy chcesz użyć klucza prywatnego.

Aby użyć Agenta-SSH, musisz go zwyczajnie odpalić:

$ ssh-agent

a później dodać tożsamość (identity) klucza do cache agenta:

$ ssh-add

następnie podaj:

[/home/jasiu/.ssh/id_dsa] [i jakisprostyzapisidentyfikujacy]

Uwaga: powyższe zlecenie ssh-add nie zadziała, jeśli wykonujesz go w xterm (wygeneruje się błąd informujący o braku połączenia z agentem). Jest to spowodowane techniką zabezpieczającą Agenta-SSH, którego dane wyjściowe opierają się na PID (numerze ID procesu) Agenta-SSH i ścieżce do pliku socket jaki używa Agent-SSH. Bez tej informacji, ssh-add nie wie, z którym agentem się połączyć, ani jak się z nim połączyć. Dlatego ssh-agent powinien być używany w powłoce shellowej. W Linuksie Mandrake, jeśli rozpoczynasz nową sesję X (okienka np. KDE), uaktywnij terminal i po prostu wpisz "ssh-add", a Twój klucz (np. ~/.ssh/id_dsa) zostanie dodany do właściwego Agenta-SSH, oczywiście pod warunkiem, że podasz odpowiednią przepustkę czyli passphraze. W razie problemów pamiętaj, że nowego shella możesz uruchomić klawiszami CTRL ALT F2 (F3, F4, F5 itd.).

Jeśli chcesz wykasować klucze z Agenta-SSH, zrobisz to za pomocą parametru -d (użycie "-D" wykasuje wszystkie klucze z agenta). Na przykład jeśli masz i klucz RSA (np. ~/.ssh/id_rsa) i DSA (np. ~/.ssh/id_dsa), a chcesz usunąć klucz RSA z agenta, użyj zlecenia:

$ ssh-add -d ~/.ssh/id_rsa

Jeśli chcesz wiedzieć, jakie tożsamości (identities) Agent-SSH już posiada, użyj opcji "-I" (duże i).

Istnieje bardzo poręczy (choć niebezpieczny) programik Keychain, umiejący załadować tożsamości (identities) Agenta-SSH na cały okres aktywności urządzenia. Obecnie, jeśli wylogujesz się z X, Twój Agent-SSH jest usuwany, a kiedy ponownie się zalogujesz, musisz znowu wpisać swą przepustkę czyli passphraze . Jest to bezpieczne, ale irytujące. Dzięki Keychain wpisujesz przepustkę czyli passphraze raz, po czym może być ona używana podczas wielu sesji X i nawet podczas consolowego logowania. Oczywiście jeśli system będzie restartowany lub Agent-SSH zostanie zabity - będziesz musiał ponownie wpisać swoją przepustkę czyli passphraze i uruchomić Keychain.

Keychain (współpracujący ze skryptem bash) jest bardzo łatwy do zainstalowania. Ściągnij paczkę tar Keychain, rozpakuj ją i zainstaluj do /usr/bin (pod rootem). Potem, u każdego użytkownika który chce używać Keychain, musi zostać odpowiednio wypełniony plik ~/.bashrc (nadaj mu właściwe prawa). Wpisz w nim następującą treść:


# .bashrc
# User specific aliases and functions
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
/usr/bin/keychain -quiet ~/.ssh/id_dsa
. ~/.ssh-agent-${HOSTNAME}

Ostatnie dwie linijki są interesujace. Mówią narzędziu Keychain, by ładował klucz ~/.ssh/id_dsa bez komentarzy (zwykle Keychain jest gadatliwy i informuje o wielu sprawach np. czy odpaliłeś nowego agenta, czy dodano klucz czy nie). Jeśli chcesz mieć więcej niż jeden klucz, po prostu dopisz je w linii komend. Na przykład, użycie kluczy RSA1, DSA i RSA może być takowe:

/usr/bin/keychain -quiet ~/.ssh/identity ~/.ssh/id_dsa ~/.ssh/id_rsa

Następnym razem, gdy zalogujesz się do konsoli lub otworzysz xterm - Keychain także się odpali i załaduje wszystkie określone klucze do Twojego Agenta-SSH.

Jedna końcowa notka. Agenty SSH nie są zbyt bezpieczne, a już szczególnie we współpracy z Keychain. Powinny być używane na zaufanych maszynach, ponieważ ładują nasze prywatne klucze do pamięci cache, w sposób nieszyfrowany(!). Jeśli atakujący zechce otrzymać dostęp do Agenta-SSH, może wysłać własne żądanie do niego (dopóki agent nie zostanie zabity lub prywatne klucze zostaną z jego cache usunięte).

Jeśli używasz Agenta-SSH w pracy lub w innym niezaufanym (lub pół-zaufanym) środowisku, będziesz musiał pamiętać o konieczności usuwania swoich prywatnych kluczy z Agenta-SSH na noc lub jeśli opuścisz miejsce pracy np. na obiad. Przypominam, że użycie zlecenia $ ssh-add -D ~/.ssh/id_rsa usunie wszystkie klucze. Dodatkowym zagrożeniem jest sytuacja, gdy tożsamości (identities) nie ma w Agencie SSH. Wtedy Keychain wywoła ssh-add, które z kolei zapyta o Twoją przepustkę. Atakujący może próbować zgadnąć Twoją przepustkę czyli passphraze, otrzymując w ten podstępny sposób dostęp do Twojego prywatnego klucza. Wyczyszczenie Agenta-SSH jest bardzo polecanym krokiem, ale zabicie go, zamyknięcie terminala, a nawet całkowite wylogowanie jest najlepszym środkiem chronienia swoich prywatnych kluczy.



*


X i Port Forwarding.


Prawdopodobnie jedną z najczęściej używanych cech w SSH jest możliwość kreowania bezpiecznych tuneli dla niebezpiecznych transportów. Na przykład, wszyscy wiemy, że POP3 jest niebezpiecznym protokołem. Jeśli masz shellowy dostęp do serwera POP3 (z którego pobierasz pocztę), możesz użyć tunelu SSH by przerzucić swoje dane POP3 z odległego serwera na komputer lokalny. Tak samo jest z aplikacjami X, możesz utworzyć tunel SSH do odległego serwera, odpalić aplikację GUI (okienka) na odległym systemie i mieć ją otwartą na lokalnym monitorze. Przyznasz, że ta cecha SSH jest niesamowicie potężna, gdyż pozwala Ci użyć niebezpiecznych protokołów w bezpieczny sposób (bez otwierania dodatkowych portów na ścianie ogniowej lub rozluźniania pozwoleń dostępu czy używania nieszyfrowanej komunikacji, żeby utworzyć połączenie lub uruchomić aplikację).

Przyjmijmy na chwilę, że chcesz uzyskać połączenie z odległym serwerem POP3 używając SSH. Może to zostać wykonane jedynie, jeżeli masz dostęp SSH do odległego serwera POP3. Pierwszym krokiem jest wybranie lokalnego portu pomiędzy 1024 a 65535; są to numery portów z którymi nieuprzywilejowani (unprivileged) użytkownicy mogą się związać. Na przykład, wybierz port 10110. Wykreuj tunel SSH tak:

$ ssh -L10110:localhost:110 odleglyserwer

Utworzy to tunel, który połączy port 10110 na komputerze lokalnym z portem 110 na odległym serwerze. Dzięki temu zostanie nawiązane szyfrowane połączenie SSH z odległym serwerem. Używając narzędzia netstat możesz zauważyć, jaki port jest otwarty i nasłuchujący:


[user@mdkhost user]$ netstat -l --tcp -p|grep ssh
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 *:ssh *:* LISTEN -
tcp 0 0 localhost.localdo:10110 *:* LISTEN 31295/ssh
[user@mdkhost user]$

tłumaczenie tekstu w powyższym nawiasie: (Nie wszystkie procesy mogły zostać zidentyfikowane, niektóre własne informacje o procesach nie zostaną pokazane, musisz być root'em aby zobaczyć wszystkie.)

Jeśli wyjdziesz z powłoki shellowej SSH, połączenie (forwarding) także zostanie zamknięte. Zanim wyjdziesz z shella, możesz sprawić, by Twój klient otrzymał pocztę POP3 (nie poprzez standardowe połączenie z odległym systemem na porcie 110, ale poprzez połączenie z lokalnym hostem:10110). Niestety, wynikają w tym miejscu małe komplikacje. Na przykład, jeśli chcesz użyć crona by odbierać pocztę poprzez fetchmail lub podobny program, możesz mieć szczególne wymagania związane z czasem trwania tunelowanego połączenia SSH i otwartych portów. Są dwie możliwości:

  • wytrwałe połączenie (forwarding)

  • tymczasowe połączenie (forwarding). Tutaj otwierasz tunel na krótki czas, ale wystarczający, by pocztowy klient (lub program odbierający) mógł połączyć się z odległym hostem. Uzyskasz to zleceniem:

    $ ssh -f -L10110:localhost:110 remotesystem sleep 10

    Mówi to SSH, aby przeszedł w tzw. tło (-f), otworzył połączenie tunelowane i wykonał komendę "sleep 10". Standardowo, po wykonaniu tej komendy SSH zakończy sesję. Jednak jeśli fetchmail zadziała w czasie owych 10 sekund, SSH zaczeka z przerwaniem połączenia i pozwoli na dokończenie pracy. Zapewni to utrzymanie tunelowanego połączenia w okresie, gdy Twój fetchmail pracuje (ale nie pozostawia go otwartego przez zbędny okres czasu).

Z drugiej strony, jeśli sprawdzasz pocztę co kilka minut, przemyśl możliwość pozostawienia połączenia bezustannie otwartego. Zrobisz to wpisując w komendzie sleep większą ilość czasu, jak np. 100000 (sekund). Możesz nawet wykazać się pomysłowością i na odległym systemie utworzyć mały skrypt, który co chwilę będzie wpisywał komendę sleep z niesamowicie dużymi wartościami. Ochroni Cię to przed ręcznym otwieraniem i zamykaniem połączeń.

Forwarding danych dla X11 działa na tej samej zasadzie. Domyślnie, Linux-Mandrake popiera forwarding X11 poprzez plik konfiguracyjny klienta (/etc/ssh/ssh_config). ForwardX11 jest tam ustawiony na "yes" dla wszystkich hostów. W pliku konfiguracyjnym serwera sshd (/etc/ssh/sshd_config), X11Forwarding także wskazuje na "yes".

Kiedy tunelujesz poprzez SSH do odległego serwera, możesz odpalać programy X11 w linii komend (zupełnie tak samo, jak byś zrobił, gdybyś używał xterm na lokalnym systemie). Na lokalnym systemie, zmienna DISPLAY jest używana, by powiedzieć programom X11 dokąd biec i może być ustawiona jako ":0". Na odległym systemie, podczas połączenia przez SSH, wartość DISPLAY będzie czymś w rodzaju "localhost:11.0". Mamy kilka sposobów odpalenia programów X11. Jednak najczęściej używane jest tunelowanie połączenia poprzez SSH i wykonanie komendy jak ta:

[user@mdkhost user]$ ssh antek@ pd124.wroclaw.sdi.tpnet.pl
[user@remotesystem user]$ gkrellm &

Otrzymamy przez to połączenie z odległym serwerem pd124.wroclaw.sdi.tpnet.pl jako użytkownik "antek" i umożliwimy użycie gkrellm (narzędzia do graficznego monitorowania). Zwróć uwagę na znak "&" w końcu linii komendy. Wskazuje on, że gkrellm powinien zapoczątkować pracę jako zadanie. Powinieneś w sumie pominąć znak "&" i po prostu utrzymać gkrellm powiązany z terminalem, minimalizując po prostu terminal na pulpicie. Wykonaj więc:

[user@mdkhost user]$ ssh -f user@remotesystem gkrellm

Robiąc tak, możesz bez obaw zamknąć xterm używany początkowo do nawiązania połączenia tunelowanego poprzez SSH. Pozostawisz w ten sposób gkrellm na pulpicie, jako niezwiązany z żadną sesją (ponieważ SSH jest w tle). Jeśli chcesz zamknąć połączenie, zabij program dla którego go nawiązałeś (czyli program gkrellm). Kiedy zamykasz gkrellm - połączenie poprzez też SSH zostanie przerywane.


*


Bezpieczne SSH bez bezpośredniego nadzoru.


Zdarzy się, że zechcesz uruchomić SSH, ale z różnych przyczyn nie będziesz mógł użyć przepustki czyli passphraze (np. gdy uaktywnisz połączenie przy pomocy crona). Przyjmijmy, że chcesz włączyć tworzenie backupów (kopii bezpieczeństwa) z odległego serwera do Twojej stacji, każdej nocy używając rsync w tulelu SSH. Utwórz na Twojej stacji jakiegoś prostego w nazwie użytkownika np. "backup" lub "mirror". Wykreuj dla niego klucze SSH z pustą (!) przepustką czyli passphraze (zwróć uwagę, że nie jest to typowe rozwiązanie). Skopiuj zawartość publicznego klucza znajdującego się na Twojej stacji (w domowym katalogu, w pliku ~/.ssh/id_dsa.pub) i umieścić na odległym serwerze (tym na którym chcesz się zdalnie logować w przyszłości) do pliku ~/.ssh/authorized_keys. Zależnie od tego, co chcesz backupować (zrobić kopie plików), możesz dodać klucz tego użytkownika nawet do pliku na koncie root'a ~/.ssh/authorized_keys. Uważaj, gdyż daje to użytkownikowi natychmiastowy i bezhasłowy (!) dostęp do odległego konta root'a lub do odległego systemu! Może to być bardzo poważną dziurą w zabezpieczeniach, jeśli nie skonfigurujesz wszystkiego prawidłowo.

Teraz, gdy użytkownik "backup" ma dostęp do odległego konta root'a, możesz napisać skrypt shellowy (patrz poniżej) i odpowiedni wpis w /etc/crontab (który go będzie odpalał), by włączyć tworzenie backupów. Zrobisz to, uruchamiając poniższy skrypt na swoim komputerze (jako użytkownik np. "backup"):


#!/bin/sh
RSYNC="/usr/bin/rsync -aP --quiet --delete -l -t -e ssh"
cd /data/backup/host
$RSYNC root@host:/etc .
$RSYNC root@host:/home .
...

Skrypt może być wykonany np. każdej nocy przez użytkownika "backup". Będzie działał prawidłowo, ponieważ nie ma zdefiniowanej przepustki czyli passphraze dla prywatnego klucza użytkownika, a publiczny klucz jest u odległego roota, w pliku /root/.ssh/authorized_keys.

Czas na zabezpieczenie konta użytkownika "backup" na Twoim komputerze. Pierwszym krokiem jest zmodyfikowanie pliku /etc/ssh/sshd_config i dodanie do niego:

DenyUsers backup

To powstrzyma wszystkich przed próbą zalogowania się na koncie "backup" poprzez SSH. Następnie, wyedytuj na swojej stacji plik /etc/passwd. Tutaj usuniemy możliwość zalogowania się użytkownika "backup" do systemu przez konsolę. By to zrobić, uruchom (na swoim komputerze) program vipw jako root. Przyjmując, że nazwa użytkownika brzmi "backup", wpisz poniższy tekst:

backup:x:512:512:Backup User:/home/backup:/bin/bash

Drugie pole, czyli "x", reprezentuje cień hasła (shadow password). Jednak możemy zmienić "x" na "*" które zabroni logowania na to konto. Ta linijka więc mogłaby po wyedytowaniu wyglądać tak:

backup:*:512:512:Backup User:/home/backup:/bin/bash

Domyślnie, vipw używa edytora tekstów vi. Jeśli nie znasz vi, to przynajmniej musisz znać te podstawowe: naciśnij znak "i" by dostać się do opcji INSERT. Pozwoli Ci to zmienić pole hasła. Kiedy już je zmienisz, naciśnij ESC by wrócić do trybu komend, potem wpisz "wq" by wyjść i zapisać zmiany. Kiedy skończysz, vipw zapyta, czy chcesz wyedytować także plik /etc/shadow. Wciśnij "no", gdyż nadal chcemy, aby to konto miało prawdziwe hasło.

Obecnie mamy następujący układ:

  • Konto użytkownika "backup" (na lokalnej stacji) posiada swoje hasło, ale nikt nie może zalogować się na niego z odległego komputera (np. przez SSH), ani mając bezpośredni kontakt (w linii komend).

  • Pozostała rezerwowa furtka, czyli możliwość użycia zlecenia su, za pomocą którego zalogowani użytkownicy nie będący root'ami będą mogli wpisać hasło shelowe użytkownika "backup", by zmienić się na użytkownika "backup". Dlatego zresztą zostawiłeś cień hasła (shadow password). Jeśli w swoim lokalnym systemie jesteś zalogowany jako root - nie musisz nawet się martwić o zapamiętanie hasła (gdyż możesz wówczas wykonać su do "backup" jako root, bez znania hasła użytkownika;)

Na koniec wspomnę o znanym już Ci programie Keychain. Możesz z nim robić swoje backupy zwykłym użytkownikiem, z przepustkowo chronioną parą kluczy. Aby to robić za pośrednictwem cronu wypisz wcześniej przepustkę czyli passphraze conajmniej raz, zanim Twoje prace poprzez cron zaczną działać.

O crontabie możesz poczytać tutaj.



*


Konfiguracja klienta SSH.


Ta część jest chyba najtrudniejsza i wymaga od administratora dużej wiedzy. Umożliwia wykwintną konfigurację połączenia, ale źle wykonana rażąco obniży bezpieczeństwo systemu.


Konfiguracja wychodzących połączeń SSH.


Konfiguracja klienta SSH składa się z trzech plików:

  • /etc/ssh/ssh_config, który zajmuje się ogólnymi (na cały system) ustawieniami
  • ~/.ssh/config, czyli konfiguracja prywatna użytkownika
  • ~/.ssh/authorized_keys, który nadzoruje przychodzące połączenia (to do niego jak pamiętasz administrator Kaziu wprowadził dane z klucza Jasia ~/.ssh/id_dsa.pub.

Linux Mandrake standardowo załatwia konfigurację SSH (ze strony klienta) w części umożliwiającej używanie X11 poprzez wpis:

Host *
ForwardX11 yes
Protocol 2,1
StrictHostKeyChecking no

Strona man ssh_config(5) opisuje każdą opcję i tam ewentualnie poczytaj sobie o szczegółach. Tutaj w gruncie rzeczy wystarczy nam, by SSH umożliwił uruchomienie przekazywania (forwarding) X11, używał protokołu 2 (ewentualnie wrócił do protokołu 1, jeśli protokół 2 na odległym serwerze nie jest wspierany) i wyłączył ścisłe sprawdzanie kluczy (hostkey) w każdym połączeniu z odległym serwerem. Jest to dość liberalne, ale nadal względnie bezpieczne. Przecież z StrictHostKeyChecking ustawionym na "no" nadal będziesz ostrzegany o niedopasowanych kluczach podczas prób łączenia z serwerem (w przypadku różnic pomiędzy kluczem hosta zdefiniowanym w Twoim pliku ~/.ssh/known_hosts, a tym zaprezentowanym). Jeżeli jesteś paranoikiem, możesz zmienić wartość z "no" na "ask" (pytaj).

Uwaga: domyślna konfiguracja nie pozwoli Ci na tzw. przekazywanie połączenia z pomocą ForwardAgenta. Na przykład, jeśli siedzisz przy Komputerze A (masz tam domyślnie wyłączonego ForwardAgenta) i łączysz się z Komputerem B (który ma kopię Twojego klucza publicznego (~/.ssh/id_dsa.pub w pliku ~/.ssh/authorized_keys), nie musisz określać swojego hasła na Komputerze B. Ale jeżeli potem zdecydujesz się utworzyć tunel SSH (ponownie w roli czynności występuje SSH!) do Komputera C (z Komputera B), będziesz musiał wpisać hasło na Komputerze C, jeśli ForwardAgent jest niedostępny na Komputerze A i to mimo, że Komputer C zawiera Twój publiczny klucz. Przy udostępnionym ForwardAgent, możesz po prostu przeskakiwać do Komputera C bez wpisywania hasła. Jest to wygodna cecha, która niestety nie jest udostępniana domyślnie.

Zanim zacznę opisywać pliki konfiguracyjne SSH, pragnę zaznaczyć, że istnieje odrębna komenda preferencji z opcjami określonymi przez SSH, ale nie bedę teraz się tym zajmował (zainteresowanych odsyłam do man ssh_config(5)).

Plik /etc/ssh/ssh_config

Pozostawienie pliku /etc/ssh/ssh_config takim, jaki jest, będzie prawdopodobnie dobrym pomysłem, ponieważ możesz określać opcje w linii komend, w pliku konfiguracyjnym użytkownika (~/.ssh/config) i w systemowym pliku konfiguracyjnym. Dla ciekawskich opiszę jednak trochę plik /etc/ssh/ssh_config:

Host [host]
options
...

Host [host2]
options
...

Plik ten jest czytany od góry do dołu w komendzie "first match wins". Podczas kreowania pliku konfiguracyjnego upewnij się, że bardziej specyficzne wejścia są na liście pierwszymi, a domenowa dzika karta (wildcard) czyli np. domeny z *, ? (np. po*polska) lub globalne wejścia Hostów zdefiniowane są na końcu.

Kolejność pierszeństwa w odczytywaniu konfiguracji podczas startu SSH:

  • Najwyższe pierwszeństwo danych ustawień jest wpisane na linii komend
  • potem w lokalnym pliku konfiguracyjnym użytkownika
  • a potem w pliku konfiguracyjnym systemu.

/home/antek/.ssh/config

Przykład wpisu do pliku ~/.ssh/config:

Host devel
HostName myserver.mydomain.com
User antek

Host otherserver.mydomain.com
User admin
ForwardAgent no
Port 220
ForwardX11 no

Host *.mydomain.com
ForwardAgent yes
Compression yes

Są tutaj zdefiniowane:

  • w pierwszej grupie wpisów: "devel" Hosta, który zawiera pełną nazwę Hosta: myserver.mydomain.com. Takie dodanie aliasu podczas logowywania pozwoli Ci na używanie wywołania poprzez wpis "ssh devel" zamiast "ssh myserver.mydomain.com" . Ponieważ zdefiniowaliśmy domyślnego użytkownika "antek", używanie "ssh devel" jest równoznaczne z używaniem "ssh antek@myserver.mydomain.com". Trochę mniej do wklepywania:).

  • Druga grupa wpisów definiuje Hosta z adresem otherserver.mydomain.com. Uwaga: jest to FQDN dla hosta, a nie alias(!). Określa ponadto domyślnego użytkownika ("admin"), u którego AgentForwarding ma być wyłączony, którego połączenia mają domyślnie wychodzić z portu 220 i którego tunelowanie połączenia SSH dla X11 jest uniemożliwione.

  • Trzecia grupa wpisów definiuje domenową dziką kartę (wildcard) "*.mydomain.com". Sprawia to, że AgentForwarding jest dozwolony oraz że domyślnie udostępniamy kompresję.

Teraz możemy ustalić jakie cechy będą dostępne dla każdego hosta. Pamiętaj, że używamy domyślnego pliku konfiguracyjnego Linuksa Mandrake /etc/ssh/ssh_config, więc mamy także zdefiniowane opcje, które działają dla wszystkich hostów. Następująca tabela pokazuje jakie opcje będą dostępne podczas łączenia z myserver.mydomain.com, otherserver.mydomain.com, myhost.mydomain.com i otherhost.otherdomain.com.



Patrząc na tabelę, możesz przeoczyć pewną ciekawą regułę. ForwardAgent jest wobec jednych udostępniony, a wobec innych nie. Dlaczego? Przyczyną jest wpis w grupie *.mydomain.com (udostępniliśmy ForwardAgent i Compression dla wszystkich hostów, które pasują do domenowej dzikiej karty (wildcard)). Zauważ, że *.mydomain.com zawiera hosta myserver.mydomain.com. Innymi słowy, oprócz swoich standardowych opcji myserver.mydomain.com także ma udostępnione ForwardAgent i Compression (wraz ze zdefiniowanym użytkownikiem "antek" i z aliasem "devel").

Z drugiej strony grupa wpisów otherserver.mydomain.com, neguje definicję ForwardX11 oraz definicję ForwardAgent dla grupy wpisów *.mydomain.com. Tak więc, tunelowe połączenie SSH do otherserver.mydomain.com uniedostępni ForwardAgent i ForwardX11, choć są one udostępnione gdzie indziej. Użyje także Portu 220 domyślnie, z domyślnym użytkownikiem "admin". Jednakże, ponieważ Compression jest udostępniona dla *.mydomain.com, będzie udostępniona także dla tego hosta.

W końcu, podczas łączenia z otherhost.otherserver.com, jedynie ForwardX11 będzie udostępniony, ponieważ jest zrobione tak w głównej grupie wpisów. Jako że nie ma innej definicji która pasuje do hosta otherhost.otherdomain.com, jedynie te opcje określone jgłównej grupie wpisów będą zastosowane.

Jak widzisz, konfiguracja od strony klienta może być elastyczna i pozwala oszczędzić trochę czasu podczas użytkowania SSH. Jeśli rutynowo łączysz się poprzez SSH do odległego systemu z inną nazwą użytkownika niż aktualną na Twoim lokalnym pudle (np. użytkownik X na odległym systemie, użytkownik Y na lokalnym), możesz zdefiniować grupę głównych wpisów. W ten sposób wystarczy, że podczas próby nawiązania połączenia wpiszesz "ssh remotehost" zamiast wklepywać "ssh user@remotehost". Pamiętaj, że domyślnie, jeśli określisz jedynie nazwę hosta w linii komend (np. "ssh remotehost"), a ominiesz definiowanie nazwy konta, to SSH wykona logowanie na odległym koncie serwerowym pobierając nazwę użytkownika klienta.


Tak więc mamy za sobą konfigurację wychodzących połączeń SSH. A co z przychodzącymi?


Możesz także skonfigurować sposób, w jaki SSH będzie radził sobie z połączeniami przychodzącymi na Twoje konto. Jest jednak kilka ograniczeń co do konfigurowania rzeczy w ten sposób:

  • Po pierwsze, wytyczne konfiguracji nigdy nie unieważnią ogólnoserwerowej konfiguracji. Na przykład: możesz zwiększyć bezczynny timeout serwera, ale nie możesz udostępnić poświadczenia hasła, jeśli ogólnoserwerowa konfiguracja na to nie pozwala.
  • Jest bardzo polecane, abyś używał poświadczenia publicznego klucza jako jak najbardziej elastycznego. Po wybraniu poświadczenia hasłem, wiele opcji będzie dla Ciebie niedostępnych.

Konfiguracja klienta od strony serwera (czyli połączeń przychodzących na Twój komputer od odległego serwera) jest realizowana poprzez publiczne klucze (zarówno dla Protokołu 1, jak i 2). Przykładowo poprzez plik ~/.ssh/authorized_keys , którego wygląd będzie np. taki:

ssh-dss AAAAB3NxaC1kc3M...mc= user@somehost.com

Powyższy klucz został skrócony, ale możesz zauważyć, że każda linia w pliku ma następującą budowę:

  • ciąg znaków: "ssh-dss"
  • publiczny klucz (DSA lub RSA)
  • na końcu adres właściciela; zwykle nazwa użytkownika i nazwa odległego hosta (przypominam, że teraz opisujemy konfigurację połączeń przychodzących SSH).

Ponadto możemy w pliku ~/.ssh/authorized_keys umieścić konfigurację kilku opcji. Wróćmy na chwilę do naszego scenariusza z użytkownikiem Jasiu robiącym kopie (backup) na serwerze Kazia. Tyle, że teraz jesteś Kaziem, który na swoim serwerze SSH konfiguruje połączenia przychodzące od stacji Jasia. Jasiu jest w stanie użyć komendę rsync na serwerze Kazia, po to aby stworzyć backup. Jako administrator, Ty, czyli tym razem Kaziu, możesz ograniczyć uprawnienia odległego Jasia, np. listę czynności, jakie użytkownik Jasiu może zrobić (jako root) na serwerze Kazia. Wykonasz to poprzez dodanie wpisu przed kluczem publicznym Jasia (w pliku authorized_keys , na koncie roota, oczywiście na serwerze Kazia):

command="/usr/bin/rsync" ...key...

Od teraz, jeśli odległy użytkownik Jasiu spróbuje połączyć się z serwerem Kazia i wykonać logowanie na shellu, wykona jedynie program /usr/bin/rsync. Niestety, można przydzielić jedynie jedną przymusową komendę na dany klucz (nie zadziała w tym przypadku nawet próba odpalenia "/usr/bin/rsync --help"), toteż jeśli chcesz, by odległy użytkownik był w stanie zrobić coś innego, musisz użyć kilku kluczy lub napisać skrypt.

Proponowany przeze mnie wrapper-skrypt jest prosty i mógłby być prawdopodobnie rozwinięty, ale na obecne potrzeby ilustruje wystarczająco to, co jest wymagane. Utwórz plik-skrypt /root/remote-rsync i wpisz jego ścieżkę dostepu do pliku authorized_keys.

Wygląd pliku authorized_keys :

command="/root/remote-rsync" ...key...

Jak widzisz, powyższy wpis umieszczony w pliku authorized_keys odpali plik-scrypt /root/remote-rsync , który z kolei powinien wygladać tak:

#!/bin/sh
if echo $SSH_ORIGINAL_COMMAND|grep -e "^rsync " >/dev/null 2>&1; then
$SSH_ORIGINAL_COMMAND
else
echo "No access. Sorry."
fi

Jeżeli komenda wydana przez odległego klienta NIE ZACZYNA SIĘ od "rsync", to echujesz "Spadaj gościu. Pa!" (brak dostępu, chyba coś kombinujesz) i zamykasz połączenie.

Scrypt sprawdza, czy "rsync[spacja]" jest pierwszą rzeczą w linii komend. Odrzuci więc "/usr/bin/rsync" i inne warianty. Upewnij się że dane uzyskane po grep doprowadzisz do /dev/null, gdyż w przeciwnym razie rsync pomyśli, że jest jakiś problem i nie wykona aktualnego transferu.

Widzimy tam też zmienną środowiskową $SSH_ORIGINAL_COMMAND. Ta zmienna zawiera w rzeczywistości linię komend, której zażąda klient od serwera będąc odległym użytkownikiem. (...)

Niestety, rsync, może pozwolić potencjalnemu atakującemu otrzymać kopie ważnych plików, choć nie będzie w stanie zrobić nic jako użytkownik root. Jednakże pamiętaj, że wiele programów (większość edytorów tekstów i klientów poczty pracujących w linni komend) pozwala na ucieczkę do shella. Jeśli używasz jednej z tych komend (lub programów jako przymusowej komendy) końcowy użytkownik może łatwo "uwolnić się" z przymusowej komendy.


*


Inna komenda, o której chcę wspomnieć to komenda "from", która pozwoli określić klucz (uprawniający do wejścia na konto) i hosta, z którego połączenie mogłoby być ustalone. Tak więc, jeśli klucz pasuje, ale pukający do drzwi serwera host nie, to połączenie zostanie odrzucone. By tego dokonać, umieść w swoim pliku authorized_keys wpis:

from="client.mydomain.com" ...key...

Możesz użyć FQDN, adresu IP lub domenowej dzikiej-karty(wildcards). A więc, zamiast ograniczania się do jednego hosta, możesz ograniczyć się do jednej domeny poprzez użycie "*.mydomain.com". Także możesz określić wiele nazw hosta, adresów IP i wyrażeń poprzez oddzielenie ich za pomocą przecinków. Możesz także użyć znaku "!" jako wyrażenie negujące. Na przykład wpis:

from="*.mydomain.com,!xclient.mydomain.com" ...key...

...pozwoli dostać się poprzez użycie określonego klucza, z każdego konta w mydomain.com, ale oprócz konta xclient.mydomain.com. Zapamiętaj jednak, że konfiguracja na cały serwer unieważni powyższy wpis (jeśli system jest ustawiony na odrzucanie wszystkich użytkowników z mydomain.com, to nawet użycie opisanej powyżej komendy nie wpuści ich).

Możesz także ustawić zmienne środowiskowe w taki sam sposób, używając:

environment="EDITOR=jasiu" ...key...

W powyższym przykładzie każdy łączący się z kontem określonym kluczem ma swoją zmienną środowiskową $EDITOR ustawioną na "jasiu". Możesz ustawić każdą zmienną środowiskową w taki sposób, a nawet wiele zmiennych poprzez wpis:

environment="EDITOR=jasiu", environment="MYVAR=somevalue" ...key...

Inną opcja jest ustawienie bezczynnego timeout dla klucza, w ten sposób:

idle-timeout=60s ...key...

W tym wypadku, timeout jest ustawiony na 60 sekund dla wszystkich połączeń z tym kontem, używających określonego klucza.

Na koniec, możesz także zabronić udostępniania port-forwarding, agent-forwarding i przydział tty na podstawie klucz-przez-klucz (key-by-key). Słowa kluczowe w takich okolicznościach to: "no-port-forwarding", "no-agent-forwarding" i "no-pty".

Na koniec ciekawostka. Poniższa komenda została rozbita na pół. Oryginalnie powinna być wpisana w jednym wierszu.

no-agent-forwarding,environment=
"MYVAR=somevalue",command="/usr/bin/env|/bin/grep MYVAR" ..key..

Powyższy wpis zapewni rozłączenie po wydaniu nieuprawnionego zlecenia listowania: ssh someuser@somehost /bin/ls

[user@mdkhost user]$ ssh someuser@somehost /bin/ls
MYVAR=somevalue
[user@mdkhost user]$ ssh someuser@somehost
MYVAR=somevalue
Connection to somehost closed.
[user@mdkhost user]$

Jak widzisz, usiłowano uzyskać listę katalogu domowego jakiegoś użytkownika someuser. Zamiast tego, wyświetliły się nam dane komendy grep. Podobnie, przy drugim podejściu, kiedy chciano uzyskać dostęp do shella - wyświetliły się dane komendy grep i połączenie zostało zamknięte. To w uproszczeniu ilustruje, jakie efekty może dać układanie komend. Zmienna środowiskowa $MYVAR została wykreowana na początku i nasze wezwanie do programu env uniedostepniło ją, podczas gdy grep oddzielił ją od reszty.


Powinno być dość jasnym, że jest wiele sposobów na skonfigurowanie OpenSSH. Niektóre z opcji, jeśli są używane bez dokładnego przemyślenia, są niebezpieczne.



*


Konfiguracja serwera.



W końcu opiszę konfigurowanie serwera OpenSSH. Jest to prawdopodobnie najprostsza część tego wszystkiego :) . Całość konfiguracji serwera OpenSSH jest zawarta w pliku konfiguracyjnym /etc/ssh/sshd_config. Pamiętaj, by po każdej zmianie konfiguracji restartować sshd! Domyślnie, sshd_config na Linuksie Mandrake wygląda tak (wszystkie komentarze usunięto):



Port 22
Protocol 2,1
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 600
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
RhostsAuthentication no
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PAMAuthenticationViaKbdInt no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd yes
KeepAlive yes
UsePrivilegeSeparation yes
Compression yes
Subsystem sftp /usr/lib/ssh/sftp-server

Konfiguracja zaczyna się od poleceń narzucających serwerowi SSH, aby nasłuchiwał na porcie 22, używał Protokołu 2 lub wrócił do Protokołu 1 jeśli klient nie popiera Protokołu 2. W celu podniesienia bezpieczeństwa można uznać tylko Protocol 2 i wówczas wpis będzie wyglądał tak: Protocol 2

Następnie definiuje trzy klucze hostów: SSH1 (RSA), następnie SSH2 (RSA) i SSH2 (DSA). Inne opcje określono w manpage sshd_config(5).

Słowo kluczowe PermitRootLogin określa, czy root będzie mógł logować się przez SSH. Prawdopodobnie lepiej jest zabronić bezpośredniego logowania na roota (i używać zlecenia sudo lub su przez nieuprzywilejowanego użytkownika). Jednakże pozwalanie rootowi na logowanie przez SSH nie jest zbyt wielkim zagrożeniem, oczywiście pod warunkiem, że używasz silnego hasła lub wyłączysz potwierdzenie hasła. Jeśli chcesz zabronić potwierdzenie hasła roota, możesz użyć wpisu: PermitRootLogin without-password . Odrzucisz w ten sposób wszystkie podejścia do potwierdzenia hasła na koncie roota, co jest o wiele bezpieczniejsze niż pozwalanie na potwierdzenie hasła. Pamietaj, że możesz też pozwolić na wejście na konto roota jedynie poprzez autoryzację klucza, ograniczonego opcją komendy (patrz konfiguracja klienta SSH). (...)

Słowo kluczowe VerifyReverseMapping jest dobre dla paranoików. Narzuca ono sshd, aby sprawdzało zgodność nazwy odległego klienta (pełnej domeny) z IP. Domyślnie jest to niedostępne.

Słowo kluczowe UsePrivilegeSeparation jest ważną opcją. W wiele kodów w OpenSSH które działały wyłącznie pod rootem, obecnie funkcjonują pod nieuprzywilejowanym użytkownikiem. Ponieważ znacząco podnosi to bezpieczeństwo OpenSSH, powinno się udostępnić cechę UsePrivilegeSeparation . Niestety, opcja ta nie działa zbyt dobrze (w wersji OpenSSH 3.4p1) z innymi systemami unixowymi, można jednak się spodziewać, że następna wersja OpenSSH będzie pozbawiona błędów.

Jest także klika innych opcji wartych wspomnienia, których nie ma w domyślnej konfiguracji Linuksa Mandrake. Pierwszym z nich jest słowo kluczowe AllowUsers. Określa ono, co użytkownicy lub użytkownicy pasujący do określonych wzorów, mogą zmieniać i zapisywać w systemie. Może być to pojedyncza nazwa lub lista rozdzielona spacjami. Możesz także użyć do określenia "calling domains" (czyli wywołania domen) wpisując uzytkownik@host zamiast samego użytkownika. Na przykład:

AllowUsers jasiu

AllowUsers stasiu@remotehost.com

Pozwoli to lokalnym użytkownikom Jasiowi i Stasiowi zalogować się, ale dostęp do Stasia jest jedynie udzielany tym łączącym się z hosta "remotehost.com". Innymi słowy, jeśli użytkownik próbuje zalogować się jako Stasiu, ale łączy się z hosta otherdomain.com, nie dostanie pozwolenia na logowanie. Możesz tu użyć także domenową dzika kartę (wildcards), by określić domenę, jak np. "stasiu@*.remotehost.com". W wildcards mogą być używane znaki "?" (który pasuje do każdego pojedynczego znaku oprócz "@") oraz "*" (który pasuje do każdego ciągu znaków, także prócz "@").

Podobnie możesz użyć słowa kluczowego DenyUsers. Odmówisz w ten sposób wszystkim określonym użytkownikom lub tym pasującym do wzoru. Można użyć domenowych dzikich kart (wildcards) jak w AllowUsers. Uważaj, gdy będziesz używał DenyUsers i AllowUsers jednocześnie, to DenyUsers zawsze będzie miało pierwszeństwo. Na przykład, jeśli odmówiłeś użytkownikom dla wszystkich kont zaczynających się na literę "s" (np. wzór "s*"), a miałeś już wyrażenie AllowUsers dla użytkownika "stasiu", możesz błędnie uważać, że stasiu jest dostępny. Niestety, logowania są dozwolone tylko, gdy nie ma ograniczeń dotyczących nazwy użytkownika. W tym wypadku jest ograniczenie dotyczące "s*" i dlatego stasiu nie zostanie wpuszczony.

Możesz także pozwolić na dostęp bazowany na grupach słów kluczowych z AllowGroups i DenyGroups (jest używana do określania dostępu bazowanego na grupie unix'owej na serwerze). Będzie to sprawdzane w stosunku do podstawowych i dodatkowych grup użytkownika. Działa tylko na nazwy użytkownika, nie ilość. Przykład:

AllowGroups sshusers

DenyGroups users

W tym przykładzie użytkownicy należący do grupy "sshusers" mogą zalogować się w systemie, ale użytkownicy należący do grupy "users" nie mogą. Na Linuksie Mandrake standardem dla każdego użytkownika jest należenie do własnej grupy jako podstawowej (np. użytkownik jasiu będzie najprawdopodobniej należeć do grupy jasiu). Możesz dodawać użytkowników do dodatkowych grup, takich jak "users" lub np. "sshusers". Pamiętaj o ograniczeniach; są one tu takie same jak w bazowanych na użytkowniku słowach kluczowych. Tu, jeśli użytkownik należy do obu grup: users i sshusers, nie dostanie dostępu do logowania.

Wreszcie, jeśli chcesz używać kontroli dostępu opartej na hoście, możesz to zrobić wykonując komendy AllowUsers i DenyUsers, ale bez określania nazwy użytkownika. Na przykład wzór "*@somesite.com" będzie pasował do domeny somesite.com i dotyczy każdego konta na które mogą oni chcieć dostępu.

Pamiętaj, by po każdej zmianie konfiguracji restartować sshd!



ZAKOŃCZENIE


Powinno być jasno stwierdzone, że OpenSSH to duży, elastyczny i z całą pewnością niezbyt łatwy program. By wydobyć możliwie wiele z OpenSSH trzeba przekopać się przez sterty stron i plików konfiguracyjnych. Mam nadzieję, że niniejszy artykuł zilustrował kilka z istotnych opcji, które być może nie były przez Ciebie wcześniej znane.

Jedna końcowa notka: za każdym razem gdy wprowadzasz zmiany w swoim pliku sshd_config, upewnij się że zrestartowałeś sshd za pomocą "service sshd restart" jako root. Zmiany w plikach konfiguracyjnych użytkownika, takich jak ~/.ssh/authorized_keys i ~/.ssh/config nie wymagają restartu demona sshd.

Historia znaleziona na www.mandrakesecure.net/en/docs/openssh.php
This story found at www.mandrakesecure.net/en/docs/openssh.php

Ostatnia modyfikacja: Piątek, 20 września 2002 r.
Last modified: Fri Sep 20 13:03:22 2002

Linux jest zarejestrowanym znakiem towarowym Linus Torvalds. Składniki z tych stron i wszystkie obrazki są zastrzeżone przez właścicieli. Wszystkie składniki tej strony - teksty i loga - są zastrzeżone przez MandrakeSoft SA 2001-2002.
Linux is a registered trademark of Linus Torvalds. The contents of these pages and all images are copyright by their respective owners. All the contents of the pages - texts and logos - are copyrighted by MandrakeSoft SA 2001-2002.


*


Autor niniejszej strony www nie ponosi ŻADNEJ odpowiedzialności za przetłumaczony tekst. Zrobił to WYŁĄCZNIE na swój prywatny użytek i w dobrej wierze udostępnił wyniki pracy.

Strona domowa opracowania i tłumaczeń:
http://gorzow-wlkp.pl

W razie pytań i uwag proszę pisać na adres:
twarogal@poczta.wp.pl

Tłumaczyli: Gosia i Mirek Twarogal

22.03.2003



Jeżeli musisz pod tunelem ssh uruchomić jakie długo trwające polecenie i wylogować się, ale tak by nie przerwać pracy tego zlecenia, to wystarczy wpisać:
nohup nazwapolecenia
Zlecenie nohup wykonuje określone polecenie i ignoruje sygnały zakończenia procesu (zwłaszcza te wysłane podczas wylogowania się). Dzięki temu polecenie będzie działać po wylogowaniu użytkownika. Na koniec prac szukaj w katalogu domowym pliku nohup.out





LINKI
 
Sympatyczny opis ustawienia profilu połączenia ssh (autorstwa Rafała Świątkowskiego) jest na stronie: http://www.pg.gda.pl/OI/var/content.php?n=00024 (wersja angielska) mam kopię w swoim archiwum

http://www.rzg.mpg.de/networking/tunnelling.html (mam kopię w swoim archiwum)

SSH w środowisku Windows (mam kopię w swoim archiwum)

opcje klienta ssh (tłumaczenie z angielskiego)

 

 
twarogal@wp.pl

Uwaga: z powodu namnożenia się różnych złodziejskich witryn, które kopiują moje strony i umieszczają je u siebie wraz z komercyjnymi reklamami (na których zarabiają) informuję, że Wszelkie prawa do tłumaczonego, polskiego tekstu (ale nie angielskiego oryginału) są zastrzeżone.

Uwaga. Aby uniknąć zasysania całej witryny gorzow-wlkp.pl/linux za pomocą programów typu TeleportPro, WebCopier itd. informuję, że udostępniłem spakowaną wersję (w formacie RAR).

 
 

 

 

Witryna była dostępna pod adresami: strony.wp.pl/wp/twarogal , strony.wp.pl/wp/linuxtwarka , twarogal.republika.pl , klub.chip.pl/twarogal oraz gorzow-wlkp.net (w latach 2003/04).

 

 

gorzow-wlkp.pl

Informacje o odwiedzających są rejestrowane i publicznie udostępniane na pod adresem: http://gorzow-wlkp.pl/licznik/