Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  немного о безопасности
  VPN (PoPToP)
  PortSentry
  sysctl
  vtund
  ipfwcount
  FreeBSD & DSA
  mpd – легко и просто!
  mpd + freeradius + mysql
  Бронированный FreeBSD
  sshit
  DSL-G804V и FreeBSD 6.2
  portaudit
  OpenVPN
  Bluetooth proximity monitor
  ESET NOD32
  GEOM-ELI
  stunnel для pop3,smtp
  NOD32 mirror
  mpd5 + ipfw-nat
  Openvpn 2 офиса
  Hotspot
  OpenVPN+авторизация
  termlog
  mpd5 + сжатие и шифрование
  ipsec_vpnc
  TOR Сервер
  Snort на FreeBSD
  Arpwatch
  Установка и настройка OpenVPN
  NOD32_mirror_v2
  Fail2ban
  IPSec
  Перенос OpenVPN сервера
  Wpa/WPA2-Radius+EAP-TLS/EAP-PEAP
  nod32 mirror script
  MAC + apache
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


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



Ссылка на обсуждение: Incorrect URL.

размещено: 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


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 7 чел.
За последние 30 мин было: 42 человек
За сегодня было
4377 показов,
567 уникальных IP
 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1512 секунд
Из них PHP: 49%; SQL: 51%; Число SQL-запросов: 77 шт.
Исходный размер: 96217; Сжатая: 17317