Daniel Bachfeld, Paweł Wilk
Bezpieczna powłoka
Ochrona SSH przed atakami brute force
Wykorzystanie wolnych i otwartych narzędzi oraz kilku sztuczek pozwala wykryć i zablokować podejrzane próby logowania.
Wielu administratorów serwerów z uruchomionym dostępem przez SSH i uwierzytelnianiem za pomocą hasła ma mieszane uczucia dotyczące bezpieczeństwa. Najpóźniej w momencie odkrycia w logach systemowych niezliczonych prób zalogowania się na serwer za pośrednictwem automatycznych skryptów pojawia się pytanie, czy nawet dobrze dobrane hasło oprze się kolejnym atakom typu brute force. Ostatnio, przy okazji ataków na rozmaite strony traktujące o bezpieczeństwie, okazało się, że ich operatorzy nie stosują się do własnych porad.
Na szczęście za pomocą prostych metod można bardzo łatwo ukrócić powtarzające się działania crackerów. Specjalne narzędzia zliczają błędne próby logowania pochodzące z danego adresu IP i blokują kolejne po przekroczeniu zdefiniowanego limitu. Przy tworzeniu blokad programy imają się różnych sposobów.
Podstawy
Dzięki tzw. wrapperom TCP można w systemach Unix i BSD zaimplementować kontrolę dostępu dla połączeń TCP. Wrappery to procesy opakowujące, które działają między stosem TCP/IP a właściwą usługą. W klasycznym przypadku odbywa się to we współpracy z superserwerem (x)inetd. Przekazuje on przychodzące połączenia do wrappera zamiast bezpośrednio do usługi. Ten z kolei może na przykład zaprotokołować połączenie lub też zablokować je, jeśli pochodzi z konkretnego adresu IP. Adresy, które mają być blokowane, są zdefiniowane w pliku /etc/hosts.deny, a te, z których dostęp jest dozwolony, w /etc/hosts.allow. Dopiero gdy wszystko się zgadza, wrapper uruchamia usługę i przekazuje jej otwarte połączenie. Wykorzystuje w tym celu fakt, że wydzielony proces potomny dziedziczy po swoim procesie macierzystym m.in. otwarte deskryptory gniazd sieciowych.
Niektóre aplikacje, np. OpenSSH, są wyposażone w bibliotekę libwrap, która pełni funkcje wrappera, eliminując konieczność użycia dodatkowego programu. Czy stosowany przez nas demon OpenSSH korzysta z biblioteki libwrap, a tym samym na własną rękę analizuje zawartość pliku hosts.deny, możemy sprawdzić za pomocą polecenia ldd /usr/sbin/sshd.
Gdy logi serwera zapełniają się tego rodzaju komunikatami, niejeden administrator zaczyna się bać
Innym sposobem blokowania niechcianych połączeń w systemie GNU/Linux jest firewall Netfilter, którego reguły względnie tabele są konfigurowane przy użyciu polecenia iptables. Reguły mogą być dodawane również przez poszczególne aplikacje. Narzędzia tego rodzaju różnią się też od siebie pod względem sposobu zbierania informacji o podejrzanych próbach logowania. Niektóre regularnie przeszukują pliki logów pod kątem powiadomień o nieudanych próbach uwierzytelnienia, inne zliczają po prostu próby połączenia z danego adresu IP.
Problem z narzędziami blokującymi, które w regularnych odstępach czasu sprawdzają pliki logów, polega na tym, że nie są one w stanie reagować na ataki w czasie rzeczywistym. Dopóki atakujący ręcznie wprowadza nazwę użytkownika i hasło, mogą dotrzymać mu kroku. Jednak w przypadku szybkich ataków przeprowadzanych za pomocą automatycznych skryptów zaczynają mieć kłopoty i reagują zbyt późno. W czasie przeprowadzanych testów obserwowaliśmy ataki, w przypadku których w logach w ciągu zaledwie kilku sekund pojawiało się kilkadziesiąt błędnych prób logowania, jednak narzędzia reagowały na to dopiero po około 40 sekundach. Wprawdzie można skrócić przedziały czasowe, lecz wówczas program może w określonych wypadkach zająć zbyt dużo zasobów systemowych.
Tego rodzaju aplikacje są też podatne na zmanipulowane wpisy w logach. Na przykład atakujący mógłby specjalnie podejmować próby logowania za pomocą określonej nazwy użytkownika w celu sprowokowania narzędzia do zablokowania dostępu z dopuszczanych normalnie adresów IP (więcej szczegółów na ten temat w dokumencie "Attacking Log analysis tools").




