FreeBSD + DirectAdmin + Open_BaseDir + suPHP
DirectAdmin, FreeBSD, Заметки на полях Добавить комментарийДумаю на многих площадках установлен DirectAdmin и PHP совместно с suPHP.
Однако должной безопасности, несмотря на ограничение на выполнение PHP скриптов, это не обеспечивает, поскольку например при помощи C99Shell, Safe0ver и др. все еще можно получить содержимое «соседа» по хостингу.
Скажем, зная структуру того или иного движка форума или CMS, можно запросто слить дамп базы данных – просто купив хостинг «по соседству».
Дальше мы приведем некий «хауту» для хостеров, использующих DirectAdmin в качестве Панели Управления, как можно снизить подобные вероятности и поднять безопасность клиентов на более высокий уровень.
Поэтому желательно установить в дополнение к suPHP еще и open_basedir, что не позволит PHP скриптам «высовывать нос» дальше домашнего каталога, указанного в директиве.
Но тут получается некоторая засада. Т.к. suPHP не очень то хочет работать совместно с open_basedir.
Тем не менее выход в использовании отдельных php.ini для каждого пользователя хостинга. Вручную прописать все это очень и очень не сложно, но я рассмотрю вариант использованию индивидуальных php.ini файлов применительно к Панели Управления Хостингом «DirectAdmin», установленной на ОС FreeBSD.
Таким образом мы увеличим уровень безопасности ПУ DirectAdmin.
Делать мы будем следующее, как и говорилось выше отдельный php.ini файл для каждого домена пользователя с ограничением open_basedir только на каталог конкретного домена.
Также для каждого пользователя мы создадим свой tmp каталог временных файлов для PHP, что исключит теоретическую и практическую возможность чтения пользователем «чужих» файлов, находящихся на текущий момент в tmp каталоге.
Сами конфигурационные файлы php.ini мы сложим в каталоге DirectAdmin’а, что в свою очередь позволит оградит их от редактирования пользователями хостинга – и следовательно не позволит менять какие либо настройки. (В данном случае критической является директива open_basedir).
Итак, помчали
* Исходим из того, что уже установлены и настроены все необходимые службы и приложения (как то PHP, suPHP и т.д.). И хостинг пребывает в работоспособном состоянии.
1. Отредактируем файл httpd-suphp.conf
ee /etc/httpd/conf/extra/httpd-suphp.conf
2. Заменим:
suPHP_ConfigPath /usr/local/etc/php5/cgi/
На вот это:
#suPHP_ConfigPath /usr/local/etc/php5/cgi/
Другими словами закомментируем эту директиву. Чтобы suPHP искал файл настроек в файлах, индивидуальных для каждого пользователя – об этом дальше.
Примечание: После каждой пересборки custombuild, комментирование нужно будет выполнить вновь.
3. Далее скопируем шаблоны.
cd /usr/local/directadmin/data/templates
cp virtual_host*.conf custom
cd custom
После того как Вы скопировали 4 конфигурационных файла VirtualHost’ов (или тех, которые нужны Вам) в директорию custom, Вы можете отредактировать их. DirectAdmin всегда проверяет custom файлы перед тем как запустить те, что являются по умолчанию.
Если Вы не сделаете этого – после обновления DirectAdmin’а все сделанные изменения будут утеряны.
Заметьте, что там в действительности находится 8 файлов virtual_host, но потребуется только 4 из них. Файлы, которые имеют в имени цифру 2 применяются для apache 2.x. Те, которые без двойки – для apache 1.3.
Изменям:
|*if SUPHP="1"|
suPHP_Engine |PHP|
suPHP_UserGroup |USER| |GROUP|
|*endif|
На это:
|*if SUPHP="1"|
suPHP_Engine |PHP|
suPHP_UserGroup |USER| |GROUP|
suPHP_ConfigPath suPHP_ConfigPath /usr/local/directadmin/data/users/|USER|/php/|DOMAIN|/
|*endif|
Повторяем данную операцию для всех 4-х файлов VirtualHost.
Т.е. как раз таким образом – мы показываем suPHP, что файлы нужно искать по новому пути. У каждого пользователя будет свой файл.
Тут стоит оговориться – Вы можете по большому счет складывать файлы настроек php.ini и в домашнем каталоге пользователя, можете также проставлять на них права, которые позволят эти файлы редактировать самими пользователями, но тогда теряется сама задумка повышения безопасности.
В данном случае, мы будем хранить файлы в домашнем каталоге DirectAdmin’а, там же где и все остальные конфигурационные файлы для пользователей.
Владельцем всех файлов php.ini мы сделаем пользователя diradmin, и проставим права только на чтение – что позволит suPHP успешно подгружать конфигурационные файлы, но не позволит клиентам вносить в них изменения.
4. Далее «говорим» DirectAdmin’у переписать все http конфиги на новые.
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
Через минуту, а то и меньше, DirectAdmin перепишет http.conf для каждого пользователя на новый, в соответствии с вышеприведенным шаблоном.
С этим закончили. Поехали дальше.
5. Теперь создадим custom скрипты, которые будут выполняться DA при создании/изменении пользователя или домена:
mkdir -p /usr/local/directadmin/scripts/custom/
cd /usr/local/directadmin/scripts/custom/
В данном каталоге создаем следующие файлы:
domain_change_post.sh – будет выполняться после изменения данных по домену:
#!/bin/sh
DEFPHPINI=/usr/local/etc/php5/cgi.w.zend/php.ini
USERPHPINI=/usr/local/directadmin/data/users/$username/php/$newdomain/php.ini
mkdir -p /home/$username/domains/$newdomain/phptmp
mkdir -p /usr/local/directadmin/data/users/$username/php/$newdomain
cp $DEFPHPINI $USERPHPINI
perl -pi -e "s/open_basedir =./open_basedir =\/home\/$username\/domains\/$newdomain\//g" $USERPHPINI
perl -pi -e "s/;upload_tmp_dir =/upload_tmp_dir =\/home\/$username\/domains\/$newdomain\/phptmp\//g" $USERPHPINI
perl -pi -e "s/;session.save_path = \"\/tmp\"/session.save_path =\"\/home\/$username\/domains\/$newdomain\/phptmp\/\"/g" $USERPHPINI
domain_create_post.sh – будет выполняться после создания нового домена.
#!/bin/sh
DEFPHPINI=/usr/local/etc/php5/cgi.w.zend/php.ini
USERPHPINI=/usr/local/directadmin/data/users/$username/php/$domain/php.ini
mkdir -p /home/$username/domains/$domain/phptmp
mkdir -p /usr/local/directadmin/data/users/$username/php/$domain
cp $DEFPHPINI $USERPHPINI
perl -pi -e "s/open_basedir =./open_basedir =\/home\/$username\/domains\/$domain\//g" $USERPHPINI
perl -pi -e "s/;upload_tmp_dir =/upload_tmp_dir =\/home\/$username\/domains\/$domain\/phptmp\//g" $USERPHPINI
perl -pi -e "s/;session.save_path = \"\/tmp\"/session.save_path =\"\/home\/$username\/domains\/$domain\/phptmp\/\"/g" $USERPHPINI
user_create_post.sh – будет выполняться после создания нового пользователя.
#!/bin/sh
DEFPHPINI=/usr/local/etc/php5/cgi.w.zend/php.ini
for d in `cat /usr/local/directadmin/data/users/$username/domains.list`; do
{
USERPHPINI=/usr/local/directadmin/data/users/$username/php/${d}/php.ini
mkdir -p /home/$username/domains/${d}/phptmp
mkdir -p /usr/local/directadmin/data/users/$username/php/${d}
cp $DEFPHPINI $USERPHPINI
perl -pi -e "s/open_basedir =./open_basedir =\/home\/$username\/domains\/${d}\//g" $USERPHPINI
perl -pi -e "s/;upload_tmp_dir =/upload_tmp_dir =\/home\/$username\/domains\/${d}\/phptmp\//g" $USERPHPINI
perl -pi -e "s/;session.save_path = \"\/tmp\"/session.save_path =\"\/home\/$username\/domains\/${d}\/phptmp\/\"/g" $USERPHPINI
};
done;
Делаем файлы запускаемыми:
chmod +x *
6. Исправляем php.ini файл, который используется у нас по умолчанию как основной, из которого мы собственно и будем делать индивидуальный для каждого пользователя. (в данном случае это – /usr/local/etc/php5/cgi.w.zend/php.ini)
Проверяем/вносим/исправляем чтобы наш php.ini содержал вот такие строки:
open_basedir =.
;upload_tmp_dir =
;session.save_path = "/tmp"
Для дополнительной безопасности можно и даже нужно также включить директиву на запрет следующих команд PHP, добавив такую строку:
disable_functions = ini_restore, shell_exec, exec, system, proc_get_status, proc_nice, proc_terminate, define_syslog_variables, syslog, openlog, closelog, escapeshellcmd, ocinumcols, ini_alter, leak, listen, chgrp, set_time_limit, apache_note, apache_setenv, debugger_on, debugger_off, ftp_exec, dl, dll, ftp ini_restore, shell_exec, exec, system, proc_get_status, proc_nice, proc_terminate, define_syslog_variables, syslog, openlog, closelog, escapeshellcmd, ocinumcols, ini_alter, leak, listen, chgrp, set_time_limit, apache_note, apache_setenv, debugger_on, debugger_off, ftp_exec, dl, dll, ftp
Все. Теперь при создании нового пользователя или изменении данных домена у какого либо пользователя из нашего файла по умолчанию будет создан необходимый php.ini файл и tmp каталог для каждого пользователя.
7. Перезапускаем DirectAdmin
/usr/local/etc/rc.d/directadmin restart
8. Далее приведу пример скрипта, который создаст необходимые файлы для уже существующих пользователей DirectAdmin Вашего хостинга.
DEFPHPINI=/usr/local/etc/php5/cgi.w.zend/php.ini
for i in `ls /usr/local/directadmin/data/users`; do
{
for d in `cat /usr/local/directadmin/data/users/${i}/domains.list`; do
{
USERPHPINI=/usr/local/directadmin/data/users/${i}/php/${d}/php.ini
mkdir -p /home/${i}/domains/${d}/phptmp
chown $i:$i /home/${i}/domains/${d}/phptmp
mkdir -p /usr/local/directadmin/data/users/${i}/php/${d}
rm -r $USERPHPINI
cp $DEFPHPINI $USERPHPINI
chown -R diradmin:diradmin /usr/local/directadmin/data/users/${i}
perl -pi -e "s/;open_basedir =/open_basedir =\/home\/${i}\/domains\/${d}\//g" $USERPHPINI
perl -pi -e "s/;upload_tmp_dir =/upload_tmp_dir =\/home\/${i}\/domains\/${d}\/phptmp\//g" $USERPHPINI
perl -pi -e "s/;session.save_path = \"\/tmp\"/session.save_path =\"\/home\/${i}\/domains\/${d}\/phptmp\/\"/g" $USERPHPINI
};
done;
};
done;/usr/local/etc/rc.d/httpd restart
exit 0;
Если все сделано правильно – в phpinfo для каждого пользователя Вы увидите нечто такое:
Loaded Configuration File - /usr/local/directadmin/data/users/username/php/domain.com/php.ini
15 ответов to “FreeBSD + DirectAdmin + Open_BaseDir + suPHP”
Ответить
Вы должны войти на сайт чтобы просмотреть это сообщение.

Декабрь 16th, 2009 at 16:53
…Интересно …
Декабрь 18th, 2009 at 20:30
…Спасибо …
Январь 15th, 2010 at 02:55
…Однако …
Март 11th, 2010 at 13:01
…Хм …
Март 16th, 2010 at 22:01
…Хм …
Март 31st, 2010 at 21:14
…Хех …
Апрель 1st, 2010 at 11:47
Поздравляю…С наступающим …
Апрель 9th, 2010 at 07:03
Спасибо…Хм..…
Апрель 10th, 2010 at 02:44
Прив…Хм..…
Апрель 11th, 2010 at 08:53
Прив…Хм..…
Май 26th, 2010 at 18:11
СПС.…Я тут…
Июнь 5th, 2010 at 03:59
http://rel» rel=»nofollow»>хм…Что то со ссылками…
Июнь 8th, 2010 at 05:30
http://rel» rel=»nofollow»>Даже не знаю…Ссылки как то странно отображаются…
Июнь 15th, 2010 at 18:14
Привет!! carlos@onlylcd.ru» rel=»nofollow»>……С уважением,…
Июнь 16th, 2010 at 07:52
Хорошего Вам дня! ian@elektrashop.ru» rel=»nofollow»>……с ув….