Вопрос: Как создать заключенных в тюрьму?


Мои серверы запускают CentOS: Nginx + PHP-FPM (PHP через Fast-CGI). Каждый сайт находится на своем собственном VirtualHost.

В настоящее время и Nginx, и PHP-FPM работают под root. Я знаю, что это плохая практика, и нет никаких оснований для того, чтобы какой-либо из сайтов имел доступ к файлам за пределами их собственного каталога.

Как я могу начать создавать заключенных в тюрьму пользователей и инструктировать nginx && php-fpm для игры соответственно?


5
2017-12-05 02:25


Источник




Ответы:


Хорошо, вы используете какую-то странную настройку, но в целом:

Во-первых, linux не поддерживает true (bsd style) jails (если вы не устанавливаете openvz или vserver), но установка всех, которые будут выполняться в качестве привилегированного пользователя + chroots, может очень серьезно улучшить безопасность. Запуск вещей как пользователя без полномочий root необходим, chroots - это просто (возможно, значительный) камень преткновения для потенциальных злоумышленников).

Согласно сайту php-fpm, chrooting поддерживается с помощью команды конфигурации. Конечно, php-fpm похож, никакой документации ... Если вы пробиваете исходный tarball, вы можете найти какую-то документацию или, по крайней мере, примерную конфигурацию. 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   (не файл теневого пароля, там   просто нужно быть способом поиска   usernames to uids), файл / etc / group,   и / etc / localtime (php будет жаловаться   бесконечно, если у вас нет часового пояса   Информация).
  • Наконец, запустите ldd в исполняемых файлах, которые вы скопировали. Это даст вам   список библиотек для копирования. Идти   через этот список, и скопируйте необходимые   общие объекты к их эквиваленту   место в каталоге chrooted. Пытаться   сохранить символические ссылки или скопировать   оригинальный файл в том месте, где   ранее была символической ссылкой.
  • Создайте все необходимые устройства с помощью mknod. Если вы не знаете устройство   номера, google (например: / dev / random   c 1 8, / dev / null - c 2 2)
  • Хотя пути к вещам в ваших конфигурационных файлах должны оставаться неизменными,   иногда они нуждаются в настройке. когда   вы вручную chrooting демона,   все в файле конфигурации должно   IGNORE - часть пути, которая будет   не будет видно, как только вы будете chrooted,   например, / var / log / somelogfile будет   оставить / var / log / somelogfile, несмотря на   это новый путь, фактически являющийся   / Корневая / Nginx / вар / Журнал / somelogfile

Имейте в виду, что любой демон, который может быть chrooted через файл конфигурации, будет не требуется этот набор шагов: выполнение chrooting будет выполняться программой после загрузки соответствующих зависимостей библиотеки и файлов конфигурации. Это делает жизнь намного проще.

Как только вы это сделаете, теоретически вы должны быть готовы запустить nginx (или что-то еще) chrooted. В вашем /etc/init.d/ скрипте для nginx найдите, где фактически запущен двоичный файл nginx, и измените его на использование chroot, например:

$ DAEMON -c $ CONFIGFILE

становится

/ usr / sbin / chroot / chroot / directory / here $ DAEMON -c $ CONFIGFILE

Затем вы можете запустить nginx обычно с помощью скрипта init.d. * Если вы получаете ошибку от chroot, например, chroot: не можете запустить команду `/ bin / that / fact / exists ': нет такого файла или каталога", то вам не хватает некоторых библиотек или что-то еще важное. Все, что заставляет двоичный файл не запускаться вообще, приведет к этой ошибке (фактически, одна ячейка из центрального процессора говорит, что операция не разрешена).

Поскольку у меня недостаточно высоких точек реплики, чтобы опубликовать много ссылок, ознакомьтесь с www (dot) securityfocus (dot) com (slash) infocus / 1694 (обеспечив шаг за шагом apache) - это другой демон http, это те же основные шаги, по крайней мере, до chrooting.

Также имейте в виду, что ваши права доступа к файлам в папке chroot необходимо отслеживать - в основном, пока пользователь, который работает nginx, может читать / обрабатывать ваши файлы в chroot, все будет хорошо.

Наконец, в качестве примера того, какие вещи требуются в среде chroot, вот случайный список файлов из Openwall который запускает несколько вещей chrooted. Я использую 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

Примером установки демона, который может быть chrooted через его конфигурационный файл, является maradns:

localhost!root:/# find /chroot/maradns/
/chroot/maradns/
/chroot/maradns/logger
/chroot/maradns/db.[removed]
/chroot/maradns/db.[removed2]
/chroot/maradns/db.[removed3]

Как вы можете видеть, марадны не требовали многого, чтобы получить chrooted (на самом деле это просто потребовало «chroot_dir =» / chroot / maradns »в файле / etc / mararc.

Во всяком случае, это был длинный и чрезвычайно бессвязный пост, направленный на программное обеспечение, немного отличающееся от программного обеспечения, которое вы используете, однако я надеюсь, что эта информация по-прежнему полезна.


12
2017-12-05 04:02





nginx требует root для привязки к порту 80 в качестве основного процесса. Затем его рабочие процессы запускаются на разных пользователях (на основе конфигурации).

Делать chrooted nginx и php-fpm играть приятно не так сложно - просто убедитесь, что nginx имеет способ получить доступ к php-fpm (с помощью tcp проще всего) и убедитесь, что он прошел правильный путь до php-fpm (относительно chrooted php- fpm, конечно).

Дополнительные советы по безопасности - правильно установить права доступа к файлам. Вот как я это сделал:

состояние:

  • скажем, все находится в / var / www / root
  • php-файлы имеют расширение .php
  • php-fpm работает как пользователь «php», группа «php»,
  • nginx работает как пользователь «www», группа «www»

разрешения:

  • все файлы имеют право владения php: www (владелец «php», группа «www»)
  • разрешение каталогов - 750
  • php-файлы имеют разрешение 600
  • все остальное - 640

Вкратце:

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 {} \;

Можно дать более тонкое разрешение, но это должно быть достаточно простым и ничего не сломать.


3
2018-01-28 09:15



С каким пользователем вы входите в систему. Это с php или просто с другим пользователем. - Saif Bechan