Настраиваем универсальную систему защиты от атак fail2ban для OpenVPN

Сентябрь, 07th 2018Рубрика: *NIX 1276
Подписаться на комментарии по RSS

защита от атак fail2ban

Заметил, что на одном моих 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 или самого сервера все баны снимаются.

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

ваш комментарий будет опубликован после проверки
на указанный адрес будет отправлено письмо с кодом активации. Вы можете настроить собственный профиль и стать активным участником или автором.