Получившеюся систему я пощупал простеньким скриптом:
< ?php
//$filename = "/home/hfgg_ru/domains/hfgg.ru/htdocs/index.php";
$filename = "/home/hfgg_ru/php.ini";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo $contents;
? >
как и предполагалось можно прочитать практически любой файл, что не есть гуд.
но есть у spawn-fcgi еще одна неиспользованная опция - chroot. использование которой поидее должно вполне реально ограничить пользователя.
поскольку нигде не встречал пример шел-скрипта с использованием этой опции, постарался ее самостоятельно добавить:
#!sh
#!/bin/sh
## ABSOLUTE path to the spawn-fcgi binary
SPAWNFCGI="/usr/bin/spawn-fcgi"
## ABSOLUTE path to the PHP binary
FCGIPROGRAM="/usr/bin/php-cgi"
## bind to tcp-port on localhost
FCGISOCKET="/home/hfgg_ru/sockets/test.php.sock"
## uncomment the PHPRC line, if you want to have an extra php.ini for this user
## store your custom php.ini in /var/www/fastcgi/fred/php.ini
## with an custom php.ini you can improve your security
## just set the open_basedir to the users webfolder
## Example: (add this line in you custom php.ini)
## open_basedir = /var/www/vhosts/fred/html
##
#PHPRC="/home/hfgg_ru/"
## number of PHP childs to spawn in addition to the default. Minimum of 2.
## Actual childs = PHP_FCGI_CHILDREN 1
PHP_FCGI_CHILDREN=2
## number of request server by a single php-process until is will be restarted
PHP_FCGI_MAX_REQUESTS=1000
## IP adresses where PHP should access server connections from
FCGI_WEB_SERVER_ADDRS="127.0.0.1"
# allowed environment variables sperated by spaces
ALLOWED_ENV="PATH USER"
## if this script is run as root switch to the following user
USERID=test_hfgg_ru
GROUPID=hostusers
CHROOTDIR="/home/hfgg_ru/"
################## no config below this line
if test x$PHP_FCGI_CHILDREN = x; then
PHP_FCGI_CHILDREN=5
fi
export PHP_FCGI_MAX_REQUESTS
export FCGI_WEB_SERVER_ADDRS
export PHPRC
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS PHPRC"
# copy the allowed environment variables
E=
for i in $ALLOWED_ENV; do
E="$E $i=$(eval echo "\$$i")"
done
# clean environment and set up a new one
env - $E $SPAWNFCGI -s $FCGISOCKET -f $FCGIPROGRAM -c $CHROOTDIR -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN
#env - $E $SPAWNFCGI -s $FCGISOCKET -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN
chmod 770 $FCGISOCKET
но призапуске все время выдает:
spawn-fcgi.c.121: bind failed: No such file or directory
уже и так и сяк пробовал, чет толку нехватает :( может подсскажет кто?
Но даже если получится так сделать, то это все равно для меня не вариант, таким образом можно разделить несколько больших нормальных проектов, но это практически не применимо для виртулаьного зостинга, тем более бесплатного, где обычно сайтоы много, а посетителей у них 10 в день от силы :)
Каждый новый ПХП демон съедает около 4 метров памяти при 5 чилдренах, при десяти — 8, при 20ти — 16 соответственно.
А если чилдренов 2 указать то примерно 3 метра, и того при хотябы 100 пользователях мне надо минимум 300 мегобайт оперативной памяти :(
В принцепе, наверное, можно подкрутить настройки ПХП и уменьшить эту цыфру, но…. все это очень сомнительно, жду ваших коментариев :)
Значит будем ограничивать права средствами ПХП, хотя и пишут что это не сильно надежный способ, но другого я пока не вижу и не предстваляю. Но копаться в ПХП буду позже, а сейчас займусь настройкой chroot-jail. Это позволит более общую безопасность сервера обеспечить.
