Zabezpieczanie Apache


Original: http://www.seaglass.com/apache/securing-apache.html
Copyright: Kyle Dent

Ten artykuł został pierwotnie opublikowany w magazynie sysadmin w maju 1999 roku. To jest więcej niż dziesięć lat, teraz, ale to jest nadal zaskakująco prawdziwe i istotne. Jest kilka rzeczy, które datę, ale w przeciwnym razie to jeszcze przydać. To główne korzyści przechodzi przez jak uruchomić Apache w chroot. Obecnie, może być lepiej z BSD więzieniu lub wirtualny system do izolacji serwera WWW, ale Przechodzenie wciąż tanie, łatwe alternatywa.

Jeśli witryna sieci Web jest udostępniona na świecie lub nawet tylko do sieci (sieć może być Twój świat), jesteś nie tylko dostarczając wszystkie informacje i funkcje, które przewidywał za arcydzieło usability i projektowania, ale również portal z które niesmaczny znaków może przypuścić atak na system. W tym artykule przyjrzymy się kilku kroków, które można podjąć, aby zaostrzyć swoją obronę. Ale należy pamiętać, że ta dyskusja jest tylko jedna mała część twojego ogólnego bezpieczeństwa sieci. Musisz zacząć od ogólnego planu bezpieczeństwa, która obejmuje dowolną liczbę potencjalnych luk. To nie jest warte swoje wysiłki w celu zabezpieczenia serwera sieci Web, gdy każdy niewyszukany, niedoszły haker może telnet do tego samego systemu z konta gościa, dostęp korzeń zysk, i korzystać z aplikacji i plików jako prywatny plac zabaw. Istnieją ważne koncepcje bezpieczeństwa, takie jak tworzenie kopii zapasowych, audytu, monitorowania i sieci, które są niezbędne dla bezpiecznej eksploatacji systemu. Dwa tematy najczęściej poruszane w bezpieczeństwie serwera WWW: uwierzytelnianie użytkowników i SSL zostały pokryte w lutowym numerze Sys Admin więc skupię się na defensywnego administracji Web dla serwera Apache.

[Przejdź do komentarzy]

W realizacji któregokolwiek z tych środków, należy zawsze rozważyć kompromisów pomiędzy bezpieczeństwem a koszty / convenience. Zastanów się, które z technik opisanych tutaj będą pasować do ogólnego planu bezpieczeństwa i sensu za pracę i użytkownicy starają się osiągnąć. Weź również pod uwagę to, czego chronić. Jeśli numer klienta karty kredytowej lub innych prywatnych informacji, a surowość planu zabezpieczeń powinien odzwierciedlać. Od samego początku, Apache stanowi część środków ochrony w ramach konfiguracji. Mamy możliwość, aby uniemożliwić użytkownikom ustawienia katalogów nadrzędnych i aby serwer WWW z następujących łączy symbolicznych, wyświetlanie listy katalogów i pozwalając Server Side Includes. Powinniśmy skorzystać się z tych wszystkich zabezpieczeń, włączając następujące linie w pliku konfiguracyjnym serwera WWW:
Brak AllowOverride
Brak opcji
pozwalają z każdego

Poprzez zabronienie dowiązania, użytkownicy lub napastnicy uniemożliwia tworzenie powiązań w obszarach podlegających ich dokumentów do innych części systemu, które nie są przeznaczone do wyświetlania za pośrednictwem serwera WWW (/ etc / passwd na przykład). Jest to mniejszy problem po uruchomieniu serwera sieci Web w chroot (patrz poniżej), a może chcesz wyjechać, że opcja jest włączona ze względu na wydajność. Ponownie należy podejmować decyzje oparte na stan zabezpieczeń i konieczność zaspokojenia swoich użytkowników “lub klientów lub szefa wymagania. Uniemożliwienie indeksy katalogów to prosty sposób, aby zapobiec uzyskiwaniu mając zbyt wiele informacji o swojej witrynie. Prawdą jest, że wpis nie będzie wyświetlany, jeśli istnieje plik indeksu w miejscu, ale jeśli plik jest zmieniana lub przypadkowo usunięte, napastnicy będą mieli okazję do zbierania wszelkich informacji, mogą wykorzystać przeciwko witrynie. Server Side Includes to ryzykowna propozycja nie dostarczając wiele wartości do Twojej witryny. Oni również nie zrobić dla ciebie wydajności serwera WWW. Chyba, że ​​masz jakiś dobry powód, aby użyć tej funkcji, należy rozważyć alternatywne rozwiązania. Jeśli potrzebujesz, aby włączyć opcjonalnych lub alternatywne dla określonego obszaru witryny sieci Web, można to zrobić w innymsekcji dla konkretnego katalogu tylko.

