Настраиваем универсальную систему защиты от атак fail2ban для OpenVPN
Заметил, что на одном моих OpenVPN серверов в последние несколько дней стал подозрительно быстро расти лог, изучив который стало понятно, что ведутся попытки подбора паролей для получения доступа. Занятие с подбором паролей хоть и бестолковое, но не такое уж и безобидное. Используя даже не очень крупную ботнет сеть, подобными запросами можно запросто положить одиночный сервер (сейчас поступает от 2 до 100 запросов в минуту в зависимости от времени суток). В общем, будет не лишним дополнительно обезопаситься от подобных атак.
Есть весьма не плохое и универсальное решение для защиты от атак с перебором паролей для *nix систем - fail2ban, написанное на питоне. Если кратко, то программа позволяет отслеживать изменения в лог файлах различных сервисов и в ответ на повторяющиеся события производит какие-то действия.
Например, можно настроить fail2ban на просмотр логов ssh сервера и, допустим, после 3-х неудачный попыток входа за минуту автоматически блокировать IP адрес, с которого происходит соединение. Причём срок блокировки, количество попыток и время за которое происходят запросы, можно задавать для каждого сервиса индивидуально.
Вместе со скриптом идут уже гoтовые примеры для управления фильтрами ipfw, iptables и кучей сервисов ipfw, postfix, apache, asterisk и т.д. Правда для OpenVPN готового шаблона не было, но я без труда нашёл его в сети и приведу его чуть ниже. Давайте, на его примере и разберём установку и настройку fail2ban под FreeBSD.
Установка и настройка fail2ban на FreeBSD
Я устанавливал fail2ban на FreeBSD из портов:
cd /usr/ports/security/py-fail2ban
make install clean
Сразу пропишем его в /etc/rc.conf для автозагрузки:
fail2ban_enable="YES"'
В настройке fail2ban тоже нет ничего сложного и занимает она совсем не много времени. Как я уже сказал, примеры для большинства сервисов идут в комплекте, нужно только выбрать необходимые именно вам. Настройка сводится к правке файла /usr/local/etc/fail2ban/jail.conf и создании собственного файла в каталоге /usr/local/etc/fail2ban/filter.d/ с регулярным выражением для разбора логов (в случае если для вашего сервиса нет готового).
Вот так у меня выглядит jail.conf для защиты OpenVPN сервера:
[INCLUDES] before = paths-freebsd.conf [DEFAULT] # белый список ip (указываются через пробел) ignoreip = 127.0.0.1/8 # время бана по умолчанию (в секундах) bantime = 3600 # промежуток времени, за которое событие повторяется findtime = 900 # количество событий для отправки в бан maxretry = 5 # метод парсинга логов backend = auto # эти опции оставил по умолчанию usedns = warn logencoding = auto # #OpenVPN # [openvpn] #задействуем правило enabled = true port = 1194 protocol = udp # используем фильтр /usr/local/etc/fail2ban/filter.d/openvpn.conf filter = openvpn # использeм действие /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf # в квадратных скобках указывается значения переменных # добавляем ip адрес в таблицу 1 ipfw action = bsd-ipfw[table=1] # путь к логам OpenVPN logpath = /var/log/openvpn.log # ищем в логе три неудачных попытки maxretry = 3 # блокируем IP на 24 часа bantime = 86400
Оригинальный jail.conf я сохранил для примера под другим именем (вдруг понадобится). Вначале идёт секция для установок параметров по умолчанию, а нужным сервисам (их может быть много) можно прописать собственные настройки, как у меня в примере. Все заблокированные адреса добавляются в специальную таблицу IPFW (в моём случае под номером 1).
Использование таблиц файрвола IPFW очень удобно, когда нужно заблокировать много IP при атаках и файрвол оперирует всей таблицей целиком, а не отдельными IP, что существенно сказывается на производительности.
Содержимое файла /usr/local/etc/fail2ban/filter.d/openvpn.conf для парсинга логов openvpn сервера:
# Fail2Ban filter for selected OpenVPN rejections # # [Definition] # Example messages (other matched messages not seen in the testing server's logs): # Fri Sep 23 11:55:36 2016 TLS Error: incoming packet authentication failed from [AF_INET]59.90.146.160:51223 # Thu Aug 25 09:36:02 2016 117.207.115.143:58922 TLS Error: TLS handshake failed failregex = ^ TLS Error: incoming packet authentication failed from \[AF_INET\]<HOST>:\d+$ ^ <HOST>:\d+ Connection reset, restarting ^ <HOST>:\d+ TLS Auth Error ^ <HOST>:\d+ TLS Error: TLS handshake failed$ ^ <HOST>:\d+ VERIFY ERROR ignoreregex =
Осталось только прописать правило для ipfw в /etc/rc.firewall:
${fwcmd} add deny all from table\(1\) to me
Ну вот и всё, теперь можно запускать наш fail2ban в работу. Посмотреть заблокированные адреса (у меня это таблица 1 в правилах ipfw) можно командой:
ipfw table 1 list
Следует помнить, что при перезапуске сервиса fail2ban или самого сервера все баны снимаются.
Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.