WAF ПРОЕКТ SHADOW DAEMON

Очевидно, лучше всего защищаться от атак на веб-приложения правильно напи-
санным кодом, но даже в тех проектах, где уделяют серьезное внимание тести-
рованию, постоянно находят и будут находить уязвимости. Модули, написанные
сторонними разработчиками, вообще потенциальная брешь в безопасности.
Не секрет, что ошибки обнаруживают даже в аддонах, предназначенных для за-
щиты сайтов. Повышая безопасность, они сами оказываются проблемой. В этом
случае WAF (Web Application Firewall) становится чуть ли не единственным пре-
пятствием, не позволяющим хакеру выполнить свои действия.
Shadow Daemon — это небольшое приложение, которое обеспечивает без-
опасность веб-сервисов, перехватывает запросы, отфильтровывает вредонос-
ные параметры и протоколирует все события. Написан Хендриком Бухвальдом
(Hendrik Buchwald) как университетский проект и в настоящее время служит не-
плохой заменой коммерческим WAF, особенно для небольших проектов. Вер-
сия 1.0 была представлена в январе 2015-го, сегодня уже доступна версия 2.
SD прост и не требует особых навыков, хотя, конечно, при их наличии можно
легко адаптировать его под любые условия. Идея состоит в том, что система
настроена не на конкретные уязвимости в конкретном приложении, а на уяз-
вимые места в общем: SQL-команды в запросе, параметры HTML/JavaScript,
используемые в XSS, аномальные параметры в массивах и так далее. В отли-
чие от многих других брандмауэров веб-приложений Shadow Daemon не бло-
кирует вредоносные запросы. Вместо этого он только отфильтровывает опас-
ные части и позволяет запросу выполняться дальше. Это делает невозможным
проникновение, но вводит в заблуждение атакующего. Для точного обнаруже-
ния запросов используются белый и черный списки, которые администратор
может редактировать под свои условия.
В черном списке при помощи регулярных выражений производится поиск
известных атак во входных данных. Каждый фильтр имеет вес, задающий некое
значение неблагонадежности запроса. Значение всех фильтров суммируется
и сравнивается с пороговым значением. Если показатель запроса больше, чем
установленный порог, запрос классифицируется как угроза. Черный список
хотя и обнаруживает большинство алгоритмов атак, но не гарантирует полную
безопасность. Всегда есть вероятность, что будет подобран запрос, который
пройдет фильтры. Черные списки обязательно должны быть включены.
Белый список определяет, как должны выглядеть нормальные входящие
данные. Если под запрос не найдется соответствующее правило, он будет от-
несен к угрозе. Если правило найдено, алгоритм проверяет набор символов,
придерживается ли запрос ограничения длины. Это позволяет обнаружить лю-
бую атаку с достаточно низким порогом ложных срабатываний.
Третий компонент — алгоритм целостности (integrity), сверяющий кон-
трольную сумму запроса и правила при наличии правила в белом списке (если
его нет, то запрос однозначно рассматривается как угроза). Словарь хешей
содержит алгоритмы и соответствующие им значения исполняемого файла
сценария. Белый список и integrity можно первое время не использовать, что-
бы убедиться, что все работает нормально.
Shadow Daemon построен по модульному принципу, когда подсистема за-
хвата (connector), анализа (демон shadowd) и интерфейс разделены для луч-
шей гибкости, расширяемости и обеспечения безопасности. Необязательный
веб-интерфейс позволяет исследовать атаки в мельчайших подробностях.
В комплект входят скрипты, которые могут быть использованы для отправки
отчетов по электронной почте и ротации журналов. Если нужно просто защи-
тить сайт, не вникая в детали и не подстраивая работу Shadow Daemon, то ин-
терфейс можно не ставить.
Коннектор «подключается» к интерпретатору и перехватывает соединение
между веб-сервером и приложением и передает по TCP (в JSON-формате) де-
мону shadowd IP, идентификаторы ввода/пути, входные данные, хеш и прочую
информацию. В ответ получает один из шести статусов от OK: 1 до CRITICAL_
ATTACK: 6 и массив идентификаторов входа. На данный момент доступны кон-
некторы, обеспечивающие работу с приложениями, написанными на PHP, Perl
и Python, планируется добавление других языков.
Веб-приложения могут отличаться по настройкам, и общие правила мо-
гут не подходить для всех. Поэтому в SD реализованы профили, позволяющие
указать специфические для каждого хоста установки. В общем, лучше исполь-
зовать профиль для каждого приложения.
УСТАНОВКА SHADOW DAEMON
Для установки демона shadowd проект предлагает исходные тексты и пакеты
для Debian/Ubuntu и Red Hat / CentOS. Для Ubuntu доступен и репозиторий.
Кроме того, можно использовать образ Docker, в этом случае получаем сразу
полностью настроенную и готовую к работе систему.

 

