RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Сегодня расскажу вам про супер полезную софтину, аналог bruteblock. Если кратко, то она умеет парсить лог, и в ответ на повторяющееся событие, что-то сделать. Например парсить лог ssh и банить того- кто превысил количество попыток входа на указанное время. Банить или просто что-то сделать, можно как сами захотите, либо использовать уже гoтовые примеры для ipfw, iptables, hosts.deny. И самое главное есть уже готовые примеры для ssh, exim, postfix,cyrus-imap, apache, lighttpd, named и тд (!!!). Написана на питоне, памяти ест около 10 мег, что в приципе не критично. Спасибо разрабам и питону - тут формат регулярных выражений и всех конфигов очень-очень прост. Настройка и установка займет 5 минут, а пользы и радости хоть отбавляй :))))
Итак задача облегчить несчастливую судьбу постфикса
Oct 2700:11:11 server postfix/smtpd[41757]: NOQUEUE: reject: RCPT from
post.vesta.no[147.29.149.71]: 4504.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 2700:21:33 server postfix/smtpd[57744]: NOQUEUE: reject: RCPT from unknown
[81.19.69.161]: 4504.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 2218:55:102010] [error] [client 91.142.217.147] File does not
exist: /usr/local/www/inkom/phpMyAdmin-2.2.3
[Thu Apr 2218:55:102010] [error] [client 91.142.217.147] File does not exist:
/usr/local/www/inkom/phpMyAdmin-2.2.6
[Thu Apr 2218:55:102010] [error] [client 91.142.217.147] File does not exist:
/usr/local/www/inkom/phpMyAdmin-2.5.1
[Thu Apr 2218:55:112010] [error] [client 91.142.217.147] File does not exist:
/usr/local/www/inkom/phpMyAdmin-2.5.4
[Thu Apr 2218:55:112010] [error] [client 91.142.217.147] File does not exist:
/usr/local/www/inkom/phpMyAdmin-2.5.6
[Thu Apr 2218:55:112010] [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.1195.268.118.27216.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>\]: 4504.1.1
reject: RCPT from (.*)\[<HOST>\]: 4504.7.1
reject: RCPT from (.*)\[<HOST>\]: 5045.5.2
#>fail2ban-regex /var/log/maillog 'reject: RCPT from (.*)\[<HOST>\]:
4504.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>
При остановке демона он старательно разбанивает все 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.