Каждый открытый сервис получает один и тот же совет: поставьте на него fail2ban. Для VPN-шлюза этот совет не ошибочен и не достаточен, и именно отношение к нему как к галочке в укреплении приводит к тому, что люди остаются с тюрьмой (jail), которая ничего полезного не блокирует. Fail2ban читает записи о неудачах, на которые вы его нацеливаете, и просит backend исполнения заблокировать совпадающие источники. Вся его ценность зависит от того, какая поверхность аутентификации создала запись, является ли адрес в ней настоящим клиентом и что происходит со всеми остальными за этим адресом.

Что такое fail2ban механически

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

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

Слушатель туннеля — не форма входа

Слушатель OpenVPN, защищённый tls-auth или tls-crypt, отбрасывает пакеты без защиты канала управления ещё до начала обычной обработки TLS. Сканер, у которого никогда нет ключа, не создаёт ничего, что мог бы посчитать ваш фильтр. Аутентификация по сертификату добавляет ещё одни ворота, потому что пароля, который можно угадать, нет. Проект Fail2ban документирует общую модель на основе журналов, и общий фильтр VPN не превращает неаутентифицированный пакет в значимое событие отказа.

Если шлюз принимает только сертификаты, истории про brute-force, от которой вы защищаетесь, на этом порту может вообще не быть.

Так какую поверхность вы защищаете?

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

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

Атрибуция источника — слабое звено

Блокировка хороша ровно настолько, насколько хорош адрес, на который она нацелена. Когда сервис стоит за локальным обратным прокси, адрес клиента в журнале может быть адресом прокси, и его блокировка убирает всех. Доверие к переданному заголовку из ненадёжного источника даёт атакующему возможность блокировать произвольные адреса. В UDP адреса источника можно подделать, поэтому их подсчёт требует больше осторожности, чем подсчёт завершённого входа по TCP.

Запишите метод атрибуции источника в README тюрьмы, потому что переданный заголовок из ненадёжного перехода превращает блокировку в оружие.

Побочная цена — другие люди

Несколько сотрудников за одним офисным NAT делят адрес, поэтому один устаревший сохранённый пароль может заблокировать весь офис, как только порог будет превышен. Журнал показывает один источник и одну учётную запись, которые не прошли, а не сбой всего офиса.

Короткие блокировки и умеренные пороги уменьшают это, а документированный путь разблокировки снижает нагрузку на поддержку, когда это всё же случается. Адрес — грубый сигнал, а не личность, и человек, открывающий заявку, опишет сбой, а не порог.

Когда это внедрять, а когда исправлять другое

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

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

Похожие статьи