$ sudo add-apt-repository ppa:zit-hb/shadowd
$ sudo apt-get update
$ sudo apt-get install shadowd
Переходим к настройке базы данных. В настоящее время поддерживается
PostgreSQL или MySQL. В /usr/share/shadowd лежат шаблоны, нужно только
выбрать и импортировать подходящий. Импортируем шаблон для MySQL:
$ mysql -uroot -p
> CREATE DATABASE shadowd;
> USE shadowd;
> GRANT ALL PRIVILEGES ON shadowd.* to ‘shadowd’@’localhost’
IDENTIFIED BY ‘password’;
> FLUSH PRIVILEGES;
> source /usr/share/shadowd/mysql_layout.sql;
Все настройки shadowd прописаны в конфигурационном файле /etc/shadowd/
shadowd.ini. Файл в общем несложный, и практически все параметры проком-
ментированы; кроме подключения к базе данных, можно оставить как есть:
Перезапускаем сервис:
$ sudo service shadowd restart
Проверяем:
$ sudo netstat -tpln | grep shadowd
tcp 0 0 127.0.0.1:9115 0.0.0.0:* LISTEN 3094/shadowd
Ставим коннектор для PHP.
$ git clone https://github.com/zecure/shadowd_php.git
Настраиваем коннектор для PHP, чтобы Shadow Daemon начал защищать си-
стему. Ничего компилировать не нужно, просто копируем содержимое src
в любое удобное место, но надо убедиться, что веб-сервер может прочитать
файлы.
$ sudo mkdir /usr/share/shadowd/php
$ sudo cp -Rv shadowd_php/src/* /usr/share/shadowd/php
Теперь следует сообщить PHP о новом скрипте. В зависимости от ситуации
это можно сделать несколькими способами. Если защита нужна для всех сай-
тов, то прописываем в php.ini:
auto_prepend_file /usr/share/shadowd/Connector.php
Если защищать будем отдельный хост, то пишем в настройках виртуального
хоста Apache или .htaccess:
php_value auto_prepend_file «/usr/share/shadowd/php/Connector.php»
Для nginx настройка в виртуальном хосте чуть другая:
fastcgi_param PHP_ADMIN_VALUE «auto_prepend_file=/usr/share/shadowd/
php/Connector.php»;
Копируем конфигурационный файл для коннектора.
$ sudo cp -v shadowd_php/misc/examples/connectors.ini /etc/shadowd/
connectors.ini
Файл хорошо прокомментирован, и некоторые установки говорят сами
за себя, более подробное описание есть в документации. Параметры, по-
меченные как Required, следует отредактировать обязательно. Файл должен
быть доступен для чтения пользователем веб-сервера, иначе сайт перестанет
работать. Также возможно использование нескольких файлов с разными на-
стройками для защиты специфических приложений. Нужный файл можно ука-
зать в переменной SHADOWD_CONNECTOR_CONFIG.
УСТАНОВКА ВЕБ-ИНТЕРФЕЙСА
Веб-интерфейс доступен только в Git, для его работы понадобится веб-сер-
вер, поддерживающий PHP. Для Apache, nginx и lighttpd на сайте проекта до-
ступны правила rewrite.
$ cd /var/www
$ sudo git clone https://github.com/zecure/shadowd_ui.git
Настраиваем виртуальный хост на корневой каталог /var/www/shadowd_ui/
web. Настройки стандартные, приводить их не буду. Для Apache там уже есть
подготовленный .htaccess, нужно просто его разрешить.
Веб-интерфейс написан с использованием PHP-фреймворка Symfony 2, раз-
работчики приготовили пакет, позволяющий скачать все нужное при помощи
менеджера зависимостей Composer.
$ cd /var/www/shadowd_ui
$ curl -s https://getcomposer.org/installer | php
$ php composer.phar install
Программа запросит, какие будем использовать драйверы базы данных. Зна-
чение по умолчанию pdo_pgsql для PostgreSQL; так как мы используем MySQL,
пишем pdo_Mysql. И устанавливаем остальные параметры для подключения
к базе данных. Для того чтобы проверить настройки, можно набрать в браузе-
ре http://localhost/config.php.
Добавляем нового администратора:
$ php app/console swd:register —env=prod —admin —name=admin
—email=null@example.org
Email необязателен и используется пока только для отправки отчетов. Реги-
стрируемся в веб-админке. Первым делом нужно создать профиль. Перехо-
дим в Management –> Profiles, нажимаем Add и заполняем параметры. Зна-
чения по умолчанию вполне подходят для большинства случаев. Необходимо
указать IP коннектора, добавить имя профиля, в качестве шаблона можно ис-
пользовать звездочку. И вводим ключ для авторизации запросов. Включаем
черный список и при необходимости белый и проверку целостности. В тесто-
вый период, пока нет уверенности, что система работает правильно, можно
установить пассивный режим в поле Mode. В Global threshold прописываем по-
рог срабатывания. Оптимальное значение находится в пределах между 5 и 10.
Лучше начать с наименьшего значения, поэтому ставим 5. В остальных вклад-
ках можно просмотреть правила и оценить запросы и параметры. Фильтры
и поиск позволяют быстро отобрать нужные.
ВЫВОД
Конечно, Shadow Daemon, повышая безопасность, для анализа данных по-
требует некоторого количества ресурсов. Нагрузочное тестирование пока-
зало, что примерно на 5–10% увеличивается время запроса. Для небольших
VDS это может быть уже проблемой. Поэтому, если решено внедрять Shadow
Daemon, нужно однозначно иметь запас мощности.