Jak zabezpieczyć serwer Apache?
Chrootowanie stron WWW jako zabezpieczenie przed złośliwymi użytkownikami
Wyobraźmy sobie, że nasz serwer umożliwia klientom wyświetlanie ich stron z zastosowaniem PHP. Wystarczy, że któryś z nich będzie chciał wykonać następujący kod php:
include "/etc/passwd"
W znakomitej większości przypadków spowoduje to wyświetlenie zawartości pliku /etc/passwd. Prostym, acz bardzo przydatnym rozwiązaniem tego problemu jest wykorzystanie specjalnego modułu Apache, który po załadowaniu wszystkich potrzebnych bibliotek zmusi procesy Apache’a do pracy w określonym katalogu jako katalogu głównym. Moduł ten nazywa się mod-chroot i jest dostępny w postaci pakietów w Debianie 3.0 pod nazwą libapache-mod-chroot.
Opcją ChrootDir w części głównej pliku konfiguracyjnego (dla podstawowego serwera, nie dla virtualnych domen) określamy katalog, który będzie bazowym katalogiem (powiedzmy że będzie to /data1/www). Następnie już dalsze katalogi określamy względem tego. Przykład: Przypuśćmy że mamy wirtualną domenę sklep.linuxexpert.pl i jej katalog na dysku to /data1/www/sklep.linuxexpert.pl/www/htdocs. Przypuśćmy również, że w głównym pliku konfiguracyjnym Apache’a zdefiniowaliśmy dyrektywą chrootdir katalog /data1/www jako katalog bazowy. Wtedy ścieżka DocumentRoot, czyli do strony serwisu sklepu, będzie miała postać sklep.linuxexpert.pl/www/htdocs a nie /data1/www/sklep.linuxexpert.pl/www/htdocs.
Problem poczty: Niestety, rozwiązanie to wiąże się z jednym problemem: jako że Apache działa w środowisku chroot to nie ma dostępu do binariów sendmaila (albo innego programu do wysyłania poczty). Powoduje to problemy z wysyłaniem wiadomości email z poziomu PHP. Istnieje program o nazwie mini_sendmail, który kompilowany jest statycznie (nie korzysta z żadnych bibliotek współdzielonych, których musielibyśmy kopiować do środowiska chroot) i łączy się lokalnym serwerem pocztowym przez adres 127.0.0.1. Nie jest to rozwiązanie idealne: mimo że poczta jest wysyłana, PHP nie potrafi określić że faktycznie tak się stało. Gotowe produkty korzystające z klasy PEAR do wysyłania maili należy przestawić na korzystanie z „zewnętrznego” serwera poczty (wtedy nie zgłaszają błędów) a w kodzie wysyłającym wiadomości przy pomocy funkcji mail() wygasić informowanie o błędach. Przykładowa konfiguracja PHP by korzystała z mini_sendmaila to:
php_admin_value sendmail_path "/usr/sbin/sendmail -t -ftwoj@adres.email"
Strony związane z projektem:
- http://news.gmane.org/gmane.comp.apache.mod-chroot.general – archiwum WWW listy dyskusyjnej dotyczącej projektu.
- http://core.segfault.pl/~hobbit/mod_chroot/ – strona domowa projektu
- http://freshmeat.net/projects/mod_chroot/ – strona projektu na Freshmeat.
- http://www.acme.com/software/mini_sendmail/ – strona, z której można pobrać program mini_sendmail.
Modscurity
Instalacja
Moduł jest dostępny w postaci pakietów w wielu popularnych dystrybucjach (np. Debian Sarge). W innym przypadku można go instalować w prosty sposób ze źródeł.
Problemy:
- Moduł jest rozpowszechniany w dystrybucji Debiania z dwoma przykładowymi plikami konfiguracyjnymi: z minimalną konfiguracją i pełną konfiguracją. Pełna konfiguracja zawiera testy cookies, które nie są zgodne z gotowymi forami m.in. PHPBB2.
- Pełny plik zawiera opcje logowania zdarzeń, jeżeli tego nie wyłączymy urośnie on w szybkim czasie do niebotycznych rozmiarów.
Strony związane z projektem:
- http://www.modsecurity.org/ – strona domowa projektu.
- http://www.debian-administration.org/?article=65 Instalacją modsecurity w Debianie