Po ustanowieniu swojej konfiguracji serwera (lub jego część), można zastanowić się, jak chronić konfiguracyjne i inne pliki ze zmianami przypadkowymi lub złośliwe. Jedna ważna podmiot zabezpieczeń przenika moje podejście do obrony administracji sieci Web jest koncepcja najmniejszych uprawnień. Ideą najmniejszych uprawnień jest dostęp jest przyznawany tylko do tych użytkowników lub procesów, które rzeczywiście jej potrzebują do wykonania swojej pracy. Będziemy stosować to pojęcie pierwszy uprawnień plików.

[Przejdź do komentarzy]

Wielu ekspertów zaleca, aby utworzyć konto lub grupę specjalnie dla administracji serwera WWW. Użytkownicy, którzy są odpowiedzialni za zarządzanie WWW uzyska dostęp do konta lub dodane do grupy. To może mieć sens w sytuacji, w której kilka osób Prace w konfiguracji serwera WWW, ale inaczej nie masz prawa w systemie. Bardziej prawdopodobne jest jednak, że ludzie, którzy zajmują się Web Administration również zajmować się administracją systemu i będzie miał dostęp do konta root. Po uruchomieniu serwera WWW na standardowym porcie 80 lub 443 dla protokołu SSL, trzeba roota mimo to należy ją uruchomić. Kolejną zaletą korzystania z konta roota jest to, że normalne procedury korzystania korzeń będzie na miejscu do administracji sieci Web, jak również, zapewniając rejestrowanie i odpowiedzialności, gdy administratorzy dokonać konfiguracji lub innych zmian na serwerze sieci Web.

Musisz także wybrać identyfikator logowania dla procesu Web serwera. Jak wskazano, musisz być root, aby uruchomić serwer, ale plik konfiguracyjny pozwala określić id dla demona, aby przełączyć się do normalnej pracy (po rozruchu). Domyślnie, Apache jest skonfigurowana do pracy jako użytkownika “nobody”. Jednakże, jeżeli istnieją inne “nikt” procesami w systemie, mogą mieć taki sam dostęp jak serwer WWW, który nie jest dobrym pomysłem. Lepszym pomysłem jest stworzenie identyfikatora i grupę używaną przez serwer WWW wyłącznie. Załóżmy, że pliki konfiguracyjne są własnością roota i że stworzyliśmy id “http” i grupa “http” na serwerze sieci Web sama. Upewnij się, że “http” faktycznie nie może zalogować się na komputerze. Jednym ze sposobów na to jest do ustawienia konta shell na coś nieprawidłowego, np. / dev / null.

Teraz, gdy już ustalono kto powinien posiadać pliki, należy określić, kto powinien mieć dostęp do tych plików. Najmniej przywilej wskazuje, że pliki konfiguracyjne powinny być zapisywalne przez root i czytelne przez serwer WWW, ale inaczej niedostępne dla nikogo innego. Tak więc, na przykład, jeśli serwer działa jako “http”, a następnie demon Apache i plik konfiguracyjny będzie wyglądał tak:

– X —— korzeń httpd http
rw-r —– korzeń httpd.conf http

[Przejdź do komentarzy]

Jeśli używasz innych plików konfiguracyjnych, powinny one być ustawione tak samo jak httpd.conf. Tak więc, jeśli atakujący cel systemu, będzie to dla nich trudne do zbadania witryny konfiguracji lub modyfikacji. Poprzez ograniczenie dostępu do httpd, to będzie trudne dla kogoś zastąpić demona z wersją leczył-up. Pliki witryny sieci Web są same prawdopodobnie ma być dostępny na świecie. Jednakże, jeśli chcesz się upewnić, że dokumenty są dostępne tylko za pośrednictwem serwera sieci Web lub jeśli chroniona dokumenty wymagające hasła za pośrednictwem serwera WWW, będzie prawdopodobnie chcesz, aby dokręcić zabezpieczeń trochę na plikach, jak również. Oczywiście programy CGI gwarantuje ochronę przed nieautoryzowanymi zmianami i powinny być strzeżone starannie.

Użytkownicy, którzy są odpowiedzialni za treści powinien posiadać pliki i być w stanie napisać do nich, a serwer WWW musi odczytu. Powinieneś mieć listę plików jak następuje:

rw-r —– jsmith http index.html
rw-r —– jsmith http blueball.gif

