Jednym ze sposobów ochrony systemów jest wyizolowanie konkretnej usługi sieciowej, która w przypadku zdyskredytowania daje potencjalnemu napastnikowi niewielkie pole działania do przejęcia kontroli nad systemem. Owo wyizolowanie określane mianem chroot, jail w przypadku serwera Apache możemy wykonać przy pomocy modułu mod_security kojarzonego z firewall'em protokołu HTTP.

Chroot'owanie popularnych usług nie jest zadaniem łatwym, wymagane jest poznanie specyfiki działania konkretnego daemon'a, aby dostarczyć minimalne warunki do jego pracy. Czynności sprowadzają się do utworzenia nadrzędnego katalogu, który stanowić będzie przestrzeń root dla wybranej usługi, przegranie do utworzonego drzewa katalogów potrzebnych plików binarnych, wybranych bibliotek oraz podstawowych plików systemowych. Zrealizowanie takiej instalacji nastręcza często wielu kłopotów. Z pomocą przychodzi moduł mod_security, którego mało kto podejrzewa, że umożliwia on zrealizowanie szybkiego i łatwego chroot'a, do podstawowej instalacji wystarcza wpis:

SecChrootDir /chroot

Minimalna konfiguracja mod_security jest możliwa dzięki odpowiedniemu podejściu, otóż  tuż po załadowaniu wszystkich wymaganych bibliotek i otwarciu deskryptorów plików m.in. log'u  dopiero wtedy apache przełącza się na zdefiniowane środowisko chroot. Oczywiście wymagane jest dodatkowo stworzenie lokacji m.in. dla pliku z numerem pid w gałęzi /chroot, takiej jak podana jest w pliku konfiguracyjnym i ew. wykonanie symlinka do lokalizacji pierwotnej, tj. do tej zawartej w pliku uruchomieniowym (np. /etc/initd./httpd) do poprawnego zastopowania usługi.

Tak zdefiniowana konfiguracja pozwalana na dostarczenia treści statycznej w przypadku zastosowania PHP w najpopularniejszym wydaniu dla Apache czyli mod_php, możemy natknąć się na kilka problemów:

  • problem z resolve'owaniem nazw DNS'owych

problem ten da się łatwo okiełznać wystarczy dograć odpowiednie dynamiczne biblioteki, jakie biblioteki ? to łatwo dojedziemy korzystając z poleceń ldd lub/i strace. Dodatkowo do etc w /chroot dograć należy pliki hosts oraz resolv.conf  [1]

  • problem z wysyłką mail'i

wystarczy skorzystać z mini-sendmail'a [2] specjalnie dostosowanego do środowiska chroot, umieścić go std. w lokalizacji /chroot/usr/sbin/sendmail. Sam  mini-sendmail nie wystarczy należy dograć do etc w /chroot pliki passwd (wystarczy wpis dot. samego apache'a), dodatkowo należy do bin  w /chroot dograć domyślną powłokę sh wraz z wymaganymi bibliotekami [1]

  • problem z restartem apache'a w szczególności opcji graceful

niestety tego problemu nie udało mi się rozwiązać, może ktoś chętny podzieli się rozwiązaniem ? ;)

Informacje o występujących problemach standardowo znajdziemy w pliku error_log apache'a.

Tym prostym sposobem możemy w znaczący podnieść poziom bezpieczeństwa naszego systemu, oczywiście zachęcam dodatkowo do skorzystania z szeregu opcji filtrowania ruchu HTTP, do tego do czego mod_security przede wszystkim został stworzony.

[1] lista wymaganych bibliotek dla systemu CentOS 5.x i386, nie jest to z pewnościa minimalna wersja

ld-2.5.so

ld-linux.so.2->ld-2.5.so

libacl.so.1->libacl.so.1.1.0

libacl.so.1.1.0

libattr.so.1->libattr.so.1.1.0

libattr.so.1.1.0

libc-2.5.so

libc.so.6->libc-2.5.so

libdl-2.5.so

libdl.so.2->libdl-2.5.so

libnss_dns-2.5.so

libnss_dns.so.2->libnss_dns-2.5.so

libnss_files-2.5.so

libnss_files.so.2->libnss_files-2.5.so

libpthread-2.5.so

libpthread.so.0->libpthread-2.5.so

libresolv-2.5.so

libresolv.so.2->libresolv-2.5.so

librt-2.5.so

librt.so.1->librt-2.5.so

libselinux.so.1

libsepol.so.1

libtermcap.so.2->libtermcap.so.2.0.8

libtermcap.so.2.0.8

[2] http://www.acme.com/software/mini_sendmail/