LINUX.ORG.RU
ФорумAdmin

Хостинг множества сайтов и безопасность

 , ,


1

4

Такая вот неприятная ситуация возникла.

Есть некий сервер, на котором лежит много-много сайтов. Сайты, в основном, на вордпрессе и подобном, причем разной степени свежести - какие-то сделаны хорошо и аккуратно. а какие-то годами не трогали, и работают они на святом духе. Сверху крутится nginx + apache, почти все сайты под одним пользователем (есть и другие, но не о них этот пост).

И вот повадились злые хакиры тыкать уязвимости в древнем php-коде, грузить всякую гадость, файлы затирать да почту слать. Происходит такое редко, но каждый раз доставляет кучу проблем - вычищать кучу левого кода и оправдываться перед хостером за тысячи спамов, мягко говоря, неприятно.

При этом есть почти стопроцентная уверенность, что никаких серьёзных эксплойтов, троянов и прочего нет, максимум, что эти гады получают - возможность писать под правами апача (www-data) в соседние директории. Захламляют всё, логи auditd пухнут, читать невозможно. Причем делают это, скорее всего, какие-то боты.

В общем, надо это дело как-то ликвидировать, при этом по условиям задачи проверить весь код и исправить все сайты невозможно - их штук 50, а ресурсов, как обычно, нет. При этом точно ясно, что дырявых сайтов не так много, может десяток, но вычислить их не получается.

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

Вот тут возник вопрос - а как сейчас это лучше всего сделать максимально просто? По условиям задачи апачи должны остаться, так как без .htaccess нельзя, а также вся конструкция должна быть относительна понятна и удобна.

Что пришло в голову:

1. Апач с suexec, каждый сайт у отдельного юзера. Говорят, что тормозит немного, что неприятно. Но добавление сайтов простое, в общем-то.

2. Апач с fastcgi и то же самое. Вроде посовременее, но на apache 2.2 у меня лично fpm настраивался как-то очень тяжко, а mod-fcgid/mod-fastcgi почему-то ругают. Но тоже вариант. Просто nginx с php-fpm не подходит из-за htaccess.

3. Какие-нибудь контейнеры, docker там, lxc, вот это всё. Красиво и даже по-хипстерски, но смущает не самая простая процедура разворачивания проектов, нужно тыкать какой-то git, заморачиваться с виртуальными хостами, портами и тому подобным (сходу в гугле красивое решение не нашлось, но может плохо искал). В команде есть люди, которые сидят на винде, и им это всё будет страшно, а пользоваться придётся.

Виртуалки как-то не хочется, сервер не такой жирный.

А что бы вы посоветовали, господа?

★★★

Последнее исправление: Klymedy (всего исправлений: 2)

751 на /home (или где там у вас сайты складируются) будет достаточно, чтобы боты не гадили в чужие вхосты.

Можете еще mpm_itk посмотреть. Хоть он идеологически неверен (т. к. апач будет работать от рута), но настройка практически не отличается от mpm_prefork (по паре строк в конфиги вхостов добавить).

NeOlip ★★
()
Ответ на: комментарий от NeOlip

751 на /home (или где там у вас сайты складируются) будет достаточно, чтобы боты не гадили в чужие вхосты.

Не, там все как раз под одним юзером висят, т.е. в одном home, просто в разных директориях, а веб-серверу права дали через setfacl. Запретить серверу писать нельзя, а если разрешить - то разрешается для всей домашней директории. Так вот сложилось исторически, увы.

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

mpm_itk посмотреть

О, спасибо, совсем забыл про него. Почитаю.

risenshnobel ★★★
() автор топика
Последнее исправление: risenshnobel (всего исправлений: 1)

Я тут полистал. Пришло в голову слегка костыльное решение, но зато без модулей опяча и прочих:

http://php.net/manual/ru/ini.core.php#ini.open-basedir

Написано, что можно в настройках вхоста отключить возможность кастомной установки значения через .htaccess или рантайм ф-цию ini_set() в коде. Т.е. — запереть в директории индивидуальной для вхоста должно получиться.

deep-purple ★★★★★
()

Несколько инстансов apache, запущенных под разными пользователями. Тоже сложно и неудобно?

gh0stwizard ★★★★★
()

mod-fcgid/mod-fastcgi почему-то ругают

кто ругает? я лично разворачивал shared-хостинг с помощью mod-fcgid, причем собирал там 3 версии пыхпыха (5.2, 5.3 и 5.4) - все с кастомными префиксами. а дальше через wrapper задавал нужному пользователю нужную версию пыхпыха. ну и конечно же suexec.
от хакиров гляди еще на suhosin https://suhosin.org/stories/index.html и на mod_security. от спамеров - php mail header patch - так вроде называется штука, которая в отсылаемое пыхпыхом мыло добавляет заголовки с логином пользователя и айпишником, вызвавшим скрипт..

Komintern ★★★★★
()
Последнее исправление: Komintern (всего исправлений: 1)
Ответ на: комментарий от deep-purple

во-первых, на функции типа shell_exec оно не действует, а влияет только на пхпшный fopen() и прочие.
во-вторых, большинство популярных бесплатных цмс не будет с ним работать (пруф https://www.drupal.org/node/1959050).

Komintern ★★★★★
()
Ответ на: комментарий от gh0stwizard

Несколько инстансов apache, запущенных под разными пользователями. Тоже сложно и неудобно?

Можно и так, конечно, но это не сильно лучше того же itk или suexec (в моём случае), но более громоздко в плане настройки.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от Komintern

кто ругает?

Много кто: 1, 2. О том, что можно так сделать, я знаю, видел такое, но хочется тогда уж сразу взять php-fpm как более современное решение. А эти модули с ним как-то с трудом настраиваются, лучше взять mod_proxy_fcgi, но он для apache 2.4, а у меня 2.2, так как дебиан стабильный.

php mail header patch

Мы пока через mail.add_x_header ловим, там примерно то же самое, но баз айпишника. Но обычно скрипт, который шлёт, не является основной проблемой, там где-нибудь рядом лежит другой скрипт, который позволяет скрипты первого типа загружать.

Айпишники постоянно меняются, вокруг одни ботнеты, даже банить уже не хочется.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от risenshnobel

suhosin попробуй, я выше писал. через него запрети выполнять вот это:

eval, exec, passthru, shell_exec, escapeshellarg, escapeshellcmd, system, proc_open, proc_get_status, proc_close, popen, show_source, chmod, symlink, fsocket, pfsockopen, fsockopen

ну и fail2ban на нужные логи натрави, чтоб парсить и банить автоматически. fpm не пробовал, ничего сказать не могу. про mpm-itk - совершенно ужасная хрень, глючит как дикий ёж, рандомно сегфолтит апачевские child-ы, тормозов добавляет дай Б-же, короче не рекомендую даже связываться если это production-сервер.

Komintern ★★★★★
()
Последнее исправление: Komintern (всего исправлений: 2)
Ответ на: комментарий от Komintern

suhosin попробуй

Попробую. Раньше под ним ещё что-то из сайтов не работало, к сожалению (я даже не хочу знать, как они эти сайты писали, если честно, там жутко).

короче не рекомендую даже связываться если это production-сервер.

Хм, ок.

risenshnobel ★★★
() автор топика

Красиво и даже по-хипстерски, но смущает не самая простая процедура разворачивания проектов

Вон. Из. It.

tazhate ★★★★★
()
Ответ на: комментарий от Komintern

eval, exec, passthru, shell_exec, escapeshellarg, escapeshellcmd, system, proc_open, proc_get_status, proc_close, popen, show_source, chmod, symlink, fsocket, pfsockopen, fsockopen

Ах, если бы некоторые сайты не использовали passthru, system и chmod...

risenshnobel ★★★
() автор топика
Ответ на: комментарий от risenshnobel

вот некоторым и разрешишь. при fastcgi можно каждому юзеру свой php.ini =)

