Fail2ban — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных
условий блокирует по IP найденных нарушителей.
Программа умеет бороться с различными атаками на все популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd,
Exim, Postfix, named, и т.д.
Но в первую очередь Fail2ban известен благодаря готовности «из коробки» к защите SSH–сервера от атак типа «bruteforce», то
есть к защите SSH от перебора паролей.
Установка Fail2ban
Готовые пакеты Fail2ban можно найти в официальных репозиториях всех популярных Linux дистрибутивов.
Установка Fail2ban на Debian/Ubuntu:
#apt-get install fail2ban
Установка Fail2ban на CentOS/Fedora/RHEL:
#yum install fail2ban
Конфигурация Fail2ban
На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию.
Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже.
У программы два основных файла конфигурации:
/etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
/etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd.
Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый
сервис и тип атаки:
Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены.
Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря,
«brute–force».
Подробнее по каждому из основных параметров файла jail.conf:
ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых
пробелами, маску подсети, или имя DNS–сервера.
bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.
maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] —
это число неудавшихся попыток логина, после которых происходит блокировка.
enabled — значение true указывает что данный jail активен, false выключает
действие изолятора.
port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера —
22, или его буквенное наименование — ssh.
filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в
журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее
фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в
log–файл /var/log/auth.log.
Рекомендации по настройке Fail2ban
Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, это создаёт
очевидную угрозу в многопользовательских системах — если злоумышленник получил доступ хотя–бы к одному shell–аккаунту, то он имеет
возможность беспрепятственно запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.
Новая опция findtime — определяет длительность интервала в секундах, за которое событие должно повториться
определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено
значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать
стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать
10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же
лучше банить таких ботов.
Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек jail.conf,
для этого предусмотрены файлы с расширением *.local, которые автоматически подключаются и имеют высший приоритет.
#nano /etc/fail2ban/jail.local
[DEFAULT]
## Постоянный IP-адрес.
## Если не переопределить ignoreip здесь,
## то стоит закомментировать этот параметр в jail.conf.
ignoreip = 57.66.158.131
[ssh]
## если в течении 1 часа:
findtime = 3600
## произведено 6 неудачных попыток логина:
maxretry = 6
## то банить IP на 24 часа:
bantime = 86400
#tail /var/log/fail2ban.log2013-01-20 22:00:35,911 fail2ban.jail : INFO Jail 'ssh' stopped
2013-01-20 22:00:35,916 fail2ban.server : INFO Exiting Fail2ban
2013-01-20 22:00:36,257 fail2ban.server : INFO Changed logging target to
/var/log/fail2ban.log for Fail2ban v0.8.6
2013-01-20 22:00:36,258 fail2ban.jail : INFO Creating new jail 'ssh'
2013-01-20 22:00:36,259 fail2ban.jail : INFO Jail 'ssh' uses poller
2013-01-20 22:00:36,271 fail2ban.filter : INFO Added logfile = /var/log/auth.log
2013-01-20 22:00:36,271 fail2ban.filter : INFO Set maxRetry = 6
2013-01-20 22:00:36,272 fail2ban.filter : INFO Set findtime = 3600
2013-01-20 22:00:36,272 fail2ban.actions: INFO Set banTime = 86400
2013-01-20 22:00:36,298 fail2ban.jail : INFO Jail 'ssh' started
Заключение
В статье затронуты только базовые возможности Fail2Ban, применимые для защиты SSH на типовом Linux–сервере. Более подробную
документацию по программе вы можете найти в официальной Wiki
на авторском веб–сайте.
Сегодня я хочу предложить одну из самых лучших прог в этом секторе - это fail2ban., с этим может справится
только fail2ban. Fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы: отслеживать
изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные действия. Для поиска характерных
признаков подбора пароля, используются регулярные выражения в файлах фильтров. Для выполнения действий используются action файлы.
Так что будем устанавливать. Настраивать будем защиту sshd, proftpd, dovecot и может ещё какую службу. Для работы, естественно,
потребуется включенный фаервол.
Установка fail2ban
Идём сюда:
#cd /usr/ports/security/py-fail2ban
запускаем инсталляцию:
#make install clean
Дальше идём сюда /usr/local/etc/fail2ban и наблюдаем следующую структуру каталога:
папка action.d - содержит файлы действий
папка filter.d - файлы фильтров
файл fail2ban.conf - основной файл конфигурации
файл jail.conf - файл настройки защиты конкретных сервисов
Настройка fail2ban
Чтобы в процессе конфигурации не натворить плохого, все файлы, которые мы будем править будем переименовывать из
.conf в .local. В первую очередь копируем файл jail.conf в файл с именем jail.local.
Основной файл конфигурации /usr/local/etc/fail2ban/fail2ban.conf здесь можно оставить всё по умолчанию, можно
только установить уровень логирования на 4, чтобы мы могли видеть побольше сообщений. Далее идём в
папку /usr/local/etc/fail2ban/action.d видим кучу фаерволов, нас интересует пока только bsd-ipfw.conf. Переименовываем его
в bsd-ipfw.local. Оставляем в нём всё по умолчанию. Можно только внести строчку
actionunban = ipfw table 1 delete
что бы при выходе из fail2ban обнулялась таблица, иначе там зависнут все забаненные навечно. Добавляем в ipfw правило,
блокирующее все IP адреса, находящиеся в таблице table 1:
${FwCMD} add deny all from table\(1\) to me
Правило ставим сразу после вот этого правила
${FwCMD} add allow ip from any to any via lo0
Переходим в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению ищут определенные строки в лог
файлах. Нас интересуют sshd.conf и proftpd.conf и dovecot.conf, как и ранее копируем их в sshd.local, proftpd.local и
dovecot.local соответственно. В файлах я все оставил как есть.
А теперь мы дошли до самого вкусного, что есть в этой проге, чего нет ни в одной аналогичной проге. Проверить работоспособность
того или иного фильтра с регулярными выражениями можно с помощью скрипта fail2ban-regex, идущего в поставке fail2ban. Например,
проверяем фильтр proftpd.local, натравливая его на лог файл авторизаций:
Мне нужно было, чтобы fail2ban отправлял письма, поэтому я включил mail-whois и не забываем отредактировать соответствующий
файл в директории action.d, в данном случае mail-whois.local, там все довольно просто. Ну вот вроед всё настроили, пора запускать
fail2ban. Прописываем в /etc/rc.conf:
fail2ban_enable="YES"
и запускаем его
#/usr/local/etc/rc.d/fail2ban start
Если всё сделали правильно он запустится, если нет, разбирайтесь где накосячили. Если запустился, проверяем на бан, заходим
со стороннего ip адреса, с неправильным паролем, должно забанить на время, которое вы указали.
fail2ban - утилита, которая парсит логи и выполняет определенные действия на некоторые повторяющиеся события в
течении какого-то времени..
Например за несколько неудачных попыток авторизоваться по ssh за некоторое время забанить источник.
Очень полезна для предотвращения перебора паролей и различных зловредных действий.
Методов блокировки также несколько: ipfw, iptables, hosts.deny .
Есть уже много готовых примеров для ssh, exim, postfix,cyrus-imap, apache, lighttpd, named и тд (!!!).
Можно их составлять и самим, для этого Вам понадобится некоторое знание регулярных выраженией в python. Сама настройка очень
проста и логична.
Рассмотрю базовую установку на FreeBSD и настройку блокировки брутфорса ssh.
Итак приступим:
Установка fail2ban (не забываем предварительно обновить порты)
#cd /usr/ports/security/py-fail2ban
make install clean
Добавляем в /etc/rc.conf
fail2ban_enable="YES"
Настраиваем ротацию логов, добавляем в /etc/newsyslog.conf
# FAIL2BAN
/var/log/fail2ban.log 600 7 200 * JC
Настраиваем основной конфиг /usr/local/etc/fail2ban/jail.conf
[DEFAULT]
ignoreip = 127.0.0.1 10.0.0.1
# "bantime" is the number of seconds that a host is banned.
# время бана в секундах
bantime = 600
# A host is banned if it has generated "maxretry" during the last
# "findtime" seconds.
# время проверки,за которое событие успеет повторится, чтоб отловить
# и забанить
findtime = 900
# "maxretry" is the number of failures before a host get banned.
# максимальное число правонарушений :)
maxretry = 3
# "backend" specifies the backend used to get files modification.
# Available options are "gamin", "polling" and "auto". This option can
# be overridden in each jail too (use "gamin" for a jail and "polling"
# for another).
# gamin: requires Gamin (a file alteration monitor) to be installed. If
# Gamin is not installed, Fail2ban will use polling.
# polling: uses a polling algorithm which does not require external libraries.
# auto: will choose Gamin if available and polling otherwise.
# метод парсинга логов можно еще через Gamin, если он будет установлен
backend = auto
[ssh-ipfw]
enabled = true
# использовать фильтр из примеров /filter.d/bsd-sshd.conf
filter = bsd-sshd
# использовать /action.d/bsd-ipfw.conf
# в квадратных скобках указываем значения переменных, в #данном случае указываем, что нужно добавить ip адрес в #таблицу 100 с tablearg 22 (я использую, как пометку причины бана)
action = bsd-ipfw[table=100, tablearg=22]
logpath = /var/log/auth.log
maxretry = 3
# банить на 7 суток
bantime = 604800
Примечание: При рестарте fail2ban снимает все баны. Для того чтоб происходил бан, должено быть правило в фаерволе типа:
ipfw add 10 deny ip from table'(100)' to any
Мне также пришлось поменять регулярные выражения в /filter.d/bsd-sshd.conf, т.к. эти базовые регулярки не отрабатывали. Привел их к следующему виду:
failregex = ^.* sshd.* (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from <HOST>\s*$
^.* sshd.* Did not receive identification string from <HOST>$
^.* sshd.* Failed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
^.* sshd.* ROOT LOGIN REFUSED.* FROM <HOST>\s*$
^.* sshd.* [iI](?:llegal|nvalid) user .* from <HOST>\s*$
^.* sshd.* User \S+ from <HOST> not allowed because not listed in AllowUsers$
^.* sshd.* authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
^.* sshd.* refused connect from \S+ \(<HOST>\)\s*$
^.* sshd.* reverse mapping checking getaddrinfo for .* \[<HOST>\] .* POSSIBLE BREAK-IN ATTEMPT!$
Также у меня есть подсети, которые не используются.
Если к ip из этих подсетей идет упорное обращение, то можно считать, что это происходит сканирование диапазона сети.
В ipfw есть правило с логированием для блокировки обращения к таким подсетям.
Таким образом можно отслеживать таких "разведчиков" и блокировать полностью эти ip.
Добавляем новый раздел в файл jail.conf
[ipfw-ban]
enabled = true
# этот фильтр создадим позже /filter.d/ipfw-ban.conf
filter = ipfw-ban
action = bsd-ipfw[table=100, tablearg=29999]
# Направляем на логи ipfw (у меня вынесены в отдельный лог)
# Можно направить на стандартный лог /var/log/security
logpath = /var/log/ipfw/ipfw.log
maxretry = 5
# банить на 7 суток
bantime = 604800
Нам нужно составить регулярное выражение, по которому будет анализироваться файл логов. Можно тестировать
сразу "на лету" и смотреть, что получается...
Составим регулярное выражение для строки вида:
Jul 26 11:30:10 hostname kernel: ipfw: 29999 Deny TCP 50.57.93.243:42222 не_используемый_ip_адресс:80 out via net2
В простейшем виде будет вот такая регулярка:
fail2ban-regex /var/log/ipfw/ipfw.log '^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$'
Running tests
=============
Use regex line : ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
Use log file : /var/log/ipfw/ipfw.log
Results
=======
Failregex
|- Regular expressions:
| [1] ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
|
`- Number of matches:
[1] 228 match(es)
Ignoreregex
|- Regular expressions:
|
`- Number of matches:
Summary
=======
Addresses found:
[1]
124.6.181.219 (Tue Jul 26 11:00:38 2011)
124.6.181.219 (Tue Jul 26 11:00:39 2011)
...
188.132.129.9 (Tue Jul 26 11:39:52 2011)
Date template hits:
473 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>
Success, the total number of match is 228
However, look at the above section 'Running tests' which could contain important
information.
Убедились, что регулярка отработала нормально, теперь ее можно добавлять в фильр /filter.d/ipfw-ban.conf
[Definition]
failregex = ^ipfw: 29999 Deny \S* .* out via net2$
Перезапускаем fail2ban
#/usr/local/etc/rc.d/fail2ban restartShutdown successful
2011-07-26 12:02:58,546 fail2ban.server : INFO Starting Fail2ban v0.8.4
2011-07-26 12:02:58,546 fail2ban.server : INFO Starting in daemon mode
#cd /usr/ports/secuity/py-fail2ban && make install clean
Правим конфиг
#ee /usr/local/etc/fail2ban/jail.conf
У меня он выглядит так
[DEFAULT]
# Какие IP игнорировать
ignoreip = 127.0.0.1
# Время бана в секундах
bantime = 600
# время проверки,за которое событие успеет повторится, чтоб отловить и забанить
findtime = 600
# кол-во неверных попыток
maxretry = 1
backend = auto
[ssh-ipfw]
enabled = true
# использовать фильтр из примеров
filter = bsd-sshd
# использовать /action.d/bsd-ipfw.conf
action = ssh-ipfw[localhost=78.24.219.97]
# Уведомление в Jabber :))
jabber-whois[name="SSH,IPFW", dest=mail@housecomputer.ru
# Какой лог парсить
logpath = /var/log/auth.log
# Какой Ip игнорировать
ignoreip = 127.0.0.1
[exim-ipfw]
enabled = true
filter = exim
action = exim-ipfw[localhost=78.24.219.97]
jabber-whois[name="Exim,IPFW", dest=mail@housecomputer.ru
logpath = /var/log/exim/mainlog
ignoreip = 127.0.0.1
[nginx-ipfw]
enabled = true
filter = nginx
action = nginx-ipfw[localhost=127.0.0.1]
jabber-whois[name="Nginx,IPFW", dest=mail@housecomputer.ru
logpath = /home/deathstar/www/deathstar.name.access.log
ignoreip = 127.0.0.1
Для уведомления в Jabber должен быть установлен и настроен sendxmpp ( о нем я писал в предыдущих статьях)
Создаем файл /usr/local/etc/fail2ban/action.d/jabber-whois.conf с таким содержимым
[Definition]
actionstart = printf %%b "[Fail2Ban] : started
The jail has been started successfully.\n
" | /usr/local/bin/sendxmpp ""
actionstop = printf %%b "[Fail2Ban] : stopped
The jail has been stopped.\n
" | /usr/local/bin/sendxmpp ""
actioncheck =
actionban = printf %%b "[Fail2Ban] : banned
The IP has just been banned by Fail2Ban after
attempts against .\n\n
Here are more information about :\n
`/usr/bin/whois `\n
" | /usr/local/bin/sendxmpp ""
actionunban = printf %%b "[Fail2Ban] : unbanned
The IP has just been unbanned " | /usr/local/bin/sendxmpp ""
[Init]
name = default
dest = root
sender = fail2ban
Создаем фильтры для sshd и exim,у меня они выглядят так Файл /usr/local/etc/fail2ban/filter.d/bsd-sshd.conf
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from \s*$
Did not receive identification string from $
Failed [-/\w]+ for .* from (?: port \d*)?(?: ssh\d*)?$
ROOT LOGIN REFUSED.* FROM \s*$
[iI](?:llegal|nvalid) user .* from \s*$
User \S+ from not allowed because not listed in AllowUsers$
authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=(?:\s+user=.*)?\s*$
refused connect from \S+ \(\)\s*$
reverse mapping checking getaddrinfo for .* \[\] .* POSSIBLE BREAK-IN ATTEMPT!$
ignoreregex =
Файл /usr/local/etc/fail2ban/filter.d/exim.conf
[Definition]
failregex = \[\] .*(?:rejected by local_scan|Unrouteable address)
ignoreregex =
Ну и в довесок боремся с HTTP-флудом на NGINX средствами IPFW написал фильтр для nginx
Файл /usr/local/etc/fail2ban/filter.d/nginx.conf
Пишем правила для ipfw,у меня они в файле /etc/firewall
#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} pipe flush
${ipfw} add check-state
${ipfw} table 1 flush
${ipfw} table 2 flush
${ipfw} table 3 flush
# Ban SSH
${ipfw} add deny ip from table\(1\) to me ssh
# Ban Exim
${ipfw} add deny ip from table\(2\) to me 25,110,143
#Ban Nginx
${ipfw} add deny ip from table\(3\) to me 80,443
${ipfw} add allow all from any to any
Ранее, я уже рассказывал о защите Unix сервера от подбора паролей (bruteforce). Речь шла об SSH и
программе sshguard, фиксирующей неудачные попытки входа в систему по данному протоколу. Здесь хотелось-бы
рассказать о более комплексном решении, для защиты практически любого сервиса - программе Fail2ban.
Собственно fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы
прост, отслеживать изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные
действия. Для поиска характерных признаков подбора пароля, используются регулярные выражения в файлах фильтров.
Для выполнения действий используются action файлы.
На Linux с настройкой данной программы вообще никаких трудностей не возникает, на сервере FreeBSD всплыли
некоторые специфические моменты.
Итак, операционная система FreeBSD 8.2 amd64, настраивать будем защиту sshd и фтп сервера
proftpd. Для работы естественно потребуется включенный фаервол, во FreeBSD штатным является
ipfw.
#/usr/ports/security/py-fail2ban# make install clean
После установки, которая длится меньше минуты, идем по адресу /usr/local/etc/fail2ban, наблюдаем следующую структуру каталога:
папка action.d - содержит файлы действий
папка filter.d - файлы фильтров
файл fail2ban.conf - основной файл конфигурации
файл jail.conf - файл настройки защиты конкретных сервисов
Настройка fail2ban
В первую очередь копируем файл jail.conf в файл с именем jail.local, что-бы файл по
умолчанию у нас оставался нетронутым, все настройки лучше делать в jail.local.
[Definition]
loglevel = 4 # На время настройки я ставлю 4, максимально подробный уровень логгирования
logtarget = /var/log/fail2ban/fail2ban.log # лог файл fail2ban, имейте в виду, если вы указываете свое расположение файла логов, как я в данном случае, нужно что-бы директория, где он будет расположен, была доступна на запись только пользователю root, иначе fail2ban не запустится.
socket = /var/run/fail2ban/fail2ban.sock # файл сокета для связи клиентской и серверной части программы, оставляем по умолчанию
Тут я изменил только расположение файла логов, как мне удобней и поднял уровень логгирования на время отладки.
Далее настроим взаимодействие с фаерволом ipfw. Идем в папку action.d, как видите
фаерволы тут представлены в ассортименте, поскольку мы используем FreeBSD с ipfw, нас интересует
файл bsd-ipfw.conf, вообще можно создать и свой с произвольным именем, главное не забыть это учесть
при дальнейшей настройке в jail.local. По аналогии с файлом jail.conf, копируем его с
именем bsd-ipfw.local.
Здесь можно оставить по умолчанию но я предпочитаю дописать в actionstop, команду для обнуления
таблицы с забаненными IP адресами, при выключении fail2ban. Если сравнить этот файл, например
с iptables.conf (для стандартного фаервола в linux дистрибутивах — iptables), можно
заметить некоторые отличия, поскольку данные фаерволы устроены по разному и принципы организации правил фильтрации
у них тоже разные.
Файл после моей правки выглядит так:
[Definition]
actionstart = # команда выполняемая при старте fail2ban
actionstop = pfw table 1 flush # команда выполняемая при остановке, обнуляем блокирующую таблицу
actioncheck = # команда проверки
actionban = ipfw table 1 add # забанить IP адрес, при срабатывании, IP добавляется в таблицу 1 ipfw
actionunban = ipfw table 1 delete # обратное действие, удалить IP из таблицы
все остальное я закомментировал
Что-бы данный вариант работал, нужно руками добавить в ipfw правило, блокирующее все IP адреса,
находящиеся в таблице table 1:
#ipfw add 100 deny all from table\(1\) to me
#ipfw show00100 0 0 deny ip from table(1) to me # правило которые мы только что добавили
65535 65255 15896158 allow ip from any to any
Есть еще один вариант, можно поступить например так:
в actionstart прописать команду автоматического создания правила:
actionstart = ipfw add 100 deny all from table\(1\) to me
а в actionstop, вдобавок к обнулению таблицы, дописать еще и команду удаления, например так:
обе команды сработают по очереди. Но у ipfw есть такая особенность, в него можно добавлять
кучу одинаковых правил с одним и тем-же номером, без каких-либо сообщений об ошибке. Срабатывать при этом будет
только первое из них.
Получится следующая ситуация, мы прописали команду в actionstart, как я привел парой строк выше,
а мониторить собираемся например 3 сервиса, sshd, proftpd и dovecot, значит
при инициализации fail2ban, файл bsd-ipfw.local, будет прочитан 3 раза, соответственно
команда:
#ipfw add 100 deny all from table\(1\) to me
тоже будет выполнена трижды, и соответственно у нас в фаерволе появится 3 одинаковых правила, и 2 из них не
будут выполнять никаких функций, лишь мозолить глаза и сбивать с толку:
#ipfw show00100 9 522 deny ip from table(1) to me # 1 работающее правило
00100 0 0 deny ip from table(1) to me # 2
00100 0 0 deny ip from table(1) to me # 3
65535 67537 16429215 allow ip from any to any
если вас это не смущает, можете сделать так, никаких негативных моментов это не несет, не считая конечно
некоторой путаницы с правилами.
В общем я предпочитаю первый вариант, с ручным созданием основного правила.
Далее перейдем в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению
ищут определенные строки в лог файлах. Нас интересуют sshd.conf и proftpd.conf, как
и ранее копируем их в sshd.local и proftpd.local соответственно.
В файле sshd.local, я все оставил как есть. В proftpd.local пришлось внести
некоторые незначительные изменения. Вот содержимое измененного файла:
[Definition]
failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[\S+\] to \S+:\S+.*$
\(\S+\[<HOST>\]\)[: -]+ USER \S+ \(Login failed\): Incorrect password\..*$
\(\S+\[<HOST>\]\)[: -]+ SECURITY VIOLATION: \S+ login attempted\..*$
\(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \(\d+\) exceeded.*$
ignoreregex = # Сюда можно вписать регулярные выражения строк, которые нужно игнорировать
Дело в том, что регулярные выражения прописанные тут по умолчанию, ничего не находили в лог файле.
Проверить работоспособность того или иного фильтра с регулярными выражениями можно с помощью скрипта
fail2ban-regex, идущего в поставке fail2ban. Например проверяем фильтр
proftpd.local, натравливая его на лог файл авторизаций:
Данная команда выведет полную статистику, сколько строк из лог файла попадают под то или иное регулярное
выражение, в отладке очень полезная штука.
Я никогда не сталкивался с python, тем более с его регулярными выражениями, хотя они и похожи
на Perl, тем не менее различия есть. Попробовав разные вариант, дописал в конец каждого
выражения ".*", после чего прогнал проверку через fail2ban-regex, все что
нужно, находится.
С фильтрами вроде закончили, вернемся к файлу jail.local и приведем его к следующему виду:
[DEFAULT]
[ssh-ipfw]
enabled = true # включить мониторинг
ignoreip = 127.0.0.1 192.168.50.200 # IP адреса которые нужно игнорировать
filter = sshd # какой файл фильтра использовать, то есть по сути это название файла в папке filter.d, только без расширения
action = bsd-ipfw # какой действие использовать, название аналогично фильтру
logpath = /var/log/auth.log # анализируемый лог файл
bantime = 60 # продолжительность блокировки, подбираем на свое усмотрение
maxretry = 2 # количество неудачных авторизаций с IP, значение подбирается по ситуации/нагрузке на сервис в рамках данной машины
findtime = 600 # время, в течении которого нужно фиксировать maxretry, то есть у нас получается 2 ошибки в течении 10 минут
backend = poller # способ получения информации о модификации лог файла, можно поставить auto или gamin
[proftpd-ipfw] # тут все аналогично
enabled = true
filter = proftpd
action = bsd-ipfw
logpath = /var/log/auth.log
ignoreip = 127.0.0.1 192.168.50.200
bantime = 60
maxretry = 2
findtime = 600
backend = poller
В добавок к уже прописанному действию, можно добавить уведомление по почте на нужный адрес, например так:
и отредактировать соответствующий файл в директории action.d, в данном случае
mail-whois.local, там все довольно просто:
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = printf %%b "Hi,\n
The IP has just been banned by Fail2Ban after
attempts against .\n\n
Here are more information about :\n
`whois `\n
Regards,\n
Fail2Ban"|mail -s "[Fail2Ban] : banned "
actionunban =
[Init]
name = default
dest = admin@domain.com
На этом с настройками вроде закончили, можно запускать и проверять.
теперь в этом окне у нас будут вылезать на экран все строки попадающие в лог, по мере их поступления.
Если запуск прошел успешно, проверяем блокировку. Я поступаю просто, со стороннего сервера запускаю:
#ssh 192.168.50.200
и жму на ентер, или ввожу значения от балды и жму на ентер), наблюдая за логом fail2ban, при
loglevel = 4, там буду фиксироваться все изменения наблюдаемого файла, так же найденные IP адреса и
действия производимые с ними.
В течении нескольких секунд после достижения порога неудачных логинов к ssh, IP адрес
блокируется путем добавления его в таблицу table 1 фаервола, по истечении времени блокировки, адрес
будет автоматически удален. Аналогично проверяется и ftp.
На Linux все настраивается аналогично, разве что может чуть попроще, с использованием соответствующих
фаерволу, action файлов.