Фильтр Fail2ban для OpenVPN Access Server: real_ip и jail
Access Server пишет собственный формат журнала, поэтому стандартные фильтры ничего не находят. Закрепитесь на real_ip, разделите jail по поверхностям и проверьте, что адрес не является прокси.
Вы скопировали OpenVPN jail из поста сообщества, перезапустили fail2ban, и ни один адрес так и не блокируется. Причина почти всегда в формате журнала: Access Server не пишет строки о неудачной аутентификации, которых ждёт стандартный фильтр. Прежде чем трогать фильтр, убедитесь, что записи вообще есть, потому что шаблон не может совпасть с тем, чего служба никогда не записывала.
Это процедура, которой я следую на хосте с Access Server: подтвердить форму записи, написать одно закреплённое выражение, проверить его на реальном журнале, затем разделить jail по атакуемой поверхности и убедиться, что блокировка доходит до межсетевого экрана.
Убедитесь, что запись о неудаче существует
Access Server пишет свои структурированные строки в /var/log/openvpnas.log, а адрес клиента находится в поле real_ip в кавычках, а не в начале строки syslog. Перед тем как писать шаблон, найдите неудачный вход, который, как вы знаете, произошёл:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Если ничего не появилось, следующий подозреваемый — уровень журналирования. У Access Server есть отладочный переключатель базы данных журнала в /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), и службу нужно перезапустить после его изменения. Относитесь к этому переключателю как к диагностической настройке, которую надо снова понизить, когда шаблон будет готов, а не как к постоянной конфигурации.
Пока вы в файле, отметьте, какие поверхности в него пишут. Сбои клиентского портала, административного интерфейса и аутентификации туннеля попадают в один и тот же файл с разными маркерами, и эта деталь позже определяет раскладку jail.
Закрепите один фильтр на real_ip
Держите выражение узким. Фильтр, который присваивает каждую строку с IP-адресом, будет блокировать людей за обычные обрывы связи, а на загруженном сервере единственный симптом — жалобы пользователей, что их заблокировали за закрытие ноутбука. Присвойте запись об ошибке и захватите адрес в кавычках:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Ведущий пробел — не косметика. Access Server делает отступ в своих записях, и закрепление на нём не даёт шаблону присваивать ещё и строки, которые в тот же файл пишут несвязанные службы. Если в ваших записях вместо этого в начале стоит отметка времени, сопоставьте этот префикс, но закрепляйтесь на том, что действительно присутствует в каждой записи, которую вы собираетесь присвоить.
Когда нужна точность по поверхностям, сузьте ещё больше, требуя маркер поверхности (WEB_CLIENT, WEB_ADMIN или VPN) в той же строке. Один фильтр с тремя шаблонами проще проверять, чем три фильтра, различающихся одним словом.
Проверьте выражение до включения jail
Никогда не включайте фильтр, который вы не запускали на производственном журнале. Документированный тест пропускает фильтр дважды: один раз для загрузки и один раз для применения, а отчёт о пропущенных строках — та часть, которую стоит прочитать:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtСравните число совпадений со сбоями, которые вы подтвердили на первом шаге. Ноль совпадений означает, что шаблон неверен; совпадения на строках, которые не являются сбоями аутентификации, означают, что он слишком широк. Читайте missed.txt, пока не сможете объяснить каждую строку, которую решили не присваивать.
Делайте этот тест на копии, если журнал большой, и повторяйте его после любого обновления Access Server. Формат журнала — это интерфейс, с которым вы сопоставляете, и он не является стабильным API.
Разделите jail по поверхности, а не по демону
Один Access Server предоставляет несколько поверхностей аутентификации: клиентский и административный веб-интерфейсы на 943/tcp и туннель на 1194/udp или 443/tcp в большинстве развёртываний. Один jail, покрывающий их все, позволяет попыткам подбора на туннеле блокировать адрес, который также является вашим административным путём, и скрывает, какая поверхность на самом деле под атакой. Дайте каждой поверхности свой jail со своим портом и порогами:
# /etc/fail2ban/jail.d/openvpnaccess.local
[openvpnas-web-client]
enabled = true
port = 943
protocol = tcp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 3
findtime = 10m
bantime = 1h
[openvpnas-tunnel]
enabled = true
port = 443
protocol = udp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 5
findtime = 10m
bantime = 1hНачните с небольших счётчиков и короткой блокировки, а поднимите их после того, как понаблюдаете неделю реального трафика. Щедрый порог на общем офисном адресе наказывает каждого пользователя за одним NAT, а агрессивная блокировка на поверхности туннеля отключает законных клиентов, у которых сохранённые учётные данные истекли за ночь.
Проверьте блокировку, бэкенд и побочный ущерб
После перезапуска вывод статуса — самое быстрое подтверждение того, что jail существует и считает:
fail2ban-client status
fail2ban-client status openvpnas-tunnelЗатем убедитесь, что блокировка доходит до межсетевого экрана, который вы действительно ведёте, потому что jail, настроенный для бэкенда, который никто не применяет, ничего не защищает. С действием iptables адреса появляются в цепочке, названной по jail (f2b-openvpnas-tunnel); с действием nftables они попадают в набор в собственной таблице fail2ban. Проверьте тот, который использует ваш хост, вместо того чтобы предполагать.
Две побочные проверки важнее самой блокировки. Во-первых, убедитесь, что real_ip — это адрес клиента, а не балансировщик нагрузки или обратный прокси; за прокси каждая блокировка попадает на прокси и утягивает за собой весь сервис. Во-вторых, запишите процедуру разблокировки, потому что адрес, который в 02:00 превышает порог, обычно принадлежит дежурному инженеру: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Держите границу в голове, пока настраиваете. Fail2ban — это ограничитель скорости на одной поверхности аутентификации, а не слой контроля доступа. Он не заменяет MFA, ограничения по учётным записям или удержание административного интерфейса вне публичного интернета, и у Access Server есть собственные настройки autoban, которые стоит проверить, прежде чем ставить два ограничителя скорости на один и тот же порт.