Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> Fail2ban

Fail2ban

Автор: gonzo111.


Сегодня расскажу вам про супер полезную софтину, аналог bruteblock. Если кратко, то она умеет парсить лог, и в ответ на повторяющееся событие, что-то сделать. Например парсить лог ssh и банить того- кто превысил количество попыток входа на указанное время.
Банить или просто что-то сделать, можно как сами захотите, либо использовать уже гoтовые примеры для ipfw, iptables, hosts.deny. И самое главное есть уже готовые примеры для ssh, exim, postfix,cyrus-imap, apache, lighttpd, named и тд (!!!). Написана на питоне, памяти ест около 10 мег, что в приципе не критично. Спасибо разрабам и питону - тут формат регулярных выражений и всех конфигов очень-очень прост. Настройка и установка займет 5 минут, а пользы и радости хоть отбавляй :))))

Итак задача облегчить несчастливую судьбу постфикса
Oct 27 00:11:11 server postfix/smtpd[41757]: NOQUEUE: reject: RCPT from 
post.vesta.no[147.29.149.71]: 450 4.1.1 <lixinop@k.dp.ua>: Recip
ient address rejected: unverified address: unknown user: "lixinop"; 
from=<> to=<lixinop@k.dp.ua> proto=ESMTP helo=<post.vesta.no>
Oct 27 00:21:33 server postfix/smtpd[57744]: NOQUEUE: reject: RCPT from unknown
[81.19.69.161]: 450 4.7.1 Client host rejected: cannot find you
r hostname, [81.19.69.161]; from=<root@server0.kentonmedia.com> to=<
secret@k.dp.ua> proto=ESMTP helo=<server0.kentonmedia.com>

и апача
[Thu Apr 22 18:55:10 2010] [error] [client 91.142.217.147] File does not 
exist: /usr/local/www/inkom/phpMyAdmin-2.2.3
[Thu Apr 22 18:55:10 2010] [error] [client 91.142.217.147] File does not exist:
 /usr/local/www/inkom/phpMyAdmin-2.2.6
[Thu Apr 22 18:55:10 2010] [error] [client 91.142.217.147] File does not exist:
 /usr/local/www/inkom/phpMyAdmin-2.5.1
[Thu Apr 22 18:55:11 2010] [error] [client 91.142.217.147] File does not exist:
 /usr/local/www/inkom/phpMyAdmin-2.5.4
[Thu Apr 22 18:55:11 2010] [error] [client 91.142.217.147] File does not exist:
 /usr/local/www/inkom/phpMyAdmin-2.5.6
[Thu Apr 22 18:55:11 2010] [error] [client 91.142.217.147] File does not exist:
 /usr/local/www/inkom/phpMyAdmin-2.6.0

Ставим
portmaster security/py-fail2ban

/etc/rc.conf
fail2ban_enable="YES"

Правим кофиг со страшным названием /usr/local/etc/fail2ban/jail.conf, замечу что мониторить можно несколько логов и задавать свои действия. Вначале идут дефолтные настройки, которые можно переопределить в отдельных секциях.
[DEFAULT]
ignoreip = 127.0.0.1 195.268.118.27 216.227.266.66
# "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

[postfix-ipfw]

enabled  = true
# использовать фильтр из примеров /filter.d/postfix.conf    
filter   = postfix

# использовать /action.d/bsd-ipfw.conf   
action   = bsd-ipfw[table=50]
# можно слать себе мыло кого забанили,  мне как то не надо :)))
#           sendmail[name=Postfix, dest=gonzo@k.dp.ua]
# что парсить
logpath  = /var/log/maillog
# банить на 7 суток гггг
bantime  = 604800
#bantime  = 1
# если 3 раза встретилось в логах
maxretry = 3


[apache_jail-ipfw]

enabled  = true
filter   = apache-nohome
action   = bsd-ipfw[table=55]
#           sendmail[name=Postfix, dest=artem@k.dp.ua]
logpath  = /usr/jails/web02/var/log/httpd-error.log
# банить на 8 часов
bantime  = 28800
maxretry = 5

Правим /usr/local/etc/fail2ban/filter.d./postfix.conf
Формат регулярок прост, я глянул в логи и мне понадобилось так
   
failregex = reject: RCPT from (.*)\[<HOST>\]: 450 4.1.1
            reject: RCPT from (.*)\[<HOST>\]: 450 4.7.1
            reject: RCPT from (.*)\[<HOST>\]: 504 5.5.2

Подробнее тут http://www.fail2ban.org/wiki/index.php/Postfix. Большой плюс что все можно проверить
#>fail2ban-regex /var/log/maillog 'reject: RCPT from (.*)\[<HOST>\]:
 450 4.1.1'

Success, the total number of match is 4466

Если глянуть другие примеры, можно было еще по джентельменски предупреждать как тут :))
actionban = printf %%b "Hi,\n
            The IP <ip> has just been banned by Fail2Ban after
            <failures> attempts against <name>.\n
            Regards,\n
            Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip>" <dest>

