NFsec Logo

Partycje, a bezpieczeństwo systemu Linux

02/04/2010 w Bezpieczeństwo 1 komentarz.  (artykuł nr 243, ilość słów: 1590)

W

trakcie instalacji systemu Linux zostajemy poproszeni o dokonanie podziału dysku twardego na partycje. Niektóre dystrybucje Linuksa oferują nawet automatyczne ich przydzielanie. Ilość tych partycji może wpłynąć na poziom bezpieczeństwa systemu. Dlatego rezygnując z automatyzacji tego procesu jesteśmy w stanie własnoręcznie przystosować dysk do bezpieczeństwa instalowanego systemu.

     Jak wiemy partycje to obszary na dysku twardym zarezerwowane dla określonego systemu plików. Linux posiada tą właściwość, że już przy podziale dysku na partycje (w zależności od ich ilości) zostaje ustalony pewien poziom bezpieczeństwa. Dzieląc nasz dysk twardy na jak najwięcej przydatnych partycji zyskujemy możliwość zastosowania bardziej rygorystycznej kontroli nad poszczególnymi systemami plików oraz nad sposobami ich montowania w systemie, ułatwiamy tworzenie kopii zapasowych i administracje nad całym systemem, a co najważniejsze pliki systemowe oddzielone są od plików użytkowników, skutkiem czego jest zmniejszenie szans na wykorzystanie przez intruza programów typu SUID i kontroli nad krytycznymi zasobami naszego systemu.

Wyobraźmy sobie Linuksa zainstalowanego na jednej partycji: katalogi użytkowników i katalog główny znajduje się na tej samej partycji, administrowanie systemem jest praktycznie niewykonalne, wykonywanie aktualizacji systemu czy tworzenie jego kopii zapasowych jest bardzo kłopotliwe i czasochłonne, system jest na tyle niestabilny, że nawet niewielkie uszkodzenie pliku może doprowadzić do pojawienia się kłopotów z całym systemem. Każdy użytkownik może przeprowadzić atak DoS poprzez zapełnienie wolnego miejsca. Także widzimy, że ta operacja nie posiada w ogóle sensu. Wraz z oddzielaniem poszczególnych obszarów systemu zyskujemy jego większą stabilność, zwiększony poziom bezpieczeństwa, kontrole nad sposobem montowania poszczególnych partycji w naszym systemie.

Dla przykładu podzielmy dysk twardy na sześć partycji – podziału na partycje możemy dokonać programem fdisk (pochodzącym z Linuksa nie Windowsa) lub cfdisk. Ważnym elementem podziału dysku na partycje jest, aby dwie lub trzy pierwsze partycje posiadały status podstawowych (ang. primary), a reszta logicznych utworzonych na partycji rozszerzonej (ang. extended – w architekturach opartych na procesorach Intela można utworzyć, co najwyżej cztery partycje podstawowe lub trzy partycje podstawowe, jedną partycję rozszerzoną i kilka partycji logicznych).

  • Pierwszą partycją będzie partycja wymiany, czyli Linux Swap (kod identyfikatora partycji: 82 – zmieniamy go klawiszem T w fdisk),
  • Drugą partycją będzie partycja podstawowa: / – root (kod identyfikatora partycji: 83),
  • Trzecią partycją będzie partycja dla użytkowników systemu: /home,
  • Czwartą partycją będzie partycja na pliki tymczasowe: /tmp,
  • Piątą partycją będzie partycja na pocztę i logi systemowe: /var,
  • Szóstą partycją będzie partycja na programy, dokumentację itp.: /usr.

Podział ten jest tylko podziałem przykładowym (choć przyjmowanym za podstawowy), ponieważ partycji może być znacznie więcej – ich ilość zależy głównie od usług jakimi chcemy dysponować. Na przykład siódmą partycją może być partycja na cache serwera proxy (/cache), na zasoby serwera ftp (/ftp) lub stronę web (/httpd) – możemy także zwiększyć naszą liczbę partycji poprzez dodaje jako drugiej partycji /boot – gdzie są przechowywane pliki uruchamiające system – między innymi jądro Linuksa, lub dobrym pomysłem jest także stworzenie osobnych partycji dla oprogramowania pozasystemowego. Według standardu hierarchii plików poprzez utworzenie osobnych partycji /opt oraz /usr/local podczas reinstalacji systemu nie tracimy przechowywanych na nich dodatkowych programów.

