Jest kilka warstw, które musisz chronić.
Niektórzy z usługodawców niepoprawnie polegać na "zabezpieczeniach" PHP, takich jak open_basedir, safe_mode (starsze PHP), disable_functions itp.
Nawet PHP NIE uważa ich za funkcje bezpieczeństwa - http://php.net/security- note.php
Można je wyłączyć dowolnym exploitem dla PHP, a wtedy cały system jest zgubiony, nie rób zrób to.
Jak to zrobić
dół
- Oddzielny użytkownik na poziomie systemu operacyjnego/systemu dla każdej hostowanej witryny
- poprawne uprawnienia (jedna strona nie może wyświetlać/edytować strony drugiej) - upewnij się również, że podkatalogi mają odpowiednie uprawnienia, ponieważ będą podobne
- oddzielne pliki sesji (DUŻO webhostingów umieszcza pliki sesji każdej witryny hostowanej przez PHP w tym samym katalogu, to źle, źle, źle!
Apache wreszcie dostał swój własny moduł do tego - Apache MPM-ITK .
Krótka historia: wyobraź sobie to tak, jakbyś dał użytkownikowi powłokę na komputerze (pod jego własnym uid) — nie może on nic zrobić z innymi hostowanymi witrynami.
- inny uid/gid
- uprawnienia systemowe
- frameworki, takie jak SELinux, AppArmor i podobne
- grsecurity jeśli chcesz być hardkorowy... ale system będzie trudniejszy w utrzymaniu.
w górę?
Możesz uzyskać więcej hardkoru. Najlepsze, jakie widziałem, to biblioteka współdzielona dla apache (lub czegokolwiek, czego używasz) - która jest używana, gdy apache jest uruchamiany przy użyciu LD_PRELOAD
i implementuje wszystkie potencjalnie złośliwe wywołania systemowe, takie jak system()
, execve()
i w zasadzie każde inne połączenie, które uznasz za złe.
Nie widziałem jeszcze dobrej implementacji tego (innej niż gdzieś niestandardowej) - popraw mnie, jeśli się mylę.
Upewnij się, że wprowadziłeś do tego białą listę, jak np. mail() w PHP domyślnie wykonuje sendmail i to już nie będzie działać.
konkluzja
Dodaj klasyczne disable_functions, open_basedir, itp. do globalnego php.ini, dodaj session.save_path do każdego vhosta - umieść sesje w katalogach użytkowników. Upewnij się, że użytkownicy nie udostępniają niczego .
Prawidłowo zaimplementuj separację na poziomie systemu operacyjnego.
Uzyskaj hardcore z wywołaniami systemowymi podpinania grsec i LD_PRELOAD lib.
Separacja, separacja, separacja… już wkrótce systemy takie jak Docker zapewnią kontenery oparte na LXC, aby oddzielić użytkowników na poziomie jądra, ale nie są jeszcze gotowe do produkcji (imho).