Защита Apache с помощью ModSecurity

Способов защиты Web-сервера существует огромное множество. Начинать защиту нужно с обновления ПО и скрытия версий используемого ПО (как скрыть версии Web-сервера я рассказывал в статье Скрываем отображение версий Apache, Nginx и PHP). Далее можно установить WAF (Web Application Firewall) – файрвол для веб-приложений. ModSecurity – это файрвол выполненный в виде модуля для Apache, что позволяет его легко установить и использовать. Защититься с помощью ModSecurity можно от:

  • SQL-injection;
  • XSS;
  • троянов;
  • ботов;
  • захватов сеанса;
  • и многих других атак и взломов.

Начнем установку ModSecurity.
Для начала нам потребуется установить требуемый модуль:

apt-get install libapache2-mod-security2

и включить его:

a2enmod security2

По умолчанию правила фильтрации не включены, а сами правила имеют расширение .conf и подгружаются из директории /etc/modsecurity/ (местоположение правил указывается в файле /etc/apache2/mods-available/security2.conf) и выглядит следующим образом:

IncludeOptional /etc/modsecurity/*.conf

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

Добавим новые директории, в которых будут лежать наше правила.

crs – для базового набора правил;
custom – для своих правил.

Добавим свою директорию для дальнейшего расширения списка правил:

IncludeOptional /etc/modsecurity/rules/crs/*.conf
IncludeOptional /etc/modsecurity/rules/custom/*.conf

и создадим требуемые директории:

mkdir /etc/modsecurity/rules/crs
mkdir /etc/modsecurity/rules/custom

После этого включим базовую конфигурацию. Для этого скопируем или переименуем файл настроек по умолчанию (он находится в директории /etc/modsecurity/) modsecurity.conf-recommended в файл modsecurity.conf

cp /etc/modsecurity/modsecurity.conf{-recommended,}

немного изменим его:

первым заменим директиву SecRuleEngine DetectionOnly на

SecRuleEngine On

включив блокирование, а не только отслеживание.Все доступные параметры: On, Off, DetectionOnly.

Разрешим сканировать содержимое тела запросов:

SecRequestBodyAccess On

Ограничим размер POST запросов в параметре SecRequestBodyLimit. Если нет механизма загрузки файлов на сервер, то можно сильно ограничить передаваемые данные. Мы ограничим до 15MB. В байтах это будет 1024*1024*15=15728640

SecRequestBodyLimit 15728640

Ограничим хранимый в памяти POST запрос при передаче файла (за исключением размера самого файла), излишки будут свопиться на диск, что немного замедляет работу, но не дает переполнить память ни при каких условиях. Это делается в параметре SecRequestBodyInMemoryLimit. Ограничим 128Kb.

SecRequestBodyInMemoryLimit 131072

Основные правила настроены, а расширенный набор можно скачать на официальной странице OWASP ModSecurity Core Rule Set и положить *.conf файлы в ранее указанную директорию /etc/modsecurity/rules/crs, где находятся наши дополнительные правила.

В Debian дополнительные правила уже входят в пакет и находятся по адресу /usr/share/modsecurity-crs/.
Включим их создав симлинки в папку crs:

ln -s /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf /etc/modsecurity/rules/crs/modsecurity_crs_10_setup.conf

Так же для некоторых наборов правил требуются *.data файлы. Поэтому на них тоже нужно делать симлинки.
Я включил базовую настройку modsecurity_crs_10_setup.conf и некоторые правила из папки base_rules.
Не стоит включать все правила сразу. С большой вероятность это вызовет блокировку Web сервера.

Теперь остается только исключить директории, в которых ModSecurity ну нужен или мешается.
Это делается с помощью исключения из списка контролируемых в настройке хостов Web-сервера Apache. Для исключения целиком виртуального хоста используем следующий код:


SecRuleEngine Off

Для исключения конкретной директории можно воспользоваться таким кодом:



SecRuleEngine Off

Так же можно отключить конкретные правила для определенной директории или файла, например WordPress плохо дружит с правилами 981231, 950901 и 981172 (хотя и с многими другими тоже, но статья не об этом).



SecRuleRemoveById 960015 950901
SecRuleRemoveById 960015

В качестве примера выключим ModSecurity для phpMyAdmin.

Для отключения ModSecurity откроем файл конфигурации Apache для phpMyAdmin.
В Debian конфигурация phpMyAdmin находится по адресу /etc/phpmyadmin/apache.conf и имеет кучу символьных ссылок в самой директории Apache.

Откроем ее и в секцию добавим блок, выключающий ModSecurity.


...
...

SecRuleEngine Off

...
...

Остается только перезапустить Apache.

service apache2 restart

Теперь пара слов о грамотном внедрении. Многие правила могут вызвать отказ работы Web приложения. Из-за того, что ModSecurity посчитает запросы вредоносными. Поэтому лучше сначала включить только режим детектирования (SecRuleEngine DetectionOnly) и смотреть какие именно правила и когда применяются.
Посмотреть какие правила отрабатываются можно в файле логов. По умолчанию он лежит по адресу /var/log/apache2/modsec_audit.log. В этом файле пишется вся информация о работе ModSecurity.

Заказать Аудит Безопасности или Пентест Вашей IT-инфраструктуры

Быть уверенным в своей IT-инфраструктуре – это быть уверенным в завтрашнем дне.

Для того, чтобы сделать заказ:

Заполните форму обратной связи и мы обязательно с вам свяжемся:
Форма обратной связи
Позвоните нам по телефону:
+7(909)952-44-33
Напишите нам на электронную почту:
order@blackdiver.net
Напишите нам в Telegram:
Telegram
Другие способы связи Вы сможете найти в разделе Контакты.

Please Login to Comment.