Komintern ★★★★★
()
Ответ на: комментарий от tazhate

Вон. Из. It.

Лол.

Если серьёзно, то я как раз и не против навернуть контейнеров, но в есть люди, которые работают с выкладыванием по ftp, редактированием файлов на сервере и не очень хорошим опытом с линуксовой консолью. И не в моих силах это поменять.

И когда у них что-то не получается, всё идёт ко мне, а мне и без этого задач хватает (и заниматься выкладыванием сайтов - не моё дело вообще). Внедрять хитрую систему скриптов, puppet-ы, CI и так далее нет возможности. Где можно - там всё более-менее по-человечески сделано, но это не про этот сервер.

То есть workflow критически страдает, но приходится с этим жить. Уныло, да.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от risenshnobel

И не в моих силах это поменять.

В твоих силах организовать через контейнеры sftp доступ. Благо способов хватает, контейнеры же.

tazhate ★★★★★
()
Ответ на: комментарий от tazhate

Меня больше смущает абстрактная процедура разворачивания нового сайта в новом контейнере, чтобы пользователь мог сделать пару простых действий и получить сайт. Сейчас он берёт шаблонный конфиг для nginx и апача и просто меняет директорию и домен.

С контейнерами придётся придумать что-то ещё, и 1) я сходу не знаю, как лучше всего автоматизировать (потому и спрашиваю, собственно, может кто подскажет куда копать), 2) описанные выше способы с suexec и fastcgi выглядят проще, а хочется начать с простого.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от tazhate

Сейчас всё по ssh делается вручную.

В принципе, нужно что-то примерно такое же, чтобы пара скриптов и всё заработало, причем скрипты должны быть отказоустойчивые до невозможности, чтоб ничего не запороть, когда рядом нет специалиста по этой штуке для помощи.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от risenshnobel

У меня похожая задача, и я присматриваюсь к: git+ansible+docker+rundesk (http://rundeck.org/) + можно развернуть файловую вебморду + ссш через веб. И можно всё творить из браузера.

DALDON ★★★★★
()
Последнее исправление: DALDON (всего исправлений: 1)

Мой типовой конфиг: nginx+php-fpm, на каждый сайт по юзеру и группе (обычно имя юзера = основной домен сайта, например example.com, но не всегда это хорошая идея). Файлы сайта принадлежат этому юзеру и группе. Пользователь от которого работает nginx входит в группы всех сайтов, php-fpm запускается от пользователя и группы сайта. umask 007 (пользователь и члены группы имеют полны доступ, все остальные не имеют ничего), плюс на все директории сайтов устанавливается SGID бит (для директорий это наследование группы для создаваемых субдиректорий).
Если надо дать пользователю vasya (например вебмастеру) доступ к сайту example.com то достаточно добавить его в группу example.com (adduser vasya example.com).
Делается всё это примитивным башовым скриптом. Брат жив.

С апачём такое можно реализовать используя mpm_itk, но выше говорили что на продекшене это боль (не знаю, не пробовал).
Дополнительно завернуть бекэнд (apache или php-fpm) в контейнер, это плюс несколько строк к скрипту (и несколько часов/дней (в зависимости от степени слоупочности) на воскурение мануалов и подготовку шаблона).
Кстати используя контейнеры можно запилить схему без перехода на php-fpm или mpm_itk.

MrClon ★★★★★
()

мне нравится: suexec и fcgi_mod .

и ещё думаю что — itk нужно НЕ использовать — так как оно сожрёт память, выделяя ресурсы отдельно на каждого пользователя. suexec лучше для этих же целей, а itk слишком расточительно.

apache 2.2

думаю apache-2.4 побыстрее долежен работать.

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

думаю apache-2.4 побыстрее долежен работать.

Просто у нас там стабильный дебиан и нет особого желания из него вылазить.

risenshnobel ★★★
() автор топика
Ответ на: комментарий от risenshnobel

добавь репу тэстинга, снизь ей приоритет и установи apache из неё

snaf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.