Я создаю производственный сервер, на котором будет работать nginx с php-fpm. Я хочу, чтобы у меня было хорошее сочетание между безопасностью сервера и хорошим быстрым рабочим процессом.
Теперь одна вещь, которая всегда защищает систему, - это chroot. Я много читал об этом, и chroot nginx довольно сложен.
Говорят, что хорошим способом является использование функции chroot, встроенной в php-fpm. Я прочитал несколько руководств, в которых объясняется, как это настроить, но я не читал о последствиях, которые это несет. Я даже читал, что их нет.
Ну, первая проблема, с которой я столкнулся, была связана со временем. Решение было скопировать /etc/localtime
и папка /usr/share/zoneinfo
в каталог chroot.
НИ ОДИН из гидов не говорит вам об этом, и это первая ошибка, которую вы замечаете.
Теперь у меня проблемы с file_get_contents
, Я получаю следующую ошибку:
не удалось открыть поток: php_network_getaddresses: getaddrinfo не удалось: имя или служба неизвестны
Думаю, решением будет добавить больше файлов в chroot. Я действительно не хочу делать это для каждого разрабатываемого мной веб-сайта.
Так обстоит дело с chrooting даже в php-fpm, или я что-то делаю не так. Есть ли что-то, что я должен включить, чтобы все работало, или мне следует переместить все в каталог.
Да, вам понадобится базовая функциональная файловая система в каталоге chroot. И нет, вам не следует перемещать (или связывать) все - это полностью уничтожит всю цель chroot.
По сути, ресурсы, которые должны присутствовать в chroot, - это те ресурсы, к которым серверу потребуется доступ во время выполнения - любые динамически загружаемые библиотеки, каталоги журналов и вспомогательные структуры, необходимые для всего, что делает сервер.
В этом случае вам не хватает базовой конфигурации разрешения имен - /etc/resolv.conf
, /etc/nsswitch.conf
, и вещи, связанные с nss / dns / resolv из /lib
было бы хорошим началом.
Копирование разрешающие библиотеки и / etc-файлы на самом деле не нужно, если вы можете бежать NSCD на вашем сервере.
Основная идея состоит в том, чтобы связать монтируемый сокет домена Unix nscd (обычно / var / run / nscd / socket) в chroot. (e) glibc попытается связаться с ним для разрешения имен пользователей, имен хостов и т. д. Только если nscd не запущен, (e) glibc прибегает к разрешению вещей самостоятельно.
Более подробную информацию об этом и других вещах, которые вам может потребоваться исправить при запуске PHP в chroot, можно найти в моем сообщении в блоге: