Веб-приложения, отличающиеся разнообразием и высокой интерактивностью, сегодня представляют собой большую проблему безопасности. Ведь по статистике большинство современных атак направлены именно на веб-сервисы, и привычные инструменты, работающие на сетевом уровне, их не могут остановить. Поэтому специальные решения, позволяющие защитить веб-сайты, востребованы как никогда. Для небольших проектов коммерческие решения обычно чересчур дорогое удовольствие, поэтому появление очередного open source 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
Управление профилями в Shadow Daemon
 

Установка 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 nano /etc/shadowd/shadowd.ini

# Server
#port=9115

# Потоки нужно подстроить под свою нагрузку
#threads=15

# Daemon

log=/var/log/shadowd.log

# Database

db-driver= mysql
db-host=127.0.0.1
db-port=3306
db-name=shadowd
db-user=shadowd
db-password=password
Редактируем shadowd.ini
Редактируем 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.

$ sudo chmod a+r /etc/shadowd/connectors.ini
$ sudo nano /etc/shadowd/connectors.ini

[shadowd_php]
; ID профиля
profile=

; Ключ
key=key_1

; Адрес shadowd
host=127.0.0.1

; Порт shadowd
port=9115

; По умолчанию угрозы из запросов удаляются; для тестирования новых правил, анализа работы приложения или использования в honeypot можно установить в 1. И пропускать и регистрировать все запросы
;observe=0

; Включаем отладку
debug=1

; По умолчанию файла журнала /var/log/shadowd.log
;log=/var/log/shadowd.log
Настройки коннектора
Настройки коннектора
 

Установка веб-интерфейса

Веб-интерфейс доступен только в 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, нужно просто его разрешить.

<Directory /var/www/shadowd_ui/web>
    AllowOverride All
</Directory>

Веб-интерфейс написан с использованием 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
Веб-интерфейс Shadow Daemon
Анализ запросов в интерфейсе Shadow Daemon
Анализ запросов в интерфейсе Shadow Daemon
Настройка Black List
Настройка Black List

 

Open source WAF — выбирать не из чего

Запрос open source WAF выдаст не так много проектов: ModSecurity, IronBee, openWAF, NAXSI, WebKnight и Shadow Daemon. Но на поверку окажется, что их и того меньше. О ModSecurity сказано много, поэтому пару слов об остальных проектах.

IronBee и openWAF, пышно анонсированные в 2011 году, уже не развиваются. Проект WebKnight от AQTRONIX представляет собой ISAPI (Internet Server API) — фильтр, который защищает веб-сервер, блокируя определенные запросы на основе правил фильтрации, установленных администратором. Как и в случае Shadow Daemon, правила представляют собой не сигнатуры, а некие фильтры безопасности, обнаруживающие основные типы атак: переполнение буфера, инъекции SQL, CSRF, подстановку JavaScript-блоков и другие атаки. Использование ISAPI позволяет проверять SSL-трафик. Поддержка ISAPI есть в IIS, Apache (mod_isapi) и Zeus Web Server. Совместим с некоторыми популярными веб-приложениями: Frontpage, WebDAV, Flash, Cold Fusion, Outlook Mobile / Web Access, SharePoint и другими.

NAXSI (nginx anti XSS & SQL injection) — это WAF для nginx, проверяющий GET- и POST-запросы, а также заголовки HTTP при помощи достаточно простого (по умолчанию) набора правил, запрещающего опасные символы и ключевые слова, используемые в SQL. Таким образом, он помогает защитить веб-сайт от XSS, SQL-инъекций, CSRF, Local/Remote file inclusions и других атак. Хотя набор в некоторых случаях может помешать корректной работе сайта, и необходимо корректировать правила при помощи белого списка, разрешающего игнорировать запрещенные комбинации в некоторых контекстах. Обучающий режим и специальные утилиты nxapi/nxtool позволяют легко сформировать такой список. Пакет есть в репозиториях большинства дистрибутивов (в Ubuntu nginx-naxsi), поэтому его установка, настройка и внедрение обычно дело не очень сложное.

 

Вывод

Конечно, Shadow Daemon, повышая безопасность, для анализа данных потребует некоторого количества ресурсов. Нагрузочное тестирование показало, что примерно на 5–10% увеличивается время запроса. Для небольших VDS это может быть уже проблемой. Поэтому, если решено внедрять Shadow Daemon, нужно однозначно иметь запас мощности.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии