Отключение опасных функций php

12
Goldsnich
На сайте с 17.07.2011
Offline
52
7529

У меня VDS у hetzner - FreeBSD, Apache 2.2+nginx, php -5.3, есть полный доступ к настройкам системы. Проблема в том, что на этом сервере у меня много сайтов, в том числе не только моих и мне необходимо отключить некоторые функции php для конкретного домена, а не глобально. Немного погуглив, пришла к выводу, что в моем случае может помочь Suhosin. Как раз апач с ним и собран, по крайней мере phpinfo() показывает эту информацию.

Краткая инструкция гласит:

1. Закоментировать строку disable_functions = в php.ini

2. Добавить строку с набором фунций, которые необходимо запретить, к примеру suhosin.executor.func.blacklist = "exec,passthru,shell_exec"

3. В конфиге виртуалхоста прописать запретные функции, но не включать а этот список функции, которые необходимо оставить

<IfModule mod_php5.c> 

php_admin_value suhosin.executor.func.blacklist = "passthru,shell_exec"
</IfModule>

тут не включена exec функция, значит она будет работать на этом домене.

И я хотела бы узнать у знающих, является ли такой вариант оптимальным в моем случае ?

Зачем мне нужен запрет функций ? Потому что несколько раз находила у себя php-shell скрипты.

К примеру, там встречаются как раз эти функции -


if (!empty($cfe))
{
if(function_exists('exec'))
{
@exec($cfe,$res);
$res = join("\n",$res);
}
elseif(function_exists('shell_exec'))
{
$res = @shell_exec($cfe);
}
elseif(function_exists('system'))
{
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists('passthru'))
{
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,"r")))
{
Покупаю сайты с доходом sape и др. (http://goldsnich.com/sell/)
ngsv
На сайте с 12.10.2012
Offline
47
#1

По сути, функции exec,passthru,shell_exec,popen,... ничем не отличаются - это операторы исполнения. Единственное небольшое их отличие - это возвращаемые данные, и на сколько я помню exec возвращает весь листинг вызова после выполнения команды в виде массива, а shell_exec — в виде одной строки. passthru перенаправляет поток вывода сразу в браузер.

Но делают они - одно и тоже, выполняют шелл команду на сервере, хоть и от имени юзера...

Если вам так часто заливают шеллы - рекомендую провести аудит безопасности, обновить используемые CMS, (особенно форумы IP.Board, где недавно нашли баз с развертыванием сериализованных объектов...), сменить логины и пароли...

Рекомендую сделать:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen

А чем отличается suhosin.blacklist от disable_functions?

Если функция используется в коде и попала в список disable_functions, то выдаст error в браузер (при включенном выводе ошибок), иначе функция просто вернет false;

(возможна информация на данный момент не актуальна, буду рад если меня поправят и дополнят...)

Что использовать?

Лучше использовать disable_functions. Suhosin отключается записью в .htaccess:

php_flag suhosin.simulation 1

Это краткие советы и рекомендации, касательно вашего вопроса. Также советую посмотреть Apache-ITK, Jail, SELinux & CloudLinux... Ну и конечно правильная настройка самого сервера, иначе без прямых рук - все бесполезно.

SIQWELL (http://siqwell.com/) - Быстро. Качественно. Дорого.
Goldsnich
На сайте с 17.07.2011
Offline
52
#2
ngsv:


А чем отличается suhosin.blacklist от disable_functions?
Если функция используется в коде и попала в список disable_functions, то выдаст error в браузер (при включенном выводе ошибок), иначе функция просто вернет false;
(возможна информация на данный момент не актуальна, буду рад если меня поправят и дополнят...)

Судя по информации с php.net, нельзя запрещать выполнение функций в httpd.conf c помощью disable_functions, эту директиву можно указывать только в php.ini

А Suhosin как раз таки позволяет делать это, что мне и требуется.

Просто я хочу подстраховаться, а вдруг для функционала какого-то сайта потребуется какая-то из этих функций, тогда я смогу указать это в конфиге конкретного виртуалхоста.

P
На сайте с 16.03.2009
Offline
144
#3

Тогда для тех виртхостов где это не требуется указывайте с помощью php_admin_value disable_functions

iHead
На сайте с 25.04.2008
Offline
137
#4
poiuty:
Тогда для тех виртхостов где это не требуется указывайте с помощью php_admin_value disable_functions

месье, теоретик? :)

Рекомендуемый хостинг партнер 1С-Битрикс (https://www.ihead.ru/bitrix/), PHP-хостинг (https://www.ihead.ru/php/), доверенный партнер RU-CENTER (https://www.ihead.ru/news/573.html), официальный представитель REG.RU в Кирове (https://www.ihead.ru/news/851.html)
P
На сайте с 16.03.2009
Offline
144
#5
iHead:
месье, теоретик? :)

пойду проверю... Проверил на php-fpm. (не для этого случая проверил =( )

В главном конфиге убираю disable_functions

Делаю тестовый скрипт и получаю результат.

echo shell_exec("ls");

Далее в pool.d в один из конфигов пишу например php_admin_value[disable_functions] = "shell_exec"

Пробую снова. Результат не получаю. В и логе

PHP Warning: shell_exec() has been disabled for security reasons

____________

Да, нельзя. Нашел.

This directive must be set in php.ini For example, you cannot set this in httpd.conf.
Б
На сайте с 11.11.2012
Offline
0
#6

Лечите болезнь, а не следствия.

Как вам заливают шеллы?

Можно отключить интерпретацию php в папке uploads, или подобной, проверять заливаемый файл.

Либо же минимизировать риски с помощью отдельных пользователей, или chroot.

Если сервер позволяет, может проще поднять полноценную виртуальную ферму?

Какой у вас дедик?

Goldsnich
На сайте с 17.07.2011
Offline
52
#7

Бергштейн,

я не знаю как их заливают. Сканировала и нашла их. У меня там более 50 сайтов, конфигурировать каждый будет проблематично, поэтому пока глобально отключу функции.

У сервера 1 Gb памяти, сам сервер виртуальный. Кстати да, интересный вариант с разбитием на аккаунты. А вы случайно мануал не подскажите толковый ?

Andreyka
На сайте с 19.02.2005
Offline
822
#8

Каждый сайт - в свой аккаунт

Ну и скрипты под свлими юзерами пускать, а не под общим

Не стоит плодить сущности без необходимости
Goldsnich
На сайте с 17.07.2011
Offline
52
#9

Ну я поняла, а сама реализация этого как настраивается?

Сейчас да, апач работает от www:www, и стоит только одна учетная запись рута.

Garin33
На сайте с 31.08.2009
Offline
169
#10

Вручную запаритесь настраивать.

Переустановите сервер, на него панельку управления (ispmanger/directadmin и т.д.) и затем восстановите все сайты, но уже в разные акки.

Потому что Drupal - это круто.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий