Перейти к содержимому

Проактивный фильтр - уровни защиты, исключения, ложные срабатывания

Настраиваем проактивный фильтр: реакции на подозрительный запрос, уровни панели безопасности, доступ в админку по адресу и разбор ложных срабатываний.

Что нужно знать заранее

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

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

Уровни защиты вложены друг в друга и берутся строго по порядку возрастания. Следующий уровень включают только после полной настройки предыдущего, иначе панель безопасности откатывает оценку к последнему полностью настроенному.

Шаги

  1. Включить проактивный фильтр и оставить стандартный уровень защиты вообще без исключений.
  2. Проверить формы сайта и убедиться, что фильтр не отсекает обычные данные.
  3. Пройти уровни панели безопасности строго по порядку, не перепрыгивая через ступени.
  4. Перед закрытием админки по адресу добавить свой сетевой адрес в разрешённые.
  5. Разбирать ложные срабатывания по журналу вторжений, а не отключать фильтр целиком.

Решение

Смотрим состояние фильтра и уровень защиты:

\Bitrix\Main\Loader::includeModule('security');
printf("фильтр=%s\n", \COption::GetOptionString('security', 'filter_active'));
printf("стоп-лист=%s\n", \COption::GetOptionString('security', 'filter_stop_list'));
// уровень защиты целиком виден на панели безопасности в административной части

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

Разбираем ложное срабатывание по журналу:

SELECT TIMESTAMP_X, AUDIT_TYPE_ID, REMOTE_ADDR, DESCRIPTION FROM b_event_log
WHERE AUDIT_TYPE_ID LIKE 'SECURITY%' ORDER BY ID DESC LIMIT 20;
-- в журнале видно, какой запрос и по какому правилу отсекли

Журнал вторжений отвечает на главный вопрос разбора: что именно не понравилось фильтру. Без него правка настроек превращается в перебор галочек с надеждой на удачу.

Добавляем исключение точечно:

// исключение задают для конкретной страницы или параметра, а не для всего сайта
\Bitrix\Main\Loader::includeModule('security');
$exceptions = \COption::GetOptionString('security', 'filter_mask');
print_r(explode("\n", $exceptions)); // текущий список исключений фильтра
// после правки списка формы проверяют заново, вместе с журналом вторжений

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

Готовим страховку перед закрытием админки по адресу:

Окно терминала
touch /home/bitrix/www/bitrix/modules/ipcheck_disable_ЧАСТЬ_ИЗ_НАСТРОЕК
ls -la /home/bitrix/www/bitrix/modules/ | grep ipcheck # проверяем, что файл создан
# файл-флажок снимает ограничение по адресу, если вы заблокировали сами себя
# после восстановления доступа файл удаляют сразу: он открывает админку всем

Файл-флажок создают заранее, а не когда доступ уже потерян. Имя берут из настроек модуля безопасности, а после восстановления доступа файл сразу удаляют: он открывает админку всем.

Проверяем заголовок защиты от фреймов:

Окно терминала
curl -sI https://example.com/ | grep -i x-frame-options
curl -sI https://example.com/ | grep -i x-content-type-options
# два одинаковых заголовка от сайта и от веб-сервера дают непредсказуемое поведение

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

Типичные проблемы

Форма перестала отправляться после включения защиты.

Фильтр посчитал содержимое поля подозрительным и очистил его ещё перед сохранением. Исключение добавляют точечно для этого поля, а не отключают фильтр целиком.

Уровень защиты не растёт, хотя настройки включены.

Не выполнены все требования уровня, и оценка откатилась к предыдущему полному уровню. Панель безопасности прямо показывает, каких именно пунктов этого уровня ещё не хватает.

Администратор заблокировал сам себя по адресу.

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

Страница не открывается во фрейме у сервиса аналитики.

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

Сайт отвечает ошибкой на чужой домен.

Домен не указан в списке хостов сайта на этой многосайтовой копии. Все домены проекта перечисляют в настройках, иначе запросы к ним отсекаются.

Частые вопросы

Заменяет ли фильтр правильный код?

Нет, он отсекает типовые атаки и не знает вашей бизнес-логики. Экранирование, проверка данных и права остаются работой разработчика.

Какой уровень защиты выбрать?

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

Как понять, что фильтр мешает форме?

По журналу вторжений в момент отправки формы. Если запись есть, разбор идёт по правилу, из-за которого запрос отсекли.

Опасно ли добавлять исключения?

Точечное исключение для одного поля - разумный компромисс. Исключение для всего сайта равносильно выключенному фильтру.

Что делать после ложного срабатывания у покупателя?

Проверить журнал, добавить точечное исключение и убрать адрес покупателя из стоп-листа. Иначе он остаётся заблокированным до конца таймаута.

Смежное

Первоисточник