Analiza bezpieczeństwa Red Hata 7.3 w hipotetycznej firmie

    -- Sebastian Pawlak, 2003.


Pierwsza wersja pracy wysłanej na konkurs "Grasz o staż" organizowany przez PricewaterhouseCoopers i Gazetę Wyborczą.

1. Założenia i opis konfiguracji serwera

Dobór konfiguracji serwera zależny jest od przyszłych zadań, jakie będzie miał on realizować. Zakładam, że moja firma zajmuje się sprzedażą on-line urządzeń AGD. Struktura sieci przedsiębiorstwa nie jest złożona. Mamy kilka stanowisk z komputerami, przy których pracownicy zarządzają bazą danych dostępnych produktów oraz etapami realizacji zamówień. Należy także wymienić komputery pracujące w księgowości, dziale informatycznym i gabinecie dyrektora. Kluczowy serwer, z nowo zainstalowanym systemem operacyjnym RedHat 7.3, podłączony jest do internetu. Wybrano opcję instalacji "Server". Na komputerze tym utrzymywana jest strona internetowa firmy, na której klienci mogą zapoznać się z nasza ofertą oraz dokonać zamówienia. Strony funkcjonują dzięki serwerowi Apache w wersji 1.3.23, PHP w wersji 4.1.2 i bazie danych Postgresql w wersji 7.2.1, które to pochodzą z dystrybucji RedHat 7.3. Serwer zapewnia także pracownikom dostęp do internetu (masquerade). Zainstalowano na nim serwer ftp WuFtp w wersji 2.6.2, założono pracownikom konta shellowe z możliwością zdalnego logowania (niektórzy pracownicy pracują zdalnie). Zdalny dostęp do serwera zapewnia OpenSSH w wersji 3.1p1-3.

