Безопасность · 6 min read · Jan 04, 2026
Представляем Remo - простой способ защитить небезопасное онлайн-приложение с помощью ModSecurity
Представляем Remo - простой способ защитить небезопасное онлайн-приложение с помощью ModSecurity
Предположим, у вас есть неприятное приложение на вашем веб-сервере Apache, которое было установлено какими-то неудачниками из отдела маркетинга, и вы не можете его ни исправить, ни удалить. Возможно, это проблема ресурсов, нехватка знаний, отсутствие исходного кода или, возможно, даже политические причины. Следовательно, вам нужно защитить его, не трогая его. Есть ModSecurity, но говорят, что это только для экспертов. Простой альтернативой является Remo, графический редактор правил для ModSecurity, который использует подход с белым списком. У него есть все, что вам нужно, чтобы заблокировать приложение.
В рамках этого учебника мы будем использовать действительно простое тестовое приложение. Одно из тех, что настолько уродливо, что даже ваш отдел маркетинга не захочет его иметь. Но эй, это всего лишь учебник.
';
echo $_POST['command'];
echo '
';
system($_POST['command'], $retval); # нужно для команд 'ls'
echo '';
echo 'Return value: ' . $retval; echo '
'; echo ''; ?>
ls.php: Небольшой скрипт, который вам лучше удалить с вашего сайта, пока можете.Прямое выполнение любой команды оболочки, отправленной в виде параметра command, делает ls.php нежелательным гостем на любом веб-сервере - или идеальным тестовым случаем, чтобы попробовать Remo для защиты от опасностей этого скрипта. Так что же такое Remo? На сайте remo.netnea.com вы узнаете, что он предназначен как простой способ настройки ModSecurity, не становясь сначала мастером безопасности. Второй момент заключается в том, что Remo пишет правила белого списка, в то время как большинство людей используют ModSecurity с подходом черного списка. Черный список означает, что вы сообщаете ModSecurity все о всех известных атаках. Белый список делает это наоборот: он гарантирует, что ваше приложение получит только тот ввод, который вы действительно хотите, чтобы оно получало. Таким образом, ls.php будет получать только команды ls в качестве параметра команды, и более того, вы убедитесь, что никакие грязные трюки невозможны с использованием обратных кавычек и точки с запятой в параметре. Короче говоря: Remo помогает выполнять проверку ввода на сервере, не трогая приложение.
Установка
Вы можете попробовать Remo в онлайн-демо на главной странице. Оно работает отлично, когда вы хотите попробовать Remo, не устанавливая его сначала. Установка тоже не очень сложная, даже без готовых дистрибутивов. Убедитесь, что у вас установлены ruby, irb и привязки ruby-sqlite3 перед загрузкой.
Я выполнил следующее на своем тестовом компьютере с Ubuntu; это должно работать и для Debian:
aptitude install ruby irb libsqlite3-ruby1.8Что касается Remo, вы можете либо загрузить релиз, либо взять снимок последнего дерева подверсии. Страница загрузки Remo сообщает, какие деревья прошли все модульные тесты. Допустим, мы загружаем и устанавливаем релиз. Перейдите на страницу загрузки и получите бета-релиз 0.2.0. Распакуйте архив и запустите сервер WEBrick rails. С командной строки это сводится к:
wget http://remo.netnea.com/files/remo-0.2.0.tar.gz
tar xvzf remo-0.2.0.tar.gz
cd remo-0.2.0
ruby script/server
direct browser to http://localhost:3000/main/indexВы должны получить что-то вроде этого:

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

Добавление нового запроса в Remo.Нажмите на текст “нажмите для редактирования” и введите путь к вашему приложению: /ls.php, затем измените метод http на POST. Откройте детали запроса и добавьте новый параметр поста, используя кнопку p* рядом с параметрами поста. Нажмите на имя (нажмите для редактирования) и сделайте его command. Это параметр, отправляемый нашим примером приложения ls.php.
Справа от имени находится область значения параметра. Это центральная часть Remo. Здесь вы определяете, какие значения приемлемы для параметра. Помните, это белый список: мы точно определяем, что приемлемо. Есть несколько предопределенных значений, но в этом случае нам придется выбрать Custom. Если вы откроете детали параметра command, там есть поле под названием Custom regex. Это то место, где Remo ищет регулярное выражение, когда область значения - Custom. Я буду использовать ls[0-9a-zA-Z-\x20_.]{0,64}. Это команда ls, за которой следует необязательная группа символов, состоящая из цифр, букв, дефисов, пробелов, символа подчеркивания и точки. Никаких точек с запятой, никаких слешей, никаких обратных кавычек, никаких немецких умлаутов, никаких юникодных особенностей: это ваш сервер, и вы не хотите, чтобы здесь происходило что-то странное.