Правим /usr/local/etc/fail2ban/filter.d./apache-nohome.conf
failregex = [[]client <HOST>[]] File does not exist:

Правим /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf
actionban = /sbin/ipfw table <table> add <ip>
actionunban = /sbin/ipfw table <table> delete <ip>
#actionunban = 

При остановке демона он старательно разбанивает все IP. (!)
И добавляем в /etc/rc.firewall
postfix_ban_table="table(50)"
apache_jail_ban_table="table(55)"
# fail2ban
${fwcmd} add 10 deny tcp from ${postfix_ban_table} to me 25 via ${oif}
${fwcmd} add 11 deny tcp from ${apache_jail_ban_table} to me 80 via ${oif}

Радуемся жизни, теперь в логах тишина и мир :)))

______________________
PS начинаю задумываться над тем, чтобы вообще убрать команду разбана, а руками потом убирать кого надо, тогда можно время бана уменьшить до 1 сек..
 Рекомендую прочесть ман по постфиксу, если у вас есть строка reject_unverified_recipient, в unverified_recipient_reject_code по дефолту идет 450 вместо 550.

Бонус-скриптик получения DNS имен из IP в таблице ipfw , чтоб немного ориентироваться кто в списке был забанен.
#!/bin/sh
echo "Table 50"
ipfw table 50 list|awk -F '/' '{ print $1 }'| nslookup $@ | 
grep "name =" | more
echo -e "\n"
echo -e "\n"
echo "Table 55"
ipfw table 55 list|awk -F '/' '{ print $1 }'| nslookup $@ | 
grep "name =" | more

По мотивам
http://forum.lissyara.su/viewtopic.php?f=20&t=29255#p267441
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8
http://www.linux16.net/node/267



размещено: 2010-11-03,
последнее обновление: 2010-11-22,
автор: gonzo111


mediamag, 2010-11-16 в 19:39:02

для exim выражение принимает вид:
[code][Definition]

failregex = \[<HOST>\] .*(?:rejected by local_scan|Unrouteable address|"Unknown user"|"your hostname is bad."|sender verify failed|more than 4 dots and etc)[/code]
выражение типа Unrouteable address Unknown user - это те значения log_message в экзиме, которые я сам придумал каждой блокировке

Foxduck, 2010-12-08 в 12:54:50

Большое спасибо за информацию о данной программе,очень помогли.

df, 2012-12-21 в 15:13:48

Здравствуйте. Очень полезная статья, спасибо.
> PS начинаю задумываться над тем, чтобы вообще убрать команду разбана
за это отвечает опция
buntime = -1

John, 2015-04-30 в 9:48:21

Для FreeBSD 10 бонус скриптик такой:
#!/bin/sh
echo "Table 50"
host `ipfw table 50 list|awk -F '/' '{ print $1 }'`
echo "Table 55"
host `ipfw table 55 list|awk -F '/' '{ print $1 }'`

Саша, 2015-05-17 в 18:29:10

cd /usr/local/etc/fail2ban
cp fail2ban.conf fail2ban.local
cp jail.conf jail.local

enabled  = true                                                          
filter  = owncloud                                                      
action  = ipfw-owncloud                                                
logpath  = /*Change_to_owncloud_data_dir*/owncloud.log                                            
maxretry = 3                                                            
port = 80,443                                                          
protocol = tcp

cp /usr/local/etc/fail2ban/action.d/ipfw.conf /usr/local/etc/fail2ban/action.d/ipfw-owncloud.conf


add the following to /usr/local/etc/fail2ban/filter.d/owncloud.conf
Code (text):
[Definition]                                                            
failregex = {"app":"core","message":"Login failed: user '.*' , wrong password, IP:<HOST>.*
ignoreregex =

Саша, 2015-05-17 в 18:47:09

#banaction = iptables-multiport
banaction =  ipfw

Саша, 2015-05-17 в 18:50:11

filter = %(__name__)s
action_ = bsd-ipfw

Алекс, 2016-04-07 в 19:28:38

вот что надо интереснинького дописать

action   = hostsdeny[file=/etc/hosts.deny]
          sendmail

Алексс, 2018-09-25 в 21:53:51

hostsdeny[file=/etc/hosts.deny]  

1. Порт hostsdeny надо доставлять ?
2. в hosts.deny ничево недописалось ?

Алекс, 2019-03-14 в 18:55:58

Как добавить

/log/security

Mar 13 20:12:51 1zahid kernel: ipfw: 50020 Deny TCP *:3839 185.156.177.123:17 out via bge3
Mar 13 20:12:55 1zahid kernel: ipfw: 50020 Deny TCP
*:3839 185.156.177.123:7 out via bge3
Mar 13 20:13:08 1zahid kernel: ipfw: 50020 Deny TCP *:3893 185.156.177.123:1 out via bge3



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.044 секунд
Из них PHP: 31%; SQL: 69%; Число SQL-запросов: 77 шт.
Исходный размер: 36721; Сжатая: 8383