Skrypty CGI powinny być również do odczytu i zapisu z konta użytkownika odpowiedzialnego za nich, a serwer WWW musi być w stanie je wykonać. Dla interpretowanych programów, takich jak powłoki lub skryptów Perl, serwer WWW musi czytać i uprawnienia do wykonywania. Skompilowane pliki binarne nie będą wymagać grupa odczytu.

rw-r-x — jsmith http script1.pl
rw-r-x — jsmith http script2.sh
rw — x — jsmith http Script3

Mimo, że zostały ustawione ograniczające uprawnienia programów CGI, wciąż stanowią poważne zagrożenie dla bezpieczeństwa dla administratora sieci Web. Wszystkie twoje starannie spreparowanych plików konfiguracyjnych i instalacja serwera może zostać podważona w jednej chwili z jednym złośliwy lub niedbale napisane programu CGI. Należy poważnie rozważyć wymagające kod i przegląd bezpieczeństwa wszystkich programów zainstalowanych CGI z serwerem WWW. Nie zawsze jest to możliwe, oczywiście, więc rozważmy kilka innych kroków, które można podjąć, aby zmniejszyć swoją ekspozycję.

[Przejdź do komentarzy]

Jeśli jesteś gospodarzem wielu witryn, a nawet kilka katalogów do różnych użytkowników, należy rozważyć wdrożenie jednego z programów do wykonywania swoich otoki applictions CGI. Programy te umożliwiają uruchomienie skryptu jako użytkownik odpowiedzialny za skrypty i nie jako na konto serwera sieci Web. Apache zawiera moduł o nazwie suexec który zapewnia dokładnie tę funkcję. Inną opcją jest nazywany CGIwrap. Zapewnia dodatkowe kontrole bezpieczeństwa, jak również metoda zmiany id uruchomionego programu CGI. Jeśli skrypty trzeba pisać do plików, pliki te mogą być własnością użytkownika odpowiedzialnego za nimi, i będą dostępne za pośrednictwem tego konta tylko. Jeżeli nie jest możliwe wykorzystanie otoki, pliki, które muszą być napisane przez program CGI powinny być własnością użytkownika odpowiedzialnego i ustawić do grupy “http” z zapisem grupy (i czytać, jeśli to konieczne) uprawnienia zestaw.

Czy używasz otoki, należy ograniczyć CGI wykonanie konkretnych katalogów. Chociaż Apache może być skonfigurowany, aby umożliwić wykonywanie dowolnych plików na podstawie rozszerzenia, może to otworzyć drzwi, które nie mogłyby być dostępne dla atakującego. To również pomoże zapewnić, że tylko zbadane, zatwierdzone skrypty zostały przesłane i że ci, na miejscu nie zostały zmienione.

Jeśli używasz Perl, użyj kontroli zmiany barwy i włączyć ostrzeżenia. Ostrzeżenia ostrzega o potencjalnych problemach kodujących lub problemów, które możesz mieć ze zmiennych. Są to rodzaje błędów, które mogą być wykorzystywane przez zaawansowanych hakerów. Kontrole skaza będzie generować komunikaty o błędach, jeśli spróbujesz użyć żadnych wartości, które zostały dostarczone bezpośrednio przez użytkownika. Możesz untaint takich wartości, porównując je z wyrażenia regularnego, które przypuszczalnie zapewnić ich bezpieczne użytkowanie. Na przykład, możesz użyć wyrażenia regularnego, które paskach z wszystkich znaków innych niż litery lub cyfry zanim przekażesz takiej wartości do powłoki do wysyłania poczty. Zapewnienia kontroli zmiany barwy i ostrzeżeń za pomocą-T i W-flagi. Tak więc pierwsza linia skryptów wygląda tak:

#! / Usr / local / bin / perl-Tw

[Przejdź do komentarzy]

Można by, oczywiście, korzystać z własnej ścieżki do Perl binarny. Jeśli nie używasz tych flag, wiele skryptów będzie rzygać komunikaty o błędach zamiast przędzenia jak szczyty kiedyś, ale będzie to warte swoich wysiłków, aby dowiedzieć się dlaczego Perl narzeka i rozwiązać problemy. Istnieje kilka zasobów on-line, które omawiają zagadnienia bezpieczeństwa CGI bardziej szczegółowo. Dwa ważne źródła to World Wide Web Security FAQ na witrynie sieci Web Consortium i bezpieczne CGI dokumencie programowym.

