Bezpłatne programy monitorujące
Lekcja samoobrony
Autor: Maciej Koziński
Uruchamiając własny serwer w wydzierżawionym pomieszczeniu czy podłączając
notebooka w obcej sieci, możemy co prawda liczyć na współpracę lokalnych guru od
bezpieczeństwa, ale z pewnością spokojniejsi będziemy, mogąc polegać na własnych
działaniach... Do dyspozycji mamy kilka bezpłatnych narzędzi wspierających host
security.
Ich zaletą jest prostota, niewielkie wymagania środowiska pracy, uniwersalność oraz łatwość zastosowania.
Praktycznie w każdych warunkach mogą być uzupełnieniem bardziej wyrafinowanych narzędzi (nie musimy mieć jakichkolwiek uprawnień poza uprawnieniami roota na własnym komputerze).
Klasyka host security
tcp wrappers (autorstwa Wietse Venema) to jeden ze starszych i lepiej znanych pakietów z klasy host security.
Jego rolą jest monitorowanie i kontrola połączeń w warstwie aplikacji. Działa jako typowy "wrapper", czyli pośredniczy w wywołaniu odpowiedniego programu-serwera usługowego, uruchamianego z poziomu
superserwera inetd. Poniższe linie (pochodzą z pliku konfiguracyjnego /etc/inetd.conf) ilustrują sposób skonfigurowania do pracy serwera tcp wrappers o nazwie tcpd:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
pop3 stream tcp nowait root /usr/sbin/tcpd /usr/sbin/popper -s
Jak widać, inetd przekazuje połączenie wywoływanemu programowi, uruchamiany zaś z odpowiednimi
parametrami tcpd wykonuje szereg operacji, zanim zadecyduje o uruchomieniu serwera usługowego. Operacje te obejmują zazwyczaj: sprawdzenie uprawnień dostępu dla danego klienta przez porównanie z access list, zanotowanie w dzienniku systemowym odpowiedniego komunikatu, ewentualnie wykonanie operacji specjalnych zadeklarowanych przez użytkownika.
Są dwie składnie plików konfiguracyjnych tcp wrappers. Pierwsza, prostsza, obejmuje dwa pliki - /etc/hosts.allow i
/etc/hosts.deny, w których możemy zdefiniować listy dostępu w postaci dwóch lub trzech oddzielonych
dwukropkami pól. Pierwsze pole dopasowuje serwer usługowy, drugie - usiłującego uzyskać dostęp klienta, trzecie, opcjonalne - zawiera komendy do wykonania w przypadku dopasowania zgłoszonego połączenia do dwóch pierwszych pól. Dopasowanie dotyczy pierwszego trafienia, tzn. pierwszy z napotkanych pasujących wpisów jest uznawany za obowiązujący. Reguła ta jest bardzo istotna przy dopasowywaniu nakładających się podzbiorów, co pokażemy na przykładach.
Ponieważ w składni prostej wpisów dokonujemy w dwu plikach z listami dostępu, istotna jest ich kolejność.
Najpierw badany jest /etc/hosts.al ow, dopasowanie żądanego połączenia do listy dostępu z tego pliku pozwala nawiązać połączenie. Jeśli odpowiedniej listy dostępu nie znaleziono w /etc/hosts.allow, badany jest
/etc/hosts.deny. Znalezienie tam pasującego wpisu powoduje odrzucenie połączenia. Jeśli połączenie nie zostało opisane w żadnym z wymienionych plików - tcpd domyślnie zezwala na połączenie.
Zasady konstruowania list dostępu wyjaśnimy na przykładach. Załóżmy, że nasza polityka zabezpieczeń zezwoli tylko na dostęp z lokalnej sieci IP o adresach z zakresu 192.168.1.0/255.255.255.255 i tylko do wybranych usług.
Polityka taka jest określona w dokumentacji tcp wrappera jako "mostly closed". Odpowiednie wpisy w
/etc.hosts.allow mogą wyglądać tak:
in.telnetd popper : 192.168.1.
zaś /etc/hosts.deny może wyglądać tak:
ALL : ALL
Wpisy te zapewniają dostęp do demonów protokołów telnet i POP3 z komputerów o adresach IP 192.168.1.x i zabraniają pozostałym dostępu do wszystkich usług. Słowo ALL jest jednym z wyrażeń globalnych używanych w listach dostępu tcp wrappers (patrz ramka na str. 92).
Zdefiniujmy bardziej złożoną listę dostępu. Załóżmy, że chcemy umożliwić dostęp do usługi telnet z klasy adresów
"prywatnych" 192.168.0.0/ 255.255.0.0 z wyłączeniem klasy 192.168.255.0/255.255.255.0. Pliki przybiorą postać:
• /etc/hosts.al ow
in.telnetd : 192.168. EXCEPT 192.168.255.
popper : 192.168.
sshd : KNOWN@KNOWN
• /etc/hosts.deny
in.telnetd : 192.168.255. : (echo "Próba nieuprawnionego
dost•pu do us•ugi %d z %c" | /bin/mail -s Alert root)
ALL : ALL
Powyższe zestawienie zawiera dwa istotne elementy. Pierwszy to zdefiniowanie wyrażeniem globalnym EXCEPT
klasy wyłączonej z danej listy dostępu. Pula adresowa 192. 168.255.0 stanowi podzbiór większej całości o adresach 192.168.x.x. Gdyby zakaz dostępu interakcyjnego telnet do tego właśnie podzbioru zdefiniować jako osobny rekord w /etc/hosts.deny, nie byłby on skuteczny - pierwsze dopasowanie adresu z puli 192.168. 255.x odbyłoby się na podstawie szerszego, dotyczącego całej klasy 192.168.x.x wpisu w /etc/hosts.allow na taki dostęp zezwalającego (zgodnie z opisanym wyżej algorytmem).
Drugie istotne novum to linia w /etc/hosts.deny, notująca próby uzyskania połączenia protokołem telnet z inkryminowanej klasy. Sekwencja zawartych w trzecim polu w nawiasach komend zostanie wykonana w
przypadku dopasowania adresu i protokołu. Dopasowanie takie nastąpi z klasy 192.168.255.x, ponieważ linia z
/etc/ hosts.al ow pomija tę pulę adresów IP. Makra %c i %d zawierają informację na temat klienta usiłującego uzyskać połączenie (patrz też tabela poniżej).
Linia z wpisem dla serwera Secure Shell (sshd) zawiera zezwolenie dostępu dla wszystkich klientów
legitymujących się identyfikatorem przedstawianym przy użyciu protokołu IDENT oraz zarejestrowanym wpisem w DNS.
Drugi rodzaj składni oferowanej przez tcp wrappers jest bogatszy i wymaga wpisów tylko w pliku /etc/hosts.al ow.
Jest uzyskiwany przy kompi-lacji pakietu z definicją PROCESS_OPTIONS (flaga kompilatora -
DPROCESS_OPTIONS). Podobnie jak w prostszej składni, pierwsze pole zawiera listę opisującą serwery usługowe, drugie dopasowuje klientów, zaś trzecie i kolejne (liczba pól nie jest stała - obligatoryjne są trzy pola) zezwolenie na dostęp lub jego brak, lub inną akcję. Zdefiniujmy listy dostępu z przykładu drugiego w drugim typie składni: in.telnetd : 192.168.255. : DENY : spawn echo "Próba nieuprawnionego
dost•pu do us•ugi %d z %c" | /bin/mail -s Alert root) : banners /etc/tcpd/banners
in.telnetd : 192.168. : ALLOW : banners /etc/tcpd/banners
popper : 192.168. : ALLOW
sshd : KNOWN@KNOWN : ALLOW
ALL : ALL : DENY : banners /etc/tcpd/banners
Istotną różnicę widać już w pierwszej linii - na początku sprawdzamy, czy adres komputera, który chce korzystać z telnetu należy do określonej puli adresów (jest ona pod-zbiorem puli z drugiej linii - jeśli adres będzie należał do puli 192.168.255.x, obowiązuje pierwsza linia), podejmujemy akcję powiadamiającą (komendy wywołane opcją spawn) oraz wyświetlamy użytkownikom odpowiedni napis z informacją (znajduje się w pliku
/etc/tcpd/banners/in.telnetd). Argumentem opcji banners jest podkatalog, zaś plik musi mieć tę samą nazwę co daemon, dla którego został wywołany. W plikach bannerów mogą być używane makra z tabeli. Pełną listę opcji używanych w rozszerzonej składni przedstawia tabela poniżej.
Pakiet tcp wrappers jest rozpowszechniany z praktycznie każdą liczącą się dystrybucją Linuksa. Można go również skompilować dla większości dostępnych na rynku systemów operacyjnych Unix. Pakiet zawiera własną bibliotekę procedur, umożliwiającą rozbudowę napisanych we własnym zakresie serwerów usługowych o listy dostępu w formacie tcp wrappers.
Port audit - aktywna obrona
Jeśli nie możemy stosować pasywnej obrony hosta opartej na filozofii "mostly closed", wówczas przyda się z pewnością Port Sentry, stanowiący część większego projektu Abacus. Narzędzie służy do monitorowania
aktywności na poszczególnych portach TCP oraz UDP i dynamicznego, aktywnego reagowania na zagrożenie.
Symptomem takowego jest skanowanie portów w celu odkrycia usług udostępnianych przez nasz host.
Reakcja Port Sentry na tego typu zagrożenie obejmuje zalogowanie przy użyciu mechanizmu syslog () takiego zdarzenia w dziennikach systemowych i przeciwdziałanie przez zablokowanie dostępu jedną z trzech metod:
• wpis do /etc/hosts.deny dla tcp wrappers (skuteczność wpisu może zależeć od zdefiniowanych już list dostępu - zakładamy jednak filozofię "mostly open" bez specjalnych zakazów, ale i bez specjalnych zezwoleń mogących zniweczyć efekt wpisu w /etc/hosts.deny);
• wstawienie do tablicy routingu nieistniejącej trasy do intruza (metoda skuteczna przy atakach przez TCP, nie działa przy niektórych "ślepych" atakach UDP);
• uruchomienie odpowiedniego filtrowania pakietów przez ipfwadm czy ipchains. Pakiet oferuje też
możliwość uruchomienia dowolnego skryptu w reakcji na skanowanie portów.
Port Sentry ma dwa zasadnicze tryby pracy. Podstawowy, w którym podłącza się do strzeżonych portów funkcją systemową bind (). Tryb ukryty "stealth" jest dostępny wyłącznie dla systemu Linux i obejmuje śledzenie
"surowych" gniazdek (raw sockets). Port Sentry wykrywa zarówno skanowanie poprzez pełne połączenie (funkcją systemową connect () ), jak i tryby skanowania skrytego (SYN/half open, FIN, NULL, XMAS, UDP).
Demon obserwujący aktywność na portach może być uruchomiony tylko dla jednego z protokołów transportowych TCP lub UDP. Jeśli chcemy chronić przed skanowaniem usługi korzystające z obu protokołów, musimy uruchomić dwie kopie Port Sentry.
Pakiet może zostać tak skonfigurowany, aby ignorować aktywność dobrze znanych i często żądających rozmaitych połączeń hostów. Można oczywiście wybrać zakres portów do obserwacji.
Port Sentry jest dobrym, prostym uzupełnieniem tcp wrappera. Warto też skorzystać z innych pakietów projektu Abacus: Host Sentry i Logcheck. Pierwszy, napisany w Pythonie, znajduje się we wczesnej fazie rozwoju, pozwala na odkrycie nieprawidłowości. Drugi automatyzuje przeglądanie logów systemowych w poszukiwaniu symptomów ataku na host.
* * *
Zajrzyj- ftp.win.tue.nl/pub/security - pakiet tcp wrappers
Opisane programy są idealnym narzędziem obrony stacji roboczych, notebooków, eksperymentalnych,
tymczasowych i zapasowych serwerów, a także maszyn stojących w wydzierżawionych pomieszczeniach, na
wystawach czy prezentacjach w "otwartych" sieciach.
Wyrażenia globalne (wildcards) używane w składni list dostępu tcp wrappers (man 5 hosts_access) Makrodefinicje używane w listach dostępu tcp wrappers (man 5 hosts_access)
Opcje rozszerzonej składni tcp wrappers (man 5 hosts_options)