На моих серверах работает CentOS: Nginx + PHP-FPM (PHP через Fast-CGI). Каждый сайт находится на собственном VirtualHost.
В настоящее время и Nginx, и PHP-FPM работают под root. Я знаю, что это плохая практика, и у какого-либо из сайтов нет причин иметь доступ к файлам за пределами их собственного каталога.
Как мне создать заключенных в тюрьму пользователей и дать указание nginx && php-fpm подыгрывать соответствующим образом?
Хорошо, вы используете странную настройку, но в целом:
Во-первых, linux не поддерживает настоящие (в стиле bsd) тюрьмы (если вы не устанавливаете openvz или vserver), но настройка всего на запуск от имени непривилегированного пользователя + chroots может очень серьезно повысить безопасность. Очень важно запускать что-то от имени пользователя без полномочий root, chroot - всего лишь (возможно, значительный) камень преткновения для потенциальных злоумышленников).
Согласно сайту php-fpm, chroot поддерживается с помощью команды настройки. Конечно, у php-fpm нет документации ... Если вы покопаетесь в архиве исходных текстов, вы можете найти документацию или хотя бы пример конфигурации. http://php-fpm.org/about/ говорит, что возможна установка пользователя, группы и chroot. Я никогда не использовал php-fpm, но это должно быть достаточно здравым смыслом.
Чтобы запустить nginx от имени пользователя без полномочий root, откройте файл конфигурации nginx, найдите строку, начинающуюся с «user», и измените ее на непривилегированного пользователя в системе. Создайте нового пользователя с nologin в качестве оболочки или используйте пользователя nobody.
Тогда процесс chroot любого демона в основном выглядит следующим образом:
- Создайте каталог для определенного корня демона
- Создайте каркасную структуру каталогов в каталоге chroot (например, ./etc, ./usr/lib и т. Д.)
- Скопируйте любые необходимые двоичные файлы и файлы конфигурации (так что nginx.conf, двоичный файл nginx, любые вспомогательные программы, которые вам понадобятся)
- Скопируйте дополнительные файлы, которые необходимы внутри chroot. Это будет как минимум заглушка файла / etc / password (не файл теневого пароля, просто должен быть способ поиска имен пользователей для uid), файл / etc / group и / etc / localtime (php будет жаловаться бесконечно, если у вас нет информации о часовом поясе).
- Наконец, запустите ldd для двоичных файлов, которые вы скопировали. Это даст вам список библиотек для копирования. Просмотрите этот список и скопируйте необходимые общие объекты в их эквивалентное место в chrooted каталоге. Попробуйте сохранить символические ссылки или скопируйте исходный файл на место, где раньше была символическая ссылка.
- Создавайте любые необходимые устройства с помощью mknod. Если вы не знаете номера устройств, погуглите их (например: / dev / random - c 1 8, / dev / null - c 2 2).
- Хотя пути к объектам в ваших файлах конфигурации должны оставаться прежними, иногда их нужно настраивать. Когда вы вручную выполняете chroot для демона, все в конфигурационном файле должно ИГНОРИРОВАТЬ ту часть пути, которая не будет видна после chrooted, например / var / log / somelogfile останется / var / log / somelogfile, несмотря на то, что он новый путь на самом деле является / chroot / nginx / var / log / somelogfile
Имейте в виду, что любой демон, который может быть изменен через файл конфигурации, будет не требуется этот набор шагов - chroot будет выполняться программой после того, как соответствующие зависимости библиотеки и файлы конфигурации будут загружены. Что делает жизнь намного проще.
Как только вы это сделаете, теоретически вы должны быть готовы запустить nginx (или что-нибудь еще) в режиме chrooot. В вашем сценарии /etc/init.d/ для nginx найдите, где на самом деле выполняется двоичный файл nginx, и измените его, чтобы использовать chroot, например:
$ DAEMON -c $ КОНФИГУРАЦИЯ
становится
/ usr / sbin / chroot / chroot / directory / здесь $ DAEMON -c $ CONFIGFILE
Затем вы можете запустить nginx в обычном режиме с помощью сценария init.d. * Если вы получаете сообщение об ошибке от chroot, например «chroot: не удается запустить команду« / bin / that / фактически / существует »: нет такого файла или каталога», то вам не хватает некоторых библиотек или чего-то еще важного. Все, что приводит к тому, что двоичный файл вообще не запускается, приведет к этой ошибке (на самом деле, в одном из моих блоков centos указано, что операция не разрешена).
Поскольку у меня недостаточно очков репутации для размещения большого количества ссылок, ознакомьтесь с www (dot) securityfocus (dot) com (slash) infocus / 1694 (пошаговая защита apache) - это другой демон http, это те же основные шаги, по крайней мере, что касается chroot.
Также имейте в виду, что ваши права доступа к файлам в папке chroot должны быть соблюдены - в основном, пока пользователь, который запускает nginx, может читать / обрабатывать ваши файлы в chroot, все будет в порядке.
Наконец, в качестве примера того, что требуется в среде chroot, вот случайный список файлов из openwall box, в котором запущено несколько задач. В качестве примера я использую mysql:
localhost!root:/# find /chroot/mysql
/chroot/mysql
/chroot/mysql/var
/chroot/mysql/var/run
/chroot/mysql/var/run/mysql.sock
/chroot/mysql/var/run/mysqld.pid
/chroot/mysql/var/log
/chroot/mysql/etc
/chroot/mysql/etc/my.cnf
/chroot/mysql/etc/hosts
/chroot/mysql/etc/host.conf
/chroot/mysql/etc/resolv.conf
/chroot/mysql/etc/group
/chroot/mysql/etc/passwd
/chroot/mysql/etc/my.cnf.orig
/chroot/mysql/etc/nsswitch.conf
/chroot/mysql/tmp
/chroot/mysql/lib
/chroot/mysql/lib/libtermcap.so.2
/chroot/mysql/lib/libdl.so.2
/chroot/mysql/lib/libc.so.6
/chroot/mysql/lib/librt.so.1
/chroot/mysql/lib/libpthread.so.0
/chroot/mysql/lib/libz.so.1
/chroot/mysql/lib/libcrypt.so.1
/chroot/mysql/lib/libnsl.so.1
/chroot/mysql/lib/libstdc++.so.6
/chroot/mysql/lib/libm.so.6
/chroot/mysql/lib/libgcc_s.so.1
/chroot/mysql/lib/ld-linux.so.2
/chroot/mysql/lib/libnss_compat.so.2
/chroot/mysql/lib/libnss_files.so.2
/chroot/mysql/lib/libnss_compat-2.3.6.so
/chroot/mysql/lib/libnss_files-2.3.6.so
/chroot/mysql/data
/chroot/mysql/data/mysql
/chroot/mysql/data/mysql/db.frm
/chroot/mysql/data/mysql/db.MYI
/chroot/mysql/data/mysql/db.MYD
[further mysql tables have been omitted]
/chroot/mysql/dev
/chroot/mysql/dev/null
/chroot/mysql/usr
/chroot/mysql/usr/local
/chroot/mysql/usr/local/libexec
/chroot/mysql/usr/local/libexec/mysqld
/chroot/mysql/usr/local/charsets
/chroot/mysql/usr/local/charsets/README
/chroot/mysql/usr/local/charsets/Index.xml
/chroot/mysql/usr/local/charsets/armscii8.xml
/chroot/mysql/usr/local/charsets/ascii.xml
/chroot/mysql/usr/local/charsets/cp1250.xml
/chroot/mysql/usr/local/charsets/cp1251.xml
/chroot/mysql/usr/local/charsets/cp1256.xml
/chroot/mysql/usr/local/charsets/cp1257.xml
/chroot/mysql/usr/local/charsets/cp850.xml
/chroot/mysql/usr/local/charsets/cp852.xml
/chroot/mysql/usr/local/charsets/cp866.xml
/chroot/mysql/usr/local/charsets/dec8.xml
/chroot/mysql/usr/local/charsets/geostd8.xml
/chroot/mysql/usr/local/charsets/greek.xml
/chroot/mysql/usr/local/charsets/hebrew.xml
/chroot/mysql/usr/local/charsets/hp8.xml
/chroot/mysql/usr/local/charsets/keybcs2.xml
/chroot/mysql/usr/local/charsets/koi8r.xml
/chroot/mysql/usr/local/charsets/koi8u.xml
/chroot/mysql/usr/local/charsets/latin1.xml
/chroot/mysql/usr/local/charsets/latin2.xml
/chroot/mysql/usr/local/charsets/latin5.xml
/chroot/mysql/usr/local/charsets/latin7.xml
/chroot/mysql/usr/local/charsets/macce.xml
/chroot/mysql/usr/local/charsets/macroman.xml
/chroot/mysql/usr/local/charsets/swe7.xml
/chroot/mysql/usr/local/share
/chroot/mysql/usr/local/share/mysql
/chroot/mysql/usr/local/share/mysql/english
/chroot/mysql/usr/local/share/mysql/english/errmsg.sys
/chroot/mysql/bin
/chroot/mysql/bin/test
/chroot/mysql/bin/nohup
Примером настройки демона, который может быть запущен через его конфигурационный файл, является maradns:
localhost!root:/# find /chroot/maradns/
/chroot/maradns/
/chroot/maradns/logger
/chroot/maradns/db.[removed]
/chroot/maradns/db.[removed2]
/chroot/maradns/db.[removed3]
Как вы можете видеть, maradns не требовал особого труда для chrooted (на самом деле требовалось просто "chroot_dir =" / chroot / maradns "в файле / etc / mararc.
В любом случае, это был длинный и чрезвычайно бессвязный пост, посвященный программному обеспечению, немного отличающемуся от того, которое вы используете, однако я надеюсь, что эта информация по-прежнему полезна.
nginx требуется root для привязки к порту 80 в качестве главного процесса. Затем его рабочие процессы запускаются под другим пользователем (в зависимости от конфигурации).
Не так уж и сложно заставить chrooted nginx и php-fpm играть хорошо - просто убедитесь, что у nginx есть способ доступа к php-fpm (проще всего использовать tcp), и убедитесь, что он передает правильный путь к php-fpm (относительно chrooted php- fpm, конечно).
Дополнительные советы по безопасности - правильно установить права доступа к файлам. Вот как я это сделал:
состояние:
разрешения:
Коротко:
chown -R php:www /var/www/root
find /var/www/root -type d -exec chmod 750 {} \;
find /var/www/root -type f -exec chmod 640 {} \;
find /var/www/root -type f -name '*.php' -exec chmod 600 {} \;
Можно дать более точное разрешение, но оно должно быть достаточно простым и ничего не сломать.