Задача утилиты Fail2ban — мониторинг файлов (таких как /var/log/secure) и поиск в них следов bruteforce и других попыток некорректной авторизации. Так же, проверяет сервисы SSH, Dovecot, Nginx и другие.
При обнаружении таковых — доступ с IP блокируется на фаерволе сервера.
Установка выполняется на CentOS 6.6.
Устанавливаем:
# yum install fail2ban
Структура конфигурационных файлов выглядит так:
# tree -L 1 /etc/fail2ban/ /etc/fail2ban/ ├── action.d ├── fail2ban.conf ├── filter.d └── jail.conf
Fail2ban состоит из двух частей — серверная, непосредственно сервер fail2ban, и fail2ban-client — клиент для работы с ним.
Получить помощь по работе с клиентом можно так:
# fail2ban-client --help
Все основные настройки для наблюдения за службами описаны в файле /etc/fail2ban/jail.conf.
Параметры в нём:
ignoreip— IP-адрес, для которого будут игнорироваться проверки;bantime— время в секундах, на которое будет установлен бан в IPTABLES, если установить -1 — «вечный бан»;findtime— длительность интервала обнаружения «подозрительных совпадений» (в журналах),сли за этот интервал времени ничего подозрительного не обнаружено, то счётчику (counter) присваивается значение 0;maxretry— количество «подозрительных совпадений» (т.е., значение счётчика counter), при котором срабатывает определённая операция по отношению к отслеживаемому IP-адресу;action— операция, которая должна быть выполнена, если значение счётчика стало равным значению параметраmaxretry, по умолчанию сервис (порт) блокируется для отслеживаемого IP-адреса;port— наименование сервиса или номер соответствующего этому сервису порта, за которым ведётся наблюдение;filter— имя фильтра, который должен использовать данный изолятор, чтобы выявлять «подозрительные совпадения» в журналах (фильтры хранятся в подкаталоге/etc/fail2ban/filter.d);logpath— путь к файлу журнала, который должен обрабатываться с помощью заданного фильтра.
Для изменения настроек — можно применять файлы с расширением .local — они будут прочитаны сервером fail2ban после чтения файлов .conf — и, если потребуется, переопределят настройки, записанные в .conf.
Значения по умолчанию задаются в блоке [DEFAULT] файла /etc/fail2ban/jail.conf.
Рассмотрим блок [ssh-iptables], который отвечает за сервис SSH:
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, [email protected], [email protected], sendername="Fail2Ban"]
logpath = /var/log/secure
maxretry = 5
enabled-активен;filter— использование фильтраsshd.confиз каталога/etc/fail2ban/filter.d;action— действие (скриптiptablesиз каталога/etc/fail2ban/action.d, иsendmail-whois);logpath— отслеживать журнал/var/log/secure;maxretry— банить после 5 попыток.
Фильтры описываются RegExp-ом в файлах каталога /etc/fail2ban/filter.d, например:
# cat /etc/fail2ban/filter.d/sshd.conf
...
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via S+)?s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>s*$
^%(__prefix_line)sFailed S+ for .*? from <HOST>(?: port d*)?(?: sshd*)?(: (ruser .*|(S+ ID S+ (serial d+) CA )?S+ %(__md5hex)s(, client user ".*", client host ".*")?))?s*$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>s*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUserss*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUserss*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any groups*$
^%(__prefix_line)srefused connect from S+ (<HOST>)s*$
^%(__prefix_line)sReceived disconnect from <HOST>: 3: S+: Auth fail$
^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroupss*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroupss*$
...
Настроим наш Fail2ban.
Копируем файл jail.conf:
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Редактируем его, и включаем необходимые службы, и другие настройки, в том числе — ignoreip:
ignoreip = 127.0.0.1/8 77.***.***.40 37.***.***.56
Меняем [email protected] и [email protected] на свой:
[email protected]
Редактируем файл /etc/fail2ban/fail2ban.conf, меняем:
logtarget = SYSLOG
на:
logtarget = /var/log/fail2ban.log
Запускаем:
# service fail2ban start
Starting fail2ban: ERROR No file(s) found for glob /var/log/exim/mainlog
ERROR Failed during configuration: Have not found any log file for exim jail
[FAILED]
Проверяем /etc/fail2ban/jail.local, блок [exim]:
[exim] enabled = true filter = exim action = iptables-multiport[name=exim,port="25,465,587"] logpath = /var/log/exim/mainlog
Тогда как лог называется /var/log/exim/main.log.
Меняем, снова запускаем:
# service fail2ban start Starting fail2ban: [ OK ]
Проверяем лог Fail2ban:
# tail -f /var/log/fail2ban.log 2014-12-07 14:26:08,022 fail2ban.filter [21254]: INFO Set maxRetry = 3 2014-12-07 14:26:08,025 fail2ban.filter [21254]: INFO Set findtime = 600 2014-12-07 14:26:08,025 fail2ban.actions[21254]: INFO Set banTime = 600 2014-12-07 14:26:08,040 fail2ban.jail [21254]: INFO Jail 'dovecot-auth' started 2014-12-07 14:26:08,045 fail2ban.jail [21254]: INFO Jail 'pam-generic' started 2014-12-07 14:26:08,048 fail2ban.jail [21254]: INFO Jail 'ssh-iptables' started 2014-12-07 14:26:08,051 fail2ban.jail [21254]: INFO Jail 'exim' started 2014-12-07 14:26:08,057 fail2ban.jail [21254]: INFO Jail 'exim-spam' started 2014-12-07 14:26:08,060 fail2ban.jail [21254]: INFO Jail 'dovecot' started
Проверка статуса через fail2ban-client:
# fail2ban-client status Status |- Number of jail: 6 `- Jail list: exim-spam, pam-generic, ssh-iptables, dovecot-auth, dovecot, exim
Статистика по конкретному сервису:
# fail2ban-client status ssh-iptables Status for the jail: ssh-iptables |- filter | |- File list: /var/log/secure | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
Проверка правил и имён цепочек в IPTABLES:
# iptables -L --line-numbers -v | grep fail2ban 1 0 0 fail2ban-exim tcp -- any any anywhere anywhere multiport dports smtp,urd,submission 2 126 7135 fail2ban-dovecot tcp -- any any anywhere anywhere multiport dports pop3,pop3s,imap,imaps,submission,urd,sieve 3 0 0 fail2ban-exim-spam tcp -- any any anywhere anywhere multiport dports smtp,urd,submission 4 0 0 fail2ban-SSH tcp -- any any anywhere anywhere tcp dpt:ssh 5 1424 957K fail2ban-pam all -- any any anywhere anywhere 6 126 7135 fail2ban-dovecot-auth tcp -- any any anywhere anywhere multiport dports pop3,pop3s,imap,imaps,submission,urd,sieve Chain fail2ban-SSH (1 references) Chain fail2ban-dovecot (1 references) Chain fail2ban-dovecot-auth (1 references) Chain fail2ban-exim (1 references) Chain fail2ban-exim-spam (1 references) Chain fail2ban-pam (1 references)
Для удаления бана:
# iptables -D fail2ban-<CHAIN_NAME> -s <IP> -j DROP
Для проверки — я добавил порт 22 в конфигурацию sshd — и на следующий день получил письмо:
Hi, The IP 122.226.102.231 has just been banned by Fail2Ban after 5 attempts against SSH. Here is more information about 122.226.102.231:
Ссылки по теме