Защита для ls.php на пути с определением параметра POST command.Запрос, не соответствующий этому условию, будет отклонен. Стандартное поведение Apache для неудачного запроса будет возвращать код состояния http 501: Метод не реализован. Но давайте будем добрыми: в качестве кода состояния (неудачное совпадение домена) вы вводите 302 для http-перенаправления, а ниже в Location (неудачное совпадение домена) вы вводите URL вашего сайта, например http://www.netnea.com. Таким образом, кто-то, не предоставивший правильный параметр, будет перенаправлен на сайт вашей компании. На самом деле, вы можете сделать параметр обязательным, нажав на необязательный, и ниже вы можете установить специальное поведение для неудачного обязательного условия. Но в нашем случае параметр не обязательно должен быть обязательным.
Если вы задаетесь вопросом, как этот параметр регулярного выражения будет преобразован в правило ModSecurity, тогда взгляните на следующую графику:

Вот как конфигурация параметра Remo переводится в правило ModSecurity.Это описывает, как ваш параметр Remo переводится в правило ModSecurity и что произойдет во время оценки. Это сводится к следующему: каждый параметр http-запроса сопоставляется с областью значений, определенной в Remo, и если он не подходит, то весь запрос получает отказ в доступе.
Применение на практике
Сказав это, давайте сгенерируем набор правил ModSecurity. Нажмите на кнопку генерации на панели инструментов и сохраните файл, который вы получите. Это файл правил на языке правил ModSecurity. Возьмите этот файл и сохраните его в месте, где Apache сможет его найти. Кстати, стоит взглянуть, чтобы понять, как Remo использует ModSecurity. Затем вам нужно убедиться, что ModSecurity включен на вашем веб-сервере. Remo генерирует наборы правил ModSecurity 2, так как между 1.9 и 2.0 произошло значительное обновление и расширение языка конфигурации, и Remo нуждается в этих новых функциях. В случае, если ваша дистрибуция не предоставляет пакеты ModSecurity, вы можете получить большинство из них с http://www.modsecurity.org. В противном случае вы всегда можете скомпилировать его самостоятельно. Это не слишком сложно.
Лучше всего включить ваш файл правил в конфигурацию apache следующим образом:
Include /etc/apache2/rulefile.conf
Затем перезагрузите ваш apache и попробуйте:
curl --data "command=ls -l" http://localhost/ls.php-rw-r--r-- 1 sam staff 353 Feb 7 13:05 index.html
-rw-r--r-- 1 sam staff 248 Apr 23 05:35 ls.php
...Итак, это все еще работает. Как насчет злоупотребления ls.php?
curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
302 Found
Found
Документ был перемещен сюда.
Apache/2.2.3 (Debian) PHP/5.2.0-8 Server at railsmachine Port 80
Поймали злоумышленника! В конфигурационном файле определен журнал аудита. По умолчанию он находится по адресу /var/log/apache2/modsec_audit.log. В нашем случае он будет выглядеть следующим образом:
...
--2957a220-H--
Сообщение: Доступ запрещен с перенаправлением на http://www.netnea.com с использованием статуса 302 (фаза 2).
Совпадение "rx ^(ls\x20[0-9a-zA-Z-_.]{0,64})$" против "ARGS:command" требуется. [id "1"]
[msg "Проверка валидности параметра Postparameter command не прошла. Область значений: Custom."] [severity "ERROR"]
Действие: Перехвачено (фаза 2)
...Перед переходом в режим производства убедитесь, что этот журнал не растет слишком большим. На самом деле, вы можете отключить слишком много журналирования, когда закончите настройку. Файл журнала по умолчанию настроен Remo для полного журналирования запросов в целях отладки. Это включает в себя все, даже пароли. Когда вы закончите тестирование, вам следует установить параметр SecAuditLogParts в файле правил на более разумное значение. ABHZ - это вариант. Таким образом, он будет журналировать только http-заголовки и сводку аудита ModSecurity.
Таким образом, это был быстрый обзор Remo. Есть много информации на сайте Remo. ModSecurity.org имеет отличную документацию, которая расскажет вам все о языке конфигурации. Кроме того, есть набор основных правил, который поможет вам в ситуациях, когда у вас нет времени моделировать ваше приложение в Remo. Набор основных правил всегда является хорошим началом, так как он поймает 90% атак с очень небольшими усилиями.
Remo далек от зрелости, но он готов к использованию, и при наличии полезной пользовательской базы он может развиться в интересный инструмент для защиты веб-приложений. Ваше приложение не обязательно должно быть таким простым, как то, что использовалось в этом учебнике. Более крупные приложения с десятками URL и множеством параметров также работают хорошо.
Get new posts in your inbox
No spam. Unsubscribe anytime.