вторник, 26 июля 2011 г.

fail2ban - базовая настройка

fail2ban - утилита, которая парсит логи и выполняет определенные действия на некоторые повторяющиеся события в течении какого-то времени..
Например за несколько неудачных попыток авторизоваться по ssh за некоторое время забанить источник.
Очень полезна для предотвращения перебора паролей и различных зловредных действий.
Методов блокировки также несколько: ipfw, iptables, hosts.deny .
Есть уже много готовых примеров для ssh, exim, postfix,cyrus-imap, apache, lighttpd, named и тд (!!!). Можно их составлять и самим, для этого Вам понадобится некоторое знание регулярных выраженией в python. Сама настройка очень проста и логична.
Рассмотрю базовую установку на FreeBSD и настройку блокировки брутфорса ssh.

Итак приступим:
Установка fail2ban (не забываем предварительно обновить порты)

cd /usr/ports/security/py-fail2ban
make install clean
Добавляем в /etc/rc.conf

fail2ban_enable="YES"
Настраиваем ротацию логов, добавляем в /etc/newsyslog.conf

# FAIL2BAN
/var/log/fail2ban.log                   600 7 200 * JC
Настраиваем основной конфиг /usr/local/etc/fail2ban/jail.conf

[DEFAULT]
ignoreip = 127.0.0.1 10.0.0.1
# "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


[ssh-ipfw]

enabled  = true
# использовать фильтр из примеров /filter.d/bsd-sshd.conf    
filter   = bsd-sshd
# использовать /action.d/bsd-ipfw.conf  
# в квадратных скобках указываем значения переменных, в #данном случае указываем, что нужно добавить ip адрес в #таблицу 100 с tablearg 22 (я использую, как пометку причины бана)
action   = bsd-ipfw[table=100, tablearg=22]
logpath  = /var/log/auth.log
maxretry = 3
# банить на 7 суток
bantime  = 604800
Правим /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf

actionban = /sbin/ipfw table <table> add <ip> <tablearg>
actionunban = /sbin/ipfw table <table> delete <ip>
Примечание: При рестарте fail2ban снимает все баны. Для того чтоб происходил бан, должено быть правило в фаерволе типа:

ipfw add 10 deny ip from table'(100)' to any

Мне также пришлось поменять регулярные выражения в /filter.d/bsd-sshd.conf, т.к. эти базовые регулярки не отрабатывали. Привел их к следующему виду:

failregex = ^.* sshd.* (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from <HOST>\s*$
            ^.* sshd.* Did not receive identification string from <HOST>$
            ^.* sshd.* Failed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
            ^.* sshd.* ROOT LOGIN REFUSED.* FROM <HOST>\s*$
            ^.* sshd.* [iI](?:llegal|nvalid) user .* from <HOST>\s*$
            ^.* sshd.* User \S+ from <HOST> not allowed because not listed in AllowUsers$
            ^.* sshd.* authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^.* sshd.* refused connect from \S+ \(<HOST>\)\s*$
            ^.* sshd.* reverse mapping checking getaddrinfo for .* \[<HOST>\] .* POSSIBLE BREAK-IN ATTEMPT!$

Также у меня есть подсети, которые не используются.
Если к ip из этих подсетей идет упорное обращение, то можно считать, что это происходит сканирование диапазона сети.
В ipfw есть правило с логированием для блокировки обращения к таким подсетям.
Таким образом можно отслеживать таких "разведчиков" и блокировать полностью эти ip. Добавляем новый раздел в файл jail.conf

[ipfw-ban]
enabled  = true
# этот фильтр создадим позже /filter.d/ipfw-ban.conf   
filter   = ipfw-ban
action   = bsd-ipfw[table=100, tablearg=29999]
# Направляем на логи ipfw (у меня вынесены в отдельный лог)
# Можно направить на стандартный лог /var/log/security
logpath  = /var/log/ipfw/ipfw.log
maxretry = 5
# банить на 7 суток
bantime  = 604800
Нам нужно составить регулярное выражение, по которому будет анализироваться файл логов. Можно тестировать сразу "на лету" и смотреть, что получается.. Составим регулярное выражение для строки вида:

Jul 26 11:30:10 hostname kernel: ipfw: 29999 Deny TCP 50.57.93.243:42222 не_используемый_ip_адресс:80 out via net2
В простейшем виде будет вот такая регулярка:

fail2ban-regex /var/log/ipfw/ipfw.log '^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$'
Running tests
=============

Use regex line : ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
Use log file   : /var/log/ipfw/ipfw.log


Results
=======

Failregex
|- Regular expressions:
|  [1] ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
|
`- Number of matches:
   [1] 228 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    124.6.181.219 (Tue Jul 26 11:00:38 2011)
    124.6.181.219 (Tue Jul 26 11:00:39 2011)
...
    188.132.129.9 (Tue Jul 26 11:39:52 2011)

Date template hits:
473 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>

Success, the total number of match is 228

However, look at the above section 'Running tests' which could contain important
information.
 
Убедились, что регулярка отработала нормально, теперь ее можно добавлять в фильр /filter.d/ipfw-ban.conf

[Definition]
failregex = ^ipfw: 29999 Deny \S* .* out via net2$
Перезапускаем fail2ban

#/usr/local/etc/rc.d/fail2ban restart
Shutdown successful
2011-07-26 12:02:58,546 fail2ban.server : INFO   Starting Fail2ban v0.8.4
2011-07-26 12:02:58,546 fail2ban.server : INFO   Starting in daemon mode



Ссылки:  
fail2ban.org  
fail2ban на www.lissyara.su   
Блокирование DNS DDoS при помощи пакета fail2ban  
Защита сервера Asterisk с помощью fail2ban

1 комментарий:

  1. Спасибо. Можно еще добавить от сюда http://sysadmin.te.ua/linux/monitoring-systems/nastrojka-fail2ban-dlya-wowza.html настройку своего штампа даты, если возникает проблема з логами.

    ОтветитьУдалить