Как создать заключенных в тюрьму пользователей?
Мои серверы работают под управлением CentOS: Nginx + PHP-FPM (PHP через Fast-CGI). У каждого сайта свой виртуальный хост.
В настоящее время и Nginx, и PHP-FPM работают под root. Я знаю, что это плохая практика, и у какого-либо сайта нет причин иметь доступ к файлам вне их собственного каталога.
Как бы я начал создавать заключенных в тюрьму пользователей и инструктировать nginx && php-fpm играть соответственно?
2 ответа
Хорошо, вы используете какую-то странную настройку, но в целом:
Во-первых, linux не поддерживает настоящие (в стиле bsd) тюрьмы (если вы не устанавливаете openvz или vserver), но настройка всего для запуска в качестве непривилегированного пользователя + chroot может очень серьезно повысить безопасность. Запускать как пользователь без полномочий root очень важно, chroots - это просто (возможно, значительный) камень преткновения для потенциальных злоумышленников).
Согласно сайту php-fpm, chroot поддерживается с помощью команды конфигурации. Конечно, php-fpm не имеет никакой документации... Если вы пробуете архив с исходным кодом, вы можете найти некоторую документацию или хотя бы пример конфигурации. http://php-fpm.org/about/ говорит, что установка пользователя, группы и chroot возможна. Я никогда не использовал php-fpm, но это должно быть довольно здравым смыслом.
Чтобы запустить nginx как пользователь без полномочий root, откройте файл конфигурации nginx, найдите строку, начинающуюся с "user", и измените ее на непривилегированного пользователя в системе. Создайте нового пользователя с nologin в качестве оболочки или используйте пользователя nobody.
Тогда процесс для закрепления за любым демоном в основном выглядит следующим образом:
- Создать каталог для корня конкретного демона
- Создайте каркасную структуру каталогов в каталоге chroot (так./etc, ./usr/lib и т. Д.)
- Скопируйте все необходимые двоичные файлы и файлы конфигурации (например, nginx.conf, двоичный файл nginx, любые вспомогательные программы, которые вам понадобятся)
- Скопируйте дополнительные файлы, которые необходимы внутри chroot. Это будет как минимум заглушка файла / etc / pass word (не файл теневого пароля, просто нужен способ поиска имен пользователей по uids), файл / etc / group и /etc/localtime (php будет жаловаться бесконечно, если у вас нет информации о часовом поясе).
- Наконец, запустите ldd для двоичных файлов, которые вы скопировали. Это даст вам список библиотек для копирования. Просмотрите этот список и скопируйте необходимые общие объекты в их эквивалентное место в каталоге chrooted. Попробуйте сохранить символические ссылки или скопируйте исходный файл в том месте, где ранее была символическая ссылка.
- Создайте все необходимые устройства с помощью mknod. Если вы не знаете номера устройств, поищите их в Google (например, /dev/random - c 1 8, /dev/null - c 2 2)
- Хотя пути к вещам в ваших конфигурационных файлах должны оставаться неизменными, иногда они нуждаются в настройке. Когда вы вручную синхронизируете демона, все в файле конфигурации должно игнорировать ту часть пути, которая не будет видна после того, как вы выполните chroot, например, /var/log/somelogfile останется /var/log/somelogfile, несмотря на то, что он новый путь фактически является / chroot / nginx /var/log/somelogfile
Имейте в виду, что для любого демона, который может быть синхронизирован с помощью файла конфигурации, этот набор шагов не потребует - синхронизация будет выполняться программой после загрузки соответствующих библиотечных зависимостей и файлов конфигурации. Что делает жизнь намного проще.
Как только вы это сделаете, теоретически вы должны быть готовы запустить chroot для nginx (или чего-то еще). В вашем скрипте /etc/init.d/ для nginx найдите, где на самом деле выполняется двоичный файл nginx, и измените его на использование chroot, например:
$DAEMON -c $CONFIGFILE
становится
/ usr / sbin / chroot / chroot / каталог / здесь $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, приведен случайный список файлов из коробки с открытым экраном, в которой выполняется ряд функций chroot. Я использую 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 не требовалось много времени, чтобы получить его chroot (на самом деле ему просто требовалось "chroot_dir = "/chroot/maradns"в файле / etc / mararc.
В любом случае, это была длинная и чрезвычайно бессвязная публикация, направленная на программное обеспечение, немного отличающееся от того, которое вы используете, однако я надеюсь, что эта информация все еще полезна.
Для nginx необходим root для привязки к порту 80 в качестве главного процесса. Затем его рабочие процессы выполняются у другого пользователя (в зависимости от конфигурации).
Сделать так, чтобы chrooted nginx и php-fpm играли хорошо, не так уж и сложно - просто убедитесь, что nginx имеет способ получить доступ к php-fpm (проще всего использовать tcp) и убедитесь, что он передает правильный путь к php-fpm (относительно chrooted php- фпм, конечно).
Дополнительные советы по безопасности - правильно настроить права доступа к файлам. Вот как я это сделал:
состояние:
- скажем все находится в / 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 {} \;
Более точное разрешение может быть дано, но это должно быть достаточно легко и ничего не сломать.