Jednym z najbardziej skutecznych technik pojedynczych obronnych można zatrudnić z serwera sieci Web jest uruchamianie go w chroot. Chroot UNIX (1M) tworzy nowy katalog główny dla danego polecenia. Uruchomienie serwera WWW z chroota zasadniczo tworzy zawarte przegrodę na serwerze sieci Web, izolując go od reszty systemu. Poprzez uruchomienie serwera WWW z własnym root, jeśli ktoś udaje się zachwiać zabezpieczenia serwera sieci Web lub błędny program CGI działa amok, uszkodzenie znajduje się do przedziału Web zostały utworzone. Pliki systemowe i programy nie będzie dostępny dla każdego, kto przyjeżdża przez serwer WWW.

Trudności w tworzeniu chroota leży w ustalaniu, co minimalny zestaw bibliotek będzie wymagane, aby uruchomić serwer WWW i innych funkcji, które realizują w ramach swojej stronie internetowej. Niestety, to będzie się zmieniać między platformami, więc nie ma proste instrukcje do wszystkich sytuacji. Być może trzeba będzie przeglądanie systemu dokumentacji i eksperymentować na własną rękę. Na systemie SGI przy użyciu binarnego Stronghold uzyskanych od C2 sieci, serwer WWW wymaga chroot przynajmniej następujące pliki w katalogu / lib z serwera WWW skutecznej root:

-R-xr-xr-t korzeń sys libc.so.1pthread_sigmask
-R – r – r – root sys libdisk.so
-R – r – r – root sys libgen.so
-R – r – r – root sys libm.so
-R – r – r – root sys libmalloc.so
-Rwxr-xr-x korzeń sys rld

Sam serwer WWW wymaga pewnych bibliotek w zależności od tego, jak został skompilowany. Jeśli budować własne, możesz zbudować go statycznie, aby zminimalizować wymagania chroot. Sun i Linux zapewniają polecenia ldd, którego można użyć w celu określenia, które dokładnie współdzielone biblioteki szczególności binarne wymagające w celu wykonania. SGI używa elfdump polecenia. Sprawdź strony podręcznika w systemie dla poleceniem ldd lub zrzutu.

[Przejdź do komentarzy]

Oprócz kopiowania bibliotek w środowisku chroot, można również zmodyfikować serwera Web pliku konfiguracyjnego (lub pliki), ponieważ jego widok wszechświata zmieniło. Jeśli wcześniej miał DocumentRoot / usr / local / etc / httpd / htdocs, ale teraz zaczyna serwera WWW chroot do katalogu / usr / local / etc / httpd, trzeba będzie zmienić DocumentRoot do / htdocs. Wszelkie inne informacje ścieżka jakiekolwiek pliki konfiguracji będzie również wymagać modyfikacji.

Wszelkie programy CGI, które używają ścieżek bezwzględnych będzie również wymagać zmiany. Jeśli skrypty użyć Perl lub innego tłumacza, że ​​tłumacz i jego biblioteki będą musiały być zainstalowane w chroot. Zastanów się dobrze, co zainstalować w swoim przedziale Web. Mniej, który jest dostępny, bezpieczniejsza być. Ponownie, musisz ważyć kompromis między bezpieczeństwem i co trzeba aby dostać pracę. Jednakże, jeśli zdecydujesz się pozwolić tylko skompilowanych programów CGI wewnątrz przedziału WWW, interpreter Perl nie będzie dostępne dla hakerów do wykorzystania.

Przyjrzyjmy się przez przykład stworzenie chroota. Zaczniemy katalogu / usr / local / www / i ustawić serwer Web root do / usr / local / web / site, więc musimy stworzyć następujące katalogi:

/ Usr / local / web / site
/ Usr / local / web / www / htdocs
/ Usr / local / web / www / cgi-bin
/ Usr / local / web / www / logs
/ Usr / local / www / conf

Potrzebujemy również niektóre katalogi dla chroot się do pracy. Katalogi te będą zawierać minimalne pliki do symulacji rzeczywistego systemu plików na komputerze.

/ Usr / local / web / site / lib
/ Usr / local / web / site / usr / bin
/ Usr / local / web / site / etc

Serwer sieci Web będą musieli być w stanie rozwiązać hosta na adresy IP, więc będziesz musiała stworzyć odpowiednią hostów lub resolv.conf w katalogu / usr / local / web / site / etc. Pamiętaj, że może trzeba eksperymentować, aby uzyskać wszystko, czego potrzebuje system, a może trzeba będzie zawierać dodatkowe pliki i katalogi, jeśli uruchomić inne programy od wewnątrz chroot serwera WWW. Przeprowadzenie niezbędnych bibliotek i innych plików do odpowiednich katalogów.

[Przejdź do komentarzy]

