Има няколко слоя, които трябва да защитите.
Някои от хостеритенеправилно разчитайте на PHP "защити" като open_basedir, safe_mode (по-стари PHP), disable_functions и т.н.
Дори PHP НЕ ги счита за защитни функции - http://php.net/security- note.php
Те могат да бъдат деактивирани с всеки експлойт за PHP и тогава цялата система е обречена, не направи това.
Как трябва да се направи
отдолу
- Отделен потребител на ниво ОС/система за всеки хостван сайт
- правилни разрешения (едното не може да преглежда/редактира страницата на другото) – също така се уверете, че поддиректориите имат правилно разрешение, тъй като те ще бъдат подобни
- отделни сесийни файлове (МНОГО уеб хостинги поставят сесийни файлове от всеки хостван PHP сайт в една и съща директория, това е лошо лошо лошо!
Apache най-накрая получи свой собствен модул за това - Apache MPM-ITK .
Накратко: Представете си това, както бихте дали на потребителя обвивка на машината (под неговия собствен uid) - той не може да направи нищо с другите хоствани сайтове.
- различен uid/gid
- системни разрешения
- фреймворки като SELinux, AppArmor и други подобни
- grsecurity, ако искате да сте хардкор.. но системата ще бъде по-трудна за поддръжка.
нагоре?
Можете да получите повече хардкор. Най-доброто, което съм виждал, е споделена библиотека за apache (или каквото и да използвате) - която се използва, когато apache се стартира с LD_PRELOAD
и изпълнява всички потенциално злонамерени системни извиквания като system()
, execve()
и по същество всяко друго обаждане, което смятате за лошо.
Все още не съм виждал добра реализация на това там (освен някъде персонализирани) - поправете ме, ако греша.
Не забравяйте да приложите бял списък за това, като напр. mail() в PHP изпълнява sendmail по подразбиране и това вече няма да работи.
заключение
Добавете класически disable_functions, open_basedir и т.н. в глобалния php.ini, добавете session.save_path към всеки vhost - поставете сесиите в потребителски директории. Уверете се, че потребителите не споделят нищо .
Приложете правилно разделянето на ниво ОС.
Вземете хардкор с grsec и LD_PRELOAD lib hooking системни повиквания.
Разделяне, разделяне, разделяне .. скоро достатъчно системи като Docker ще предоставят LXC-базирани контейнери за разделяне на потребителите на ниво ядро, но все още не е напълно готово за производство (imho).