Wybór dystrybucji RedHat 7.3 (Valhalla) nie jest zły. Można było jedynie zastanowić się nad zainstalowaniem nowszej wersji systemu. W przypadku starszej wersji należy wnieść większy wkład pracy w zabezpieczenie. Nie bez znaczenia, w podejmowaniu decyzji o wyborze RedHata, był fakt, że producent zapewnia bardzo dobre wsparcie w aspekcie szybkiej reakcji na wykryte w systemie błędy. Dodatkowo, RedHat zatrudnia uznanych hakerów (jak choćby Alana Cox`a), którzy wprowadzają innowacje do kernela, kompilatora gcc i oprogramowania. Wydaje się, że RedHat ma ambicje tworzyć system przyjazny zarówno dla zwykłych użytkowników, jak i dla administratorów. Niestety, domyślne aktywowanie wielu, często zbytecznych, usług, nadawanie wysokich praw nawet grom komputerowym, nie idzie w parze z podnoszeniem bezpieczeństwa. RedHat nadaje się świetnie na serwery - świadczą o tym, chociażby produkowane przez IBM, serwery z preinstalowanym tymże systemem. Po prostu, instalacja tej dystrybucji na serwerze, wiąże się z wieloma pracami konfiguracyjnymi, by uczynić system bezpiecznym.


2. Ocena bezpieczeństwa

Przed podjęciem innych działań, mających na celu ocenę bezpieczeństwa systemu, należy zapoznać się z zawartością erraty na stronach RedHata, pod adresem: https://rhn.redhat.com/errata/rh73-errata.html Oczom naszym ukaże się pokaźna lista luk datowanych od połowy 2002 roku. Wiele z wymienionych tam pozycji, ma krytyczne znaczenie i należy wprowadzić stosowne poprawki do systemu.

Oceny bezpieczeństwa, w pewnych jego aspektach, można dokonać bez wyspecjalizowanych narzędzi. Doświadczony administrator wie jakie elementy danego systemu mogą sprawić problem, jest w stanie sprawdzić ich aktualną konfigurację i w razie potrzeby ją zmienić. Niestety, w mojej ocenie, obecnie nie ma dobrych i uaktualnianych programów do przeprowadzania wewnętrznej inspekcji systemu. Programy tego typu są na ogół od dawna nie rozwijane, a obszar zainteresowań ich autorów przeniósł się w stronę tzw. skanerów sieciowych. Z tego względu administrator musi polegać na swojej wiedzy. Przykładowo w wersji kernela dostarczonej wraz z RedHatem 7.3 jest błąd umożliwiający lokalny atak typu DOS. Będąc zalogowanym na konto zwykłego użytkownika należy skompilować i uruchomić, dostępny w internecie program napisy w języku C, autorstwa Christophe`a Devine`a: http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=77834. Działanie tego exploita kończy się tzw. Kernel Panic i zawieszeniem komputera. Test ten dowiódł, że RedHat 7.3 jest łatwo podatny na zawieszenie przez zwykłego użytkownika. Rozwiązaniem tego, bardzo poważnego, problemu może być instalacja łaty albo nowego kernela. Osobiście zalecam dodatkowo instalację tzw. łaty bezpieczeństwa "grsecurity", która stanowi potężne narzędzie, zabezpieczające system na różne ewentualności (m.in. pośrednio zabezpiecza przed atakiem poprzez demony zawierające błędy, szczegółowo loguje różne zdarzenia w systemie). Brak zainstalowanego firewalla wpływa na obniżenie bezpieczeństwa. Postulowałbym utworzenie firewalla, który skutecznie separowałby ruch w sieci lokalnej od reszty świata. Pozostawiłbym jedynie otwarte porty, na których nasłuchują usługi takie jak serwer http, ftp i ssh. Za pomocą polecenia "df" uzyskujemy informację o podziale dysku twardego na partycje. Nasz RedHat 7.3 został zainstalowany na jednej partycji (plus partycja swap). To rozwiązanie nie jest poprawne i stwarza wiele możliwości destabilizacji pracy systemu. Przykładowo, włamywacz mógłby zapełnić swój katalog domowy lub katalog /tmp tak aby na dysku nie pozostało miejsce dla logów systemowych. W ten sposób jego dalsze poczynania nie byłby rejestrowane oraz praca innych użytkowników byłaby praktycznie niemożliwa. Zalecałbym instalację z podziałem na oddzielne partycje dla następujących katalogów: /boot, /usr, /home, /var, /tmp, /. Zainstalowany serwer OpenSSH umożliwia zdalne zalogowanie się na konto roota. Taki stan rzeczy podwyższa ryzyko włamania i nie jest właściwy. Należy zabronić w odpowiednim pliku konfiguracyjnym takiej możliwości. Chcemy by możliwe było zalogowanie się na konto roota bezpośrednio z konsoli lub zdalnie po uprzednim zalogowaniu na inne, uprzywilejowane konto (czasem administrator musi pracować zdalnie; dobrze wyznaczyć adresy hostów, z których można się logować; należy wyznaczyć użytkowników uprzywilejowanych do użycia polecenia 'su'). W świeżo postawionym systemie RedHat 7.3 nie ma ustalonych limitów przydzielanej pamięci, miejsca na dysku, dopuszczalnego obciążenia procesora, itp. Brak troski w tym obszarze grozi możliwością zawłaszczenia zasobów systemu przez użytkownika, co implikuje destabilizację pracy systemu. Kolejnym rutynowym zadaniem, po instalacji systemu, jest usunięcie SUIDów (oraz GUIDów) programom rzadko albo wcale nie używanym oraz takim, których ewentualności uruchamiania, ze specjalnymi przywilejami, nie chcemy. SUIDy są groźne, zwłaszcza gdy posiadające je programy mają błędy - wtedy włamywacz może np. uzyskać uprawnienia roota. Za pomocą sekwencji: "find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;" należy wylistować programy, które posiadają SUIDy. Zbędnym aplikacjom powinno się je odebrać (chmod a-s nazwaProgramu). Dobrze przysłuży się instalacja programu, który śledzi zamiany w liście "uprzywilejowanych" aplikacji. Pewne zagrożenie stanowi domyślnie włączona odpowiedź systemu na pingi - stwarza to możliwość ataku DOS. Poprzez wpisanie jedynki do odpowiedniego pliku konfiguracyjnego można zaradzić temu problemowi. Podobnie należy postąpić w celu uodpornienia serwera na stanie się źródłem spoofingu, na zdefragmentowane pakiety oraz inne wypadki. Wszystkie opisane działania są powtarzalne i żmudne. Administrator może stworzyć własny skrypt automatyzujący proces "utwardzania" systemu, bądź posłużyć się gotowym narzędziem. Bastille jest aplikacją wspomagającą proces tzw. hardeningu (czyli utwardzania, zabezpieczania systemu).

O jakości zabezpieczeń serwera można dowiedzieć się dokonując prób jego penetracji. Testy penetracyjne można podzielić na zewnętrzne i wewnętrzne. Testy zewnętrzne polegają na testowaniu zabezpieczeń z komputera znajdującego się poza siecią lokalną - w ten sposób symulujemy ataki crackerów próbujących wedrzeć się na nasz serwer. Testy wewnętrzne pozwalają na symulacje ataków, wymierzonych w serwer, z komputerów znajdujących się w sieci lokalnej lub z samego serwera. Penetracja wewnętrzna pozwala ocenić odporność na zagrożenia płynące ze strony samych pracowników, jak również crackerów, którzy w uzyskali dostęp do serwera. Testy penetracyjne wykonuje się za pomocą ogólnie dostępnych programów zwanych skanerami. Jedną z lepszych tego typu aplikacji jest Nessus. Składa się on z dwóch części. Pierwsza to program demona, który możemy zainstalować na dowolnym komputerze - z tego komputera będzie odbywało się testowanie. Drugą stanowi graficzny interfejs, w którym ustawiamy opcje przeprowadzania testów. Dzięki takiej architekturze Nessus umożliwia wygodne skanowanie z dowolnego komputera, a wyniki możemy oglądać na ekranie monitora ustawionego na naszym biurku. Nessus zawiera dużą bazę często aktualizowanych wtyczek, które zajmują się testowaniem serwera na okoliczność wystąpienia wcześniej wykrytych dziur. Po kilkunastu minutach testów, oczom naszym ukazuje się raport.
I tak, po wykonaniu testów z demona Nessusa zainstalowanego na badanym serwerze, zostajemy poinformowani o wykryciu 8 dziur i ostrzeżeni o 12 możliwych zagrożeniach. Wszystkim "usterkom" zostaje dodatkowo przypisany poziom ryzyka jakie stwarzają. Najgroźniejsze okazały się m.in. błędy w demonach OpenSSH. W RedHat 7.3 występuje OpenSSH w wersji 3.1p1-3. Nessus zakomunikował, że w wersjach OpenSSH starszych niż 3.2.1 istnieje dziura umożliwiająca atak poprzez tzw. przepełnienie buforów generując specjalny ciąg bajtów i zdobycie uprawnień roota. Kolejne ostrzeżenie dotyczy również OpenSSH, lecz tym razem rozchodzi się o błąd umożliwiający zdobycie dostępu do shella. RedHat twierdzi, że przy OpenSSH zainstalowanym z domyślnymi ustawieniami nie ma żadnego niebezpieczeństwa. Mimo wszystko zalecałbym instalację nowej wersji OpenSSH. Jedno z ostrzeżeń wygenerowanych przez Nessusa dotyczy ustawionej wersji protokołu SSH - zalecane jest ustawienie w pliku konfiguracyjnym protokołu 2.
Nie wolny od błędów okazuje się być także serwer http. Etykietę luki o wysokim współczynniku ryzyka dostał mod_ssl (włamywacz może uruchomić program z prawami serwera http). Błąd w mod_ssl został też zaznaczony na stronach z erratą RedHata. Poważną sprawą jest także podatność serwera Apache na tzw. Apache Web Server Chunk Handling Vulnerability. Nessus ostrzega, że posiadana przez nas wersja Apache`a (starsza niż 1.3.27) zawiera szereg luk i najlepiej zainstalować nową. Kolejne ostrzeżenia tyczące się serwera http to m.in. podatność na ataki cross-site-scripting, możność podsłuchu i deszyfracji niektórych danych (za sprawą starej wersji OpenSSL) i zbyt obszerne informowanie przez serwer o zainstalowanym oprogramowaniu (Apache/1.3.23 (Unix) (Red-Hat/ Linux) mod_ssl/2.8.7 OpenSSL/ 0.9.6b DAV/1.0.3 PHP/4.1.2 mod_perl/1.26). Na jednym z wysokich portów, Nessus odnalazł działający serwis "statd". Ze względu na szereg luk pojawiających się w tym programie, od początku jego istnienia, zalecane jest wyłączenie go lub instalacja nowej wersji. Ten sam postulat tyczy się wykrytego serwisu "fam".
Nie polecam użytkowania, dostarczanych wraz z RedHatem, demona ftp Wu-ftp oraz poczty Sendmail - w zamian proponowałbym odpowiednio ProFTPD i Postfix. Jakkolwiek Nessus jest bardzo dobrym narzędziem to nie można przeceniać jego możliwości. Warto za pomocą polecenia "lsof -i" wylistować nasłuchujące usługi, a następnie sprawdzić w internecie czy wykryto w nich jakieś błędy.

Teoretyzując nad bezpieczeństwem systemu również można dojść do ciekawych wniosków.
Hipotetyczny złoczyńca mógłby wejść niespostrzeżenie do siedziby firmy i dokonać penetracji sieci korzystając z komputera, którego użytkownik zostawił otwartą sesję i oddalił się od stanowiska. W celu zapobieżenia takim ewentualnościom nasza firma, już dawno temu, wprowadziła elektroniczne karty chipowe, bez których nie można wejść na teren. Zdajemy sobie sprawę, że najsłabszym ogniwem systemu zabezpieczeń, jest człowiek. Z tego też względu przeprowadzamy regularne szkolenia pracowników. Uczymy m.in. jak należy tworzyć hasła, przypominamy, że pod żadnym względem nie można ich zapisywać na przyklejanych do monitora karteczkach. Uczulamy na konieczność zabezpieczenia komputera wygaszaczem ekranu z hasłem, przed oddaleniem się od stanowiska pracy. Zdumiewające jak przestrzeganie takich prostych zaleceń potrafi znakomicie podnieść bezpieczeństwo systemu. Słynny haker Kevin Mitnick, który promował w Polsce swoją książkę o wymownym tytule "Sztuka podstępu. Łamałem ludzi, nie hasła", stwierdził, że manipulując ludźmi (tzw. inżynieria społeczna) można wedrzeć się do potężnie zabezpieczonych systemów. Zagrożenie może też przyjść ze strony, z której niewielu ludzi by się go spodziewało. Odpowiednie służby państwowe, posiadają mobilne jednostki przeznaczone do nasłuchu przestrzeni celem "podsłuchiwania" wszechobecnych fal elektromagnetycznych emitowanych przez komputery, kable sieciowe, itd. Choć urządzenia takie są drogie, to nie można wykluczyć ewentualności, że znajdują się one na wyposażeniu niektórych komputerowych włamywaczy. Na szczęście siedziba naszej firmy położona jest na wysokim piętrze wieżowca i znajduje się od strony, od której dojazd ewentualnego pojazdu, z systemem nasłuchu, jest niemożliwy. Dodatkowym rozwiązaniem byłoby szyfrowanie transmitowanych danych. Rozpatrywany serwer z systemem RedHat 7.3 nie posiada indywidualnego zasilacza awaryjnego UPS. Nasza firma posiada główny UPS, do którego podłączona jest sieć energetyczna. Moim zdaniem jest to złe rozwiązanie. W przypadku braku zasilania, UPS obciążany jest przez zbędne urządzenia podłączone do sieci energetycznej. Rozwiązaniem byłoby stworzenie awaryjnej sieci energetycznej, do której podłączone byłyby tylko krytyczne elementy systemu informatycznego. Mimo wszystko optuję za zakupem dodatkowego UPSa przeznaczonego wyłącznie do zasilania serwera. Dzięki temu wyeliminujemy dodatkowe niebezpieczeństwo związane z uszkodzeniem sieci awaryjnej - np. przez elektryków manipulujących przy instalacji (takie incydenty zdarzają się w codziennym życiu). Im mniej wiadomo o systemie tym lepiej. W celu podniesienia poziomu bezpieczeństwa powinno się wyłączyć informacje o wersjach różnorakich programów.
Hasło BIOSu serwera zabezpieczone jest hasłem. To samo tyczy się boot loadera. Pod tym względem postąpiono zgodnie z zasadami sztuki. Wszystkie zabezpieczenia na nic się zdadzą, gdy złodziej wedrze się do siedziby firmy i ukradnie serwer. Może on odczytać, bez najmniejszego problemu, dane zgromadzone na dysku twardym. Taki stan rzeczy spowodowany jest brakiem szyfrowania danych w RedHat 7.3. Rozwiązaniem tego problemu byłoby zainstalowanie programu (np. w postaci łaty na kernel), który szyfrowałby dane zapisywane na dysk twardy (także do katalogu /tmp oraz na partycję swap).


3. Wnioski

Bezpieczeństwo systemu informatycznego nie jest dobrem danym raz na zawsze. System wymaga stałej pielęgnacji. Od administratora wymaga się ciągłego czuwania - śledzenia serwisów informujących o błędach w oprogramowaniu, stosowania poprawek, tworzenia kopii zapasowych, wykonywania testów penetracyjnych, śledzenia logów, używania programów sprawdzających integralność systemu plików, itd.
Błędem byłoby też skupienie się na nadzorowaniu jedynie głównego serwera z systemem RedHat 7.3. Bezpieczeństwo serwera zależy także od otoczenia, w którym on pracuje, dlatego w pracy tej wykroczyłem poza analizę wyłącznie systemu RedHat.

w3cw3c
automatyka przemysłowa