Так что во избежание подобных ситуаций следует принимать ряд мер, и одно из первых - chroot. Суть в том, что любому скрипту доступна на чтение файловая система, и это уже дыра в безопасности. Ведь умея читать - прочесть можно многое. Необходимо поместить PHP в темницу, где файловая система будет не реальная а своя.
Темницу мы создадим через инструмент Jail который я описывал ранее, далее перенесу туда PHP и запущу его оттуда как FastCGI. В качестве веб сервера я выбрал nginx, так как для него fastcgi - стандарт де факто.
Ставим и настраиваем Jail (темницу)
Все действия я произвожу в Gentoo Linux поэтому некоторые вещи специфичны именно для этой ОС, например установка пакетов я делаю командой emerge.
mkdir -p /jail/php
mkjailenv /jail/php
mkdir /jail/php/{bin,lib,proc}
addjailsw /jail/php
cp -d /lib/ld-*.so* /jail/php/lib/
Нашей новой системе нужен /proc
Добавляем bash, куда же без него, хотя и необязательно
ln -s bash /jail/php/bin/sh
Незнаю почему jail не сделал нам /dev/random но он нужен, php без него не захотел работать.
Создадим нового пользователя и группу - php, пускай все скрипты бегают из-под этого пользователя.
useradd -d /jail/php -s /usr/bin/jail -g php -G php php
chown root:php /jail/php
chmod 0750 /jail/php
Ставим PHP
И переносим его в темницу
cp -r /usr/lib/php5 /jail/php/usr/lib/
Ставим Lighttpd
Нам нужет не сам Lighttpd а тулза, которая идёт вместе с ним — spawn-fcgi. У него много полезных фенек.
Запускаем PHP как FastCGI сервер
открываем конфиг, /etc/conf.d/spawn-fcgi
Правим строки:
GROUPID=php
SPAWNFCGI="/usr/bin/spawn/spawn-fcgi -c /jail/php"
Параметр “-с” указывает что надо сделать chroot в папку /jail/php
Если у нас fast-cgi сервер является локальный а не удалённый, то лучше перейти с TCP-сокетов на UNIX-сокеты. У меня это хорошо повысило производительность.
Для этого поправим
Сделаем папку для unix-socket`ов
chown root:php /jail/php/var/run/spawn
chmod 0770 /jail/php/var/run
Почемуто скрипты запуска достаночно скудные и не предусматривают, что могут использоваться unix-сокеты, поэтому подправим немного файл /etc/init.d/spwn-fcgi
там где запуск, вместо "-p ${FCGIPORT}" пишем "-s ${FCGIPORT}"
Запускаем FastCGI демон
Устанавливаем Nginx
Я посчитал, что perl мне ненужен, ведь я не пишу на нём, а imap прокси в nginx`е мне тоже не нужен, зато нужен fastcgi и собрать nginx нужно с поддержкой этого самого fastcgi.
Настраиваем Nginx
Правим файл /etc/nginx/nginx.conf
location ~ \.php {
fastcgi_pass unix:/var/run/spawn/spawn-fcgi.sock;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME <PATH>/htdocs$fastcgi_script_name;
}
где <PATH> — путь до ваших файлов
Ещё кое что
Это конечно не всё, не стоит забывать что у PHP много модулей, например GD, а ведь поддержка этого модуля реализуется внешней unix-библиотекой. И её надо перенести в вашу темницу, всё это делается утилитой addjailsw. Так же не стоит набывать, например про mysql. Дело в том, что соединение между PHP и MySql у меня идёт через unix-сокеты и поэтому нам нужен доступ до /var/run/mysql. Возможно нам ещё чтонибудь пригодиться, например конект до memcached, поэтому мы смаунтим /var/run в /jail/php/var/run
Конечно после перезагрузки сервера (не дай бог) надо заного перемаунтить /jail/php/proc и /jail/php/var/run , поэтому лучше их прописать в /etc/fstab
Запускаем Nginx
Вот и всё
Попробуйте в PHP написать скрипт, который выведет список папок корня на экран. Что вы увидете? Увы для взломщика — он увидет дерево папки /jail/php и не более.
http://www.webnext.r...gi-in-jail.html