понедельник, 18 апреля 2016 г.

Fail2Ban custom actions


Можно настроить запуск сторонних утилит при выполнении определенных действий fail2ban с атакующим (например, только при отправке в бан). Например, хочется иметь список всех произведенных баннов с указанием точного времени бана. Т.е. надо при каждом бане сохранить время бана и ip-адрес забанненого хоста. Для хранения подойдет текстовый файл формата CSV (в дальнейшем можно перейти к sqlite).


Создаем файл с описанием своих действий - за шаблон берется файл /etc/fail2ban/action.d/dummyconf.

Струкрура, в принципе понятна, - в секции [Init] можно определить переменные, которые будут доступны в этом файле.

Нам понадобится только действие actionban. Здесь указываем команду, которая будет выполняться, когда fail2ban будет отправлять хост в бан. Имя файла для записи данных будем передавать через переменную <file>, значение которой устанавливается в секции [Init].


~$  cat /etc/fail2ban/action.d/csv.conf
# Fail2Ban configuration file#
# $Revision$
# Date: 2016-04-18

[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart =

# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop =

# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck =

# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionban = IP=<ip> && STAMP=<time> &&
printf %%b "$STAMP,$IP\n" >> <file>
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionunban =


[Init]
# Option: file
# Notes.: hosts.deny file path.
# Values: STR Default: /data/fail2ban_banned.log
#
file = /data/fail2ban_banned.log




После этого нужно в файле конфигурации jail.conf указать, что требуется выполнять новое действие


/etc/fail2ban/jail.conf
...
action_mwl = %(banaction)s[name=%(name)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(name)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
+ csv[name=%(name)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

...



Пока не выяснил, где можно получить список всех возможных параметров (port, proto, ...), которые можно передать в action.


Перезапускаем fail2ban. Спустя некоторое время смотрим, что появляется в файле лога:


~ cat /data/fail2ban_banned.log
1460960053.17,180.250.100.138
1460960053.7,1.32.35.146
1460960054.38,59.95.53.201
1460960055.03,78.100.99.202
1460960086.79,94.97.110.61
1460960192.37,203.91.112.186
1460960405.06,139.0.22.106
1460960455.83,213.16.41.104


Через месяц уже можно пробовать агрегировать данные. Например, получим топ хостов, попадавших в бан не один раз

~$  cut -f2 -d',' fail2ban_sqlite.log | sort | uniq -c | sort -n -r | head
     18 197.188.244.18
     15 88.250.117.109
     13 211.198.141.133
     13 119.226.100.222
     11 85.175.227.88
     11 77.240.87.57
     11 175.139.185.161
     10 85.102.11.45
     10 2.50.133.220
     10 190.82.96.26