Katalog / usr / local / www / conf będzie zawierać nasze pliki konfiguracyjne serwera WWW, ale zauważ, że jest to poza nowym katalogu tworzymy. Użyjemy skrypt startowy, które kopiuje pliki niezbędne do chroot, uruchomić serwer WWW, a następnie usunąć pliki konfiguracyjne z przedziału serwera WWW. Zatem, gdy serwer WWW został uruchomiony, pliki te nie będą dostępne dla każdego, kto uzyskuje dostęp do witryny.

Bez chroot, nasz httpd.conf zawiera następujące wiersze:

DocumentRoot / usr / local / www / www / htdocs
ScriptAlias ​​/ usr / local / web / www / cgi-bin / / cgi-bin /
TransferLog / usr / local / web / www / logs / access_log
ErrorLog / usr / local / web / www / logs / error_log
PidFile / usr / local / web / www / logs / httpd.pid

Te linie muszą być zapisane jako:

DocumentRoot / htdocs
ScriptAlias ​​/ cgi-bin / / cgi-bin
TransferLog / logs / access_log
ErrorLog / logs / error_log
PidFile / logs / httpd.pid

Następnie, za pomocą skryptu, który wykona następujące czynności:

Przenoszenie plików konfiguracyjnych na miejsce.
Wykonać polecenie, które zapewni chroot i zaczyna httpd.
Usuń pliki konfiguracyjne.

Jeśli używasz serwera SSL, będzie również chcesz skopiować certyfikat i kluczowe pliki na miejsce i usunąć je raz serwer został uruchomiony. Po uruchomieniu skryptu, jeśli sprawdzić tabelę procesów, zobaczysz, że demon jest rzeczywiście działa. Jeśli tworzysz skrypt CGI, aby wyświetlić listę plików i wykonać go z przeglądarki, zobaczysz, że wszystko powyżej / usr / local / www / strona jest całkowicie niedostępny. Serwer sieci Web cała świat istnieje poniżej tego punktu.

[Przejdź do komentarzy]

Teraz, gdy stworzyliśmy wydzielone pomieszczenie, należy rozważyć bardzo dokładnie wszystko, co umieścić w nim. Warto myśleć o tym przedziale jako dostępne do świata, więc wszystko w nim jest potencjalnie dostępne. Weź również pod uwagę, że wszystko w zasięgu może być wykorzystywane przez napastników przed swoim systemie. Użyj tej odległości do najwyższej jakości. Zastanów się stronę, która gromadzi informacje klientów karty kredytowej i zapisuje je w systemie. Idealnie, jeśli chcesz przechwycić informacje przez serwer sieci Web, ale przechowuje dane w innym miejscu niż w Twoim odsłoniętej komorze internetowej. Można to osiągnąć przez uruchomienie skryptu, który nie jest ograniczony do przedziału internetowy, który okresowo chwyta informacje i usuwa go z chroota, co czyni go całkowicie niedostępna za pośrednictwem dowolnego dostępu do serwera sieci Web. Można również stworzyć demona, aby służyć jako pomost pomiędzy przedziału Web i innego bezpiecznego miejsca w sieci do przechowywania poufnych informacji. Twoje skrypty CGI mógł przesłać informacje przez demona, które następnie prześle je do obszaru bezpiecznego. W ten sposób nigdy nie dane muszą zostać zapisane w twoim przedziale Web. Jeśli można wystarczająco zabezpieczyć miejsce przechowywania, prawdopodobnie nawet nie pozwalając dostęp z zewnątrz sieci, ekspozycja zostanie zmniejszone znacznie.

Jeśli pozwalają na to zasoby można także wyodrębnić cały komputer jako serwer WWW, uniemożliwiając innego rodzaju usług sieciowych na niej. Należy nadal stosować wiele technik opisanych powyżej w celu ochrony integralności urządzenia, ale można umieścić specjalną maszynę serwera WWW poza zaporą i zachować wszystko inne bezpiecznie za nim.

Jeśli zastosujemy się do wszystkich kroków opisanych powyżej i wdrożyć każdą możliwą techniką bezpieczeństwa, nie można definitywnie oświadczyć, że Twój system jest teraz bezpieczne. Z bezpieczeństwem, są tylko stopnie bardziej bezpieczne i mniej bezpieczne. Twoja praca jako administrator jest zastosowanie metody odpowiednie dla danego środowiska i planu bezpieczeństwa i utrzymać zegarek sumiennego do nieautoryzowanego dostępu. Monitoring i regularne audyty są konieczne dla dalszej “bardziej bezpieczne” działania serwera sieci Web. Defensive administracja serwer internetowy jest on-going zadaniem.

Dodatkowe zasoby

http://www.w3.org/Security/Overview.html
http://downloads.securityfocus.com/library/safe-cgi.txt (dead link)
http://www.apache.org/docs/misc/security_tips.html