Ограничить выполнение PHP?

Мы работаем над созданием системы 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, а затем вся система обречена, не делайте этого.

Как это сделать?

дно

  • Отдельный пользователь системы / системы для каждого размещенного сайта
  • правильные разрешения (невозможно просмотреть / отредактировать страницу другого) – также убедитесь, что подкаталоги имеют правильное разрешение, поскольку они будут похожими
  • отдельные файлы сеанса (LOT веб-хостинга помещает файлы сеансов каждого сайта, размещенного на PHP, в тот же каталог, это плохо плохо плохо!

Apache, наконец, получил для этого собственный модуль – Apache MPM-ITK .

Короче говоря: изобразите это, поскольку вы дадите пользователю оболочку на машине (под его собственным uid) – он не сможет ничего сделать с другими размещенными сайтами.

  1. разные uid / gid
  2. системные разрешения
  3. кадровые работы, такие как SELinux, AppArmor и аналогичные
  4. grsecurity, если вы хотите быть хардкором .. но система будет сложнее поддерживать.

подниматься?

Вы можете получить больше ядро. Лучшее, что я видел, это 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).