Мы работаем над созданием системы wordpress с нуля с помощью системы шаблонов и задаемся вопросом о безопасности. Мы надеемся, что у нас будет модель SaaS, где пользователь будет находиться на том же сервере, что и несколько других пользователей, но мы надеемся также предоставить им инструменты для изменения их собственных файлов представлений, что означает доступ к PHP. Мы используем Laravel в качестве основы. Как давний пользователь Dreamhost, я знаю, что вы можете разделить одну и ту же машину на несколько сред, но не совсем уверены, что они использовали для этого.
Как я могу предотвратить выполнение команд, таких как eval (), системные команды и ограничить доступ пользователей к fopen (я предполагаю, что это в основном с помощью пользовательских разрешений linux). Я хотел бы предоставить им прямой доступ к файлам в папке «Представления» и разработать собственные решения вместо того, чтобы заставить их проходить через меня, но не слишком подвергая риску. Если есть соображения mysql помимо отдельных пользователей, не стесняйтесь звонить там.
Существует несколько уровней, которые необходимо защитить.
Некоторые из хостеров неправильно полагаются на «защиты» PHP, такие как open_basedir, safe_mode (более старые PHP), disable_functions и т. Д.
Даже PHP НЕ считает их функциями безопасности – http://php.net/security-note.php
Они могут быть отключены любым эксплойтом для PHP, а затем вся система обречена, не делайте этого.
Apache, наконец, получил для этого собственный модуль – Apache MPM-ITK .
Короче говоря: изобразите это, поскольку вы дадите пользователю оболочку на машине (под его собственным uid) – он не сможет ничего сделать с другими размещенными сайтами.
Вы можете получить больше ядро. Лучшее, что я видел, это shared-library для apache (или того, что вы используете) – это используется, когда apache запускается с использованием LD_PRELOAD
и он реализует все потенциально вредоносные системные вызовы, такие как system()
, execve()
и в основном любые другие звоните, что вы плохо себя чувствуете.
Я еще не видел хорошей реализации этого там (кроме таковых) – исправьте меня, если я ошибаюсь.
Убедитесь, что для этого используется белый список, например. mail () в PHP выполняет sendmail по умолчанию, и это больше не будет работать.
Добавьте классические disable_functions, open_basedir и т. Д. В глобальный php.ini, добавьте session.save_path для каждого сеанса vhost-put в пользовательские каталоги. Убедитесь, что пользователи ничего не разделяют.
Внедрите правильное разделение на уровне ОС.
Получите хардкор с помощью grsec и LD_PRELOAD.
Разделение, разделение, разделение. Скоро такие системы, как Docker, предоставят контейнеры на основе LXC для разделения пользователей на уровне ядра, но пока еще не готовы к производству (imho).