Natomiast jeśli chodzi o pojemność poszczególnych partycji to jest ona kwestią osobistego wyboru użytkownika i tylko w niektórych przypadkach zależna od różnych czynników np. wielkość partycji /home zależy od posiadania przewidywalnej ilości użytkowników oraz pojemności konta każdego z nich. Niektóre z tych czynników są wzajemnie powiązane. Jeżeli na przykład przewidujemy udostępnienie naszego systemu wielu użytkownikom i chcemy udostępnić im usługi pocztowe to rozmiar partycji /var powinien być odpowiednio proporcjonalny do partycji /home. Także jeśli chcemy posiadać właściwy stopień bezpieczeństwa oraz ułatwić sobie późniejszą administrację systemem – oddzielamy od siebie partycje: /, /home, /tmp, /var, /usr. Absolutnym minimum jest wydzielenie osobnej partycji dla katalogu głównego (/). Dodatkowo dzięki podziałowi dysku twardego możemy określić opcje montowania poszczególnych systemów pliku w naszym systemie z osobna, co dodatkowo przyznaje nam większe pole manewru w podniesieniu poziomu bezpieczeństwa. Odpowiedzialny za tę operacje jest plik /etc/fstab, z którego odczytywane są wszystkie dostępne systemy plików i montowane według podanych w nim reguł. Każdy wiersz w tym pliku odpowiada jednemu systemowi plików. Taki wiersz składa się z sześciu pól:

  • (s_block_dev) to pole jest specyfikacją systemu plików. Podaje się tu albo nazwę urządzenia blokowego, albo system plików, który ma być montowany.
  • (mount_point) to pole jest plikiem lokalizującym system plików, czyli punkt montowania.
  • (fstype) to pole jest typem systemu plików, czyli tutaj podajemy rodzaj montowanego systemu plików.
  • (mntops) to pole jest opcją montowania. Tu określamy zakres dostępu, jaki do danego systemu plików będą mieli użytkownicy i system. Zawartość tego pola ma więc znaczenie dla bezpieczeństwa systemu.
  • (freq) pole to określa parametr tworzenia kopii zapasowych danego systemu plików.
  • (passno) pole to określa liczbę określającą kolejność sprawdzania integralności systemu.

Oto przykładowy wpis pliku /etc/fstab:

/dev/sda1     swap     swap     defaults     0    0
/dev/sda2     /        ext3     defaults     1    1
/dev/sda3     /boot    ext3     defaults     1    1
/dev/sda5     /home    ext3     defaults     1    1
/dev/sda6     /tmp     ext3     defaults     1    1
/dev/sda7     /var     ext3     defaults     1    1
/dev/sda8     /usr     ext3     defaults     1    1

