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”

  1. Алекс Says:

    Интересно

  2. Артемий Says:

    Спасибо

  3. Sergey Says:

    Однако

  4. Kristina Says:

    Хм

  5. Алексей Says:

    Хм

  6. Vladimir Says:

    Хех

  7. Elena Says:

    Поздравляю…

    С наступающим

  8. Валентин Says:

    Спасибо

    Хм..

  9. Арсений Says:

    Прив

    Хм..

  10. Константин Says:

    Прив

    Хм..

  11. Сергей Says:

    СПС.

    Я тут

  12. Monah Says:

    http://rel» rel=»nofollow»>хм…

    Что то со ссылками…

  13. Light Says:

    http://rel» rel=»nofollow»>Даже не знаю…

    Ссылки как то странно отображаются…

  14. Frankie Says:

    Привет!! carlos@onlylcd.ru» rel=»nofollow»>……

    С уважением,…

  15. Freeman Says:

    Хорошего Вам дня! ian@elektrashop.ru» rel=»nofollow»>……

    с ув….

Ответить

Вы должны войти на сайт чтобы просмотреть это сообщение.

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Войти