Jak możemy zauważyć niektóre z tych partycji są niepotrzebnie montowane z przyznaniem zbyt dużych przywilejów, wyznaczonych opcją defaults (read-write, suid). Przywileje te możemy ograniczyć takimi opcjami jak: rw – możliwy odczyt i zapis; ro – znacznik ro powoduje zamontowanie plików w trybie tylko do odczytu, powstrzymując wszystkie modyfikacje informacji dotyczących plików, włączając w to na przykład czas dostępu do pliku. Opcja ta jest bardzo przydatna w przypadku systemów używanych jako katalog plików dla potrzeb demona httpd – pozwala na zachowanie niezmienionych danych; nosuid – znacznik ten zapobiega uwzględnianiu bitów set-UID oraz set-GID w przypadku dowolnego pliku wykonywalnego. Ponadto pomoże uniknąć wykorzystaniu określonych “sztuczek”, używanych w celu złamania zabezpieczeń w przypadku przerwania “pierścienia zabezpieczeń”; nodev – znacznik ten zapobiega rozpoznawaniu przez jądro dowolnych plików urządzeń, znajdujących się w systemie plików. Jeżeli nie istnieje żaden powód użycia plików urządzeń w danym systemie plików, użycie tej opcji zapobiegnie złamaniu zabezpieczeń poprzez utworzenie urządzeń hda1 lub sda1 z prawami zapisu dla wszystkich użytkowników. Jest to szczególnie przydatne w przypadku korzystania z czytników CD-ROM oraz NFS; noexec – ten znacznik zapobiega wykonywaniu plików wykonywalnych w danym systemie plików. Jest on szczególnie przydatny w przypadku tych systemów plików, w których nie powinny być umieszczone żadne pliki wykonywalne, na przykład obsługujących repozytoria serwera Apache (httpd) dla plików innych niż skrypty CGI; Prawa te powinniśmy ograniczyć co najmniej w odniesieniu do partycji /home. zawierającej katalogi domowe poszczególnych użytkowników. W przedstawionym przypadku ograniczone zostały partycje /home, /tmp i /var, co daje nam większy stopień bezpieczeństwa:

/dev/sda1     swap     swap     defaults     0    0
/dev/sda2     /        ext3     defaults     1    1
/dev/sda3     /boot    ext3     defaults     1    1
/dev/sda5     /home    ext3     defaults,rw,nosuid,nodev,noexec     1    1
/dev/sda6     /tmp     ext3     defaults,rw,nosuid,nodev,noexec     1    1
/dev/sda7     /var     ext3     defaults,rw,nosuid,noexec     1    1
/dev/sda8     /usr     ext3     defaults,rw,nodev     1    1

Dodanie tych flag spowoduje, że na wszystkich tych partycjach pliki z bitem SUID jak i urządzenia blokowe, i znakowe będą “ignorowane”. Na ogół zastosowanie setuid i setgid powinno ograniczać się jedynie do tych partycji, w których prawa zapisu ma wyłącznie root. Osobiście zalecam jawną blokadę użytkowania setuid i setgid w katalogu /home za pomocą opcji nosuid w pliku /etc/fstab. Zauważmy, że zaznaczona jest także opcja No Special Device File Support (opcja nodev) – zapobiega ona utworzeniu urządzenia blokowego w systemie plików /home, /tmp, co byłoby czynnością wysoce podejrzaną, gdyby miał to zrobić zwykły użytkownik. Dodatkowo z partycji /tmp i /var nie będzie możliwości uruchamiania programów binarnych pochodzących z poza systemu (jeśli plnaujemy np. posiadanie Qmail’a lub inny program którego pliki binarne będą znajdowały się na partycji /var – to powinniśmy usunąć flagę noexec z opcji montowania tej partycji). Jeśli chcemy być bardziej rygorystyczni możemy flagę noexec dodać do partycji /home, tak więc użytkownicy znajdujący się w katalogu /home będą mogli tylko i wyłącznie korzystać z programów oferowanych przez nasz system. W przypadku ostatniej solucji dobrym rozwiązaniem dla nas by było stworzenie własnej partycji (np. /admin) gdzie jako jedyni byśmy posiadali konto, w ten sposób jesteśmy w stanie ominąć własne restrykcje. Oczywiście konto to musi być bardzo dobrze strzeżone z uwagi na to, iż z niego można przeprowadzić atak z użyciem programów pochodzących z poza systemu.

Więcej informacji: man fdisk, man mount, man fstab, quota, control mounting a file system

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , ,

1 komentarz.

  1. Oprócz katalogu /tmp istnieje jeszcze /var/tmp, który możemy podmontować z opcją bind (man 8 mount) do katalogu /tmp. Wystarczy dodać do pliku /etc/fstab przykładowy wpis:

    /tmp   /var/tmp   none   rw,noexec,nosuid,nodev,bind 0 0