Главная | Контакты



Главная > Программы

Настройка Fail2ban для защиты SSH

Fail2ban — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей.

Программа умеет бороться с различными атаками на все популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д.

Но в первую очередь Fail2ban известен благодаря готовности «из коробки» к защите SSH–сервера от атак типа «bruteforce», то есть к защите SSH от перебора паролей.

Настройка Fail2ban для защиты SSH

Установка Fail2ban

Готовые пакеты Fail2ban можно найти в официальных репозиториях всех популярных Linux дистрибутивов.

Установка Fail2ban на Debian/Ubuntu:

apt-get install fail2ban

Установка Fail2ban на CentOS/Fedora/RHEL:

yum install fail2ban

Конфигурация Fail2ban

На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию. Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже.

У программы два основных файла конфигурации:

  1. /etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
  2. /etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd.

Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 600
maxretry = 3
banaction = iptables-multiport

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены.

Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force».

Подробнее по каждому из основных параметров файла jail.conf:

ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера.

bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.

maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] — это число неудавшихся попыток логина, после которых происходит блокировка.

enabled — значение true указывает что данный jail активен, false выключает действие изолятора.

port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — 22, или его буквенное наименование — ssh.

filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.

logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл /var/log/auth.log.

Рекомендации по настройке Fail2ban

Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.

Новая опция findtime — определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов.

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

nano /etc/fail2ban/jail.local
[DEFAULT]
## Постоянный IP-адрес.
## Если не переопределить ignoreip здесь,
## то стоит закомментировать этот параметр в jail.conf.
ignoreip = 57.66.158.131

[ssh]
## если в течении 1 часа:
findtime    = 3600
## произведено 6 неудачных попыток логина:
maxretry    = 6
## то банить IP на 24 часа:
bantime     = 86400

Осталось перезапустить Fail2ban:

service fail2ban restart
* Restarting authentication failure monitor fail2ban        [ OK ]
tail /var/log/fail2ban.log
2013-01-20 22:00:35,911 fail2ban.jail   : INFO   Jail 'ssh' stopped
2013-01-20 22:00:35,916 fail2ban.server : INFO   Exiting Fail2ban
2013-01-20 22:00:36,257 fail2ban.server : INFO   Changed logging target to
/var/log/fail2ban.log for Fail2ban v0.8.6
2013-01-20 22:00:36,258 fail2ban.jail   : INFO   Creating new jail 'ssh'
2013-01-20 22:00:36,259 fail2ban.jail   : INFO   Jail 'ssh' uses poller
2013-01-20 22:00:36,271 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2013-01-20 22:00:36,271 fail2ban.filter : INFO   Set maxRetry = 6
2013-01-20 22:00:36,272 fail2ban.filter : INFO   Set findtime = 3600
2013-01-20 22:00:36,272 fail2ban.actions: INFO   Set banTime = 86400
2013-01-20 22:00:36,298 fail2ban.jail   : INFO   Jail 'ssh' started

Заключение

В статье затронуты только базовые возможности Fail2Ban, применимые для защиты SSH на типовом Linux–сервере. Более подробную документацию по программе вы можете найти в официальной Wiki на авторском веб–сайте.

Материал взят с сайта: http://putty.org.ru/articles/fail2ban-ssh.html

Fail2ban лучшая защита от атак

Сегодня я хочу предложить одну из самых лучших прог в этом секторе - это fail2ban., с этим может справится только fail2ban. Fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы: отслеживать изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные действия. Для поиска характерных признаков подбора пароля, используются регулярные выражения в файлах фильтров. Для выполнения действий используются action файлы. Так что будем устанавливать. Настраивать будем защиту sshd, proftpd, dovecot и может ещё какую службу. Для работы, естественно, потребуется включенный фаервол.

Установка fail2ban

Идём сюда:

# cd /usr/ports/security/py-fail2ban

запускаем инсталляцию:

# make install clean

Дальше идём сюда /usr/local/etc/fail2ban и наблюдаем следующую структуру каталога:

папка action.d - содержит файлы действий
папка filter.d - файлы фильтров
файл fail2ban.conf - основной файл конфигурации
файл jail.conf - файл настройки защиты конкретных сервисов

Настройка fail2ban

Чтобы в процессе конфигурации не натворить плохого, все файлы, которые мы будем править будем переименовывать из .conf в .local. В первую очередь копируем файл jail.conf в файл с именем jail.local.

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

Основной файл конфигурации /usr/local/etc/fail2ban/fail2ban.conf здесь можно оставить всё по умолчанию, можно только установить уровень логирования на 4, чтобы мы могли видеть побольше сообщений. Далее идём в папку /usr/local/etc/fail2ban/action.d видим кучу фаерволов, нас интересует пока только bsd-ipfw.conf. Переименовываем его в bsd-ipfw.local. Оставляем в нём всё по умолчанию. Можно только внести строчку

actionunban = ipfw table 1 delete

что бы при выходе из fail2ban обнулялась таблица, иначе там зависнут все забаненные навечно. Добавляем в ipfw правило, блокирующее все IP адреса, находящиеся в таблице table 1:

# ${FwCMD} add deny all from table\(1\) to me

Правило ставим сразу после вот этого правила

${FwCMD} add allow ip from any to any via lo0

Переходим в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению ищут определенные строки в лог файлах. Нас интересуют sshd.conf и proftpd.conf и dovecot.conf, как и ранее копируем их в sshd.local, proftpd.local и dovecot.local соответственно. В файлах я все оставил как есть.

А теперь мы дошли до самого вкусного, что есть в этой проге, чего нет ни в одной аналогичной проге. Проверить работоспособность того или иного фильтра с регулярными выражениями можно с помощью скрипта fail2ban-regex, идущего в поставке fail2ban. Например, проверяем фильтр proftpd.local, натравливая его на лог файл авторизаций:

# fail2ban-regex /var/log/auth.log /usr/local/etc/fail2ban/filter.d/proftpd.local

Данная команда выведет полную статистику, сколько строк из лог файла попадают под то или иное регулярное выражение, в отладке просто незаменимая вещь.

С фильтрами вроде разобрались, теперь вернемся к файлу jail.local и приведем его к следующему виду:

[ssh-iptables]

enabled = true
filter = bsd-sshd
action = bsd-ipfw
mail-whois[name=SSH, dest=alex2@2gogo.ru]
logpath = /var/log/auth.log
maxretry = 3
bantime = 240
findtime = 600
ignoreip = 127.0.0.1
backend = poller

[proftpd-iptables]

enabled = true
filter = proftpd
action = bsd-ipfw
mail-whois[name=ProFTPD, dest=alex2@2gogo.ru]
logpath = /var/log/auth.log
maxretry = 3
bantime = 240
findtime = 600
ignoreip = 127.0.0.1
backend = poller

[dovecot-iptables]

enabled = true
filter = dovecot
action = bsd-ipfw
mail-whois[name=Dovecot, dest=alex2@2gogo.ru]
logpath = /var/log/dovecot-info.log
maxretry = 3
bantime = 240
findtime = 600
ignoreip = 127.0.0.1
backend = poller

Мне нужно было, чтобы fail2ban отправлял письма, поэтому я включил mail-whois и не забываем отредактировать соответствующий файл в директории action.d, в данном случае mail-whois.local, там все довольно просто. Ну вот вроед всё настроили, пора запускать fail2ban. Прописываем в /etc/rc.conf

fail2ban_enable="YES"

и запускаем его

# /usr/local/etc/rc.d/fail2ban start

Если всё сделали правильно он запустится, если нет, разбирайтесь где накосячили. Если запустился, проверяем на бан, заходим со стороннего ip адреса, с неправильным паролем, должно забанить на время, которое вы указали.

Ну вот! Вроде всё.

Материал взят с сайта: http://www.ussr.kiev.ua/ru/fail2ban-luchshaya-zashchita-ot-atak

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

Защита от брутфорса SSH средствами fail2ban на FreeBSD + немного полезностей

Устанавливаем fail2ban

deathstar# cd /usr/ports/secuity/py-fail2ban && make install clean
Правим конфиг
deathstar# ee /usr/local/etc/fail2ban/jail.conf
У меня он выглядит так
[DEFAULT]
# Какие IP игнорировать
ignoreip = 127.0.0.1
# Время бана в секундах
bantime = 600
# время проверки,за которое событие успеет повторится, чтоб отловить и забанить
findtime = 600
# кол-во неверных попыток
maxretry = 1
backend = auto

[ssh-ipfw]
enabled = true
# использовать фильтр из примеров
filter = bsd-sshd
# использовать /action.d/bsd-ipfw.conf
action = ssh-ipfw[localhost=78.24.219.97]
# Уведомление в Jabber :))
jabber-whois[name="SSH,IPFW", dest=mail@housecomputer.ru
# Какой лог парсить
logpath = /var/log/auth.log
# Какой Ip игнорировать
ignoreip = 127.0.0.1

[exim-ipfw]
enabled = true
filter = exim
action = exim-ipfw[localhost=78.24.219.97]
jabber-whois[name="Exim,IPFW", dest=mail@housecomputer.ru
logpath = /var/log/exim/mainlog
ignoreip = 127.0.0.1

[nginx-ipfw]
enabled = true
filter = nginx
action = nginx-ipfw[localhost=127.0.0.1]
jabber-whois[name="Nginx,IPFW", dest=mail@housecomputer.ru
logpath = /home/deathstar/www/deathstar.name.access.log
ignoreip = 127.0.0.1

Для уведомления в Jabber должен быть установлен и настроен sendxmpp ( о нем я писал в предыдущих статьях)
Создаем файл /usr/local/etc/fail2ban/action.d/jabber-whois.conf с таким содержимым

[Definition]
actionstart = printf %%b "[Fail2Ban] : started
The jail
has been started successfully.\n
" | /usr/local/bin/sendxmpp ""

actionstop = printf %%b "[Fail2Ban] : stopped
The jail
has been stopped.\n
" | /usr/local/bin/sendxmpp ""

actioncheck =

actionban = printf %%b "[Fail2Ban] : banned
The IP
has just been banned by Fail2Ban after
attempts against .\n\n
Here are more information about :\n
`/usr/bin/whois
`\n
" | /usr/local/bin/sendxmpp ""

actionunban = printf %%b "[Fail2Ban] : unbanned
The IP
has just been unbanned " | /usr/local/bin/sendxmpp ""

[Init]
name = default
dest = root
sender = fail2ban

Создаем фильтры для sshd и exim,у меня они выглядят так
Файл /usr/local/etc/fail2ban/filter.d/bsd-sshd.conf
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from \s*$
Did not receive identification string from
$
Failed [-/\w]+ for .* from
(?: port \d*)?(?: ssh\d*)?$
ROOT LOGIN REFUSED.* FROM
\s*$
[iI](?:llegal|nvalid) user .* from
\s*$
User \S+ from
not allowed because not listed in AllowUsers$
authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=
(?:\s+user=.*)?\s*$
refused connect from \S+ \(
\)\s*$
reverse mapping checking getaddrinfo for .* \[
\] .* POSSIBLE BREAK-IN ATTEMPT!$
ignoreregex =

Файл /usr/local/etc/fail2ban/filter.d/exim.conf

[Definition]
failregex = \[\] .*(?:rejected by local_scan|Unrouteable address)
ignoreregex =

Ну и в довесок боремся с HTTP-флудом на NGINX средствами IPFW написал фильтр для nginx
Файл /usr/local/etc/fail2ban/filter.d/nginx.conf

[Definition]
failregex = .*(?:"-" "-")
ignoreregex =

Теперь создаем действия бана
Файл /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ipfw table 1 add
actionunban = ipfw table 1 delete

[Init]
localhost = 127.0.0.1

Файл /usr/local/etc/fail2ban/action.d/exim-ipfw.conf

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ipfw table 2 add
actionunban = ipfw table 1 delete

[Init]
localhost = 127.0.0.1

Файл /usr/local/etc/fail2ban/action.d/nginx-ipfw.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ipfw table 3 add
actionunban = ipfw table 1 delete

[Init]
localhost = 127.0.0.1

Пишем правила для ipfw,у меня они в файле /etc/firewall

#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} pipe flush
${ipfw} add check-state
${ipfw} table 1 flush
${ipfw} table 2 flush
${ipfw} table 3 flush
# Ban SSH
${ipfw} add deny ip from table\(1\) to me ssh
# Ban Exim
${ipfw} add deny ip from table\(2\) to me 25,110,143
#Ban Nginx
${ipfw} add deny ip from table\(3\) to me 80,443
${ipfw} add allow all from any to any

Добавляем в /etc/rc.conf
firewall_enable="YES"
firewall_script="/etc/firewall"
fail2ban_enable="YES"

и запускаем
deathstar# sh /etc/firewall && /usr/local/etc/rc.d/fail2ban start

Материал взят с сайта: https://deathstar.name/zashhita-ot-brutforsa-ssh-sredstvami-fail2ban-na-freebsd-nemnogo-poleznostej/

Защита unix сервера от подбора паролей

Ранее, я уже рассказывал о защите Unix сервера от подбора паролей (bruteforce). Речь шла об SSH и программе sshguard, фиксирующей неудачные попытки входа в систему по данному протоколу. Здесь хотелось-бы рассказать о более комплексном решении, для защиты практически любого сервиса - программе Fail2ban.

Собственно fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы прост, отслеживать изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные действия. Для поиска характерных признаков подбора пароля, используются регулярные выражения в файлах фильтров. Для выполнения действий используются action файлы.

На Linux с настройкой данной программы вообще никаких трудностей не возникает, на сервере FreeBSD всплыли некоторые специфические моменты.

Итак, операционная система FreeBSD 8.2 amd64, настраивать будем защиту sshd и фтп сервера proftpd. Для работы естественно потребуется включенный фаервол, во FreeBSD штатным является ipfw.

# cat /usr/local/etc/clamd.conf | grep -v ^# | grep -v ^$
LogFile /var/log/clamav/clamd.log

Установка fail2ban

# cd /usr/ports/security/py-fail2ban
# /usr/ports/security/py-fail2ban# make install clean

После установки, которая длится меньше минуты, идем по адресу /usr/local/etc/fail2ban, наблюдаем следующую структуру каталога:

  • папка action.d - содержит файлы действий
  • папка filter.d - файлы фильтров
  • файл fail2ban.conf - основной файл конфигурации
  • файл jail.conf - файл настройки защиты конкретных сервисов

Настройка fail2ban

В первую очередь копируем файл jail.conf в файл с именем jail.local, что-бы файл по умолчанию у нас оставался нетронутым, все настройки лучше делать в jail.local.

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

Для начала заглянем в основной файл конфигурации:


[Definition]

loglevel = 4 # На время настройки я ставлю 4, максимально подробный уровень логгирования
logtarget = /var/log/fail2ban/fail2ban.log # лог файл fail2ban, имейте в виду, если вы указываете свое расположение файла логов, как я в данном случае, нужно что-бы директория, где он будет расположен, была доступна на запись только пользователю root, иначе fail2ban не запустится.
socket = /var/run/fail2ban/fail2ban.sock # файл сокета для связи клиентской и серверной части программы, оставляем по умолчанию

Тут я изменил только расположение файла логов, как мне удобней и поднял уровень логгирования на время отладки.

Далее настроим взаимодействие с фаерволом ipfw. Идем в папку action.d, как видите фаерволы тут представлены в ассортименте, поскольку мы используем FreeBSD с ipfw, нас интересует файл bsd-ipfw.conf, вообще можно создать и свой с произвольным именем, главное не забыть это учесть при дальнейшей настройке в jail.local. По аналогии с файлом jail.conf, копируем его с именем bsd-ipfw.local.

Здесь можно оставить по умолчанию но я предпочитаю дописать в actionstop, команду для обнуления таблицы с забаненными IP адресами, при выключении fail2ban. Если сравнить этот файл, например с iptables.conf (для стандартного фаервола в linux дистрибутивах — iptables), можно заметить некоторые отличия, поскольку данные фаерволы устроены по разному и принципы организации правил фильтрации у них тоже разные.

Файл после моей правки выглядит так:


[Definition]
actionstart = # команда выполняемая при старте fail2ban
actionstop = pfw table 1 flush # команда выполняемая при остановке, обнуляем блокирующую таблицу
actioncheck = # команда проверки
actionban = ipfw table 1 add # забанить IP адрес, при срабатывании, IP добавляется в таблицу 1 ipfw
actionunban = ipfw table 1 delete # обратное действие, удалить IP из таблицы

все остальное я закомментировал

Что-бы данный вариант работал, нужно руками добавить в ipfw правило, блокирующее все IP адреса, находящиеся в таблице table 1:

# ipfw add 100 deny all from table\(1\) to me
# ipfw show
00100     0        0 deny ip from table(1) to me # правило которые мы только что добавили
65535 65255 15896158 allow ip from any to any

Есть еще один вариант, можно поступить например так:

в actionstart прописать команду автоматического создания правила:


actionstart = ipfw add 100 deny all from table\(1\) to me

а в actionstop, вдобавок к обнулению таблицы, дописать еще и команду удаления, например так:


actionstop = ipfw -q delete `ipfw -q show | grep "table(1)" | awk '{ print $1;}'`
	      ipfw table 1 flush

обе команды сработают по очереди. Но у ipfw есть такая особенность, в него можно добавлять кучу одинаковых правил с одним и тем-же номером, без каких-либо сообщений об ошибке. Срабатывать при этом будет только первое из них.

Получится следующая ситуация, мы прописали команду в actionstart, как я привел парой строк выше, а мониторить собираемся например 3 сервиса, sshd, proftpd и dovecot, значит при инициализации fail2ban, файл bsd-ipfw.local, будет прочитан 3 раза, соответственно команда:

# ipfw add 100 deny all from table\(1\) to me

тоже будет выполнена трижды, и соответственно у нас в фаерволе появится 3 одинаковых правила, и 2 из них не будут выполнять никаких функций, лишь мозолить глаза и сбивать с толку:

# ipfw show
00100     9      522 deny ip from table(1) to me # 1 работающее правило
00100     0        0 deny ip from table(1) to me # 2
00100     0        0 deny ip from table(1) to me # 3
65535 67537 16429215 allow ip from any to any

если вас это не смущает, можете сделать так, никаких негативных моментов это не несет, не считая конечно некоторой путаницы с правилами.

В общем я предпочитаю первый вариант, с ручным созданием основного правила.

Далее перейдем в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению ищут определенные строки в лог файлах. Нас интересуют sshd.conf и proftpd.conf, как и ранее копируем их в sshd.local и proftpd.local соответственно.

В файле sshd.local, я все оставил как есть. В proftpd.local пришлось внести некоторые незначительные изменения. Вот содержимое измененного файла:


[Definition]
failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[\S+\] to \S+:\S+.*$
            \(\S+\[<HOST>\]\)[: -]+ USER \S+ \(Login failed\): Incorrect password\..*$
            \(\S+\[<HOST>\]\)[: -]+ SECURITY VIOLATION: \S+ login attempted\..*$
            \(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \(\d+\) exceeded.*$

ignoreregex = # Сюда можно вписать регулярные выражения строк, которые нужно игнорировать

Дело в том, что регулярные выражения прописанные тут по умолчанию, ничего не находили в лог файле. Проверить работоспособность того или иного фильтра с регулярными выражениями можно с помощью скрипта fail2ban-regex, идущего в поставке fail2ban. Например проверяем фильтр proftpd.local, натравливая его на лог файл авторизаций:

# fail2ban-regex /var/log/auth.log /usr/local/etc/fail2ban/filter.d/proftpd.local

Данная команда выведет полную статистику, сколько строк из лог файла попадают под то или иное регулярное выражение, в отладке очень полезная штука.

Я никогда не сталкивался с python, тем более с его регулярными выражениями, хотя они и похожи на Perl, тем не менее различия есть. Попробовав разные вариант, дописал в конец каждого выражения ".*", после чего прогнал проверку через fail2ban-regex, все что нужно, находится.

С фильтрами вроде закончили, вернемся к файлу jail.local и приведем его к следующему виду:


[DEFAULT]

[ssh-ipfw]
enabled  = true # включить мониторинг
ignoreip = 127.0.0.1 192.168.50.200 # IP адреса которые нужно игнорировать
filter   = sshd # какой файл фильтра использовать, то есть по сути это название файла в папке filter.d, только без расширения
action   = bsd-ipfw # какой действие использовать, название аналогично фильтру
logpath  = /var/log/auth.log # анализируемый лог файл
bantime  = 60 # продолжительность блокировки, подбираем на свое усмотрение
maxretry = 2 # количество неудачных авторизаций с IP, значение подбирается по ситуации/нагрузке на сервис в рамках данной машины
findtime  = 600 # время, в течении которого нужно фиксировать maxretry, то есть у нас получается 2 ошибки в течении 10 минут
backend = poller # способ получения информации о модификации лог файла, можно поставить auto или gamin


[proftpd-ipfw] # тут все аналогично
enabled  = true
filter   = proftpd
action   = bsd-ipfw
logpath  = /var/log/auth.log
ignoreip = 127.0.0.1 192.168.50.200
bantime  = 60
maxretry = 2
findtime  = 600
backend = poller

В добавок к уже прописанному действию, можно добавить уведомление по почте на нужный адрес, например так:


action = bsd-ipfw
                  mail-whois[name=ProFTPD, dest=admin@domain.com]

и отредактировать соответствующий файл в директории action.d, в данном случае mail-whois.local, там все довольно просто:


[Definition]
actionstart =
actionstop =
actioncheck =
actionban = printf %%b "Hi,\n
            The IP  has just been banned by Fail2Ban after
             attempts against .\n\n
            Here are more information about :\n
            `whois `\n
            Regards,\n
            Fail2Ban"|mail -s "[Fail2Ban] : banned " 

actionunban =
[Init]
name = default
dest = admin@domain.com

На этом с настройками вроде закончили, можно запускать и проверять.

Запуск и проверка fail2ban

Мне удобней просматривать лог в режиме realtime, в отдельном окне консоли или в отдельном окне, оконного менеджера для терминала — screen, делаем:

# tail -f /var/log/fail2ban/fail2ban.log

теперь в этом окне у нас будут вылезать на экран все строки попадающие в лог, по мере их поступления.

Если запуск прошел успешно, проверяем блокировку. Я поступаю просто, со стороннего сервера запускаю:

# ssh 192.168.50.200

и жму на ентер, или ввожу значения от балды и жму на ентер), наблюдая за логом fail2ban, при loglevel = 4, там буду фиксироваться все изменения наблюдаемого файла, так же найденные IP адреса и действия производимые с ними.

В течении нескольких секунд после достижения порога неудачных логинов к ssh, IP адрес блокируется путем добавления его в таблицу table 1 фаервола, по истечении времени блокировки, адрес будет автоматически удален. Аналогично проверяется и ftp.

На Linux все настраивается аналогично, разве что может чуть попроще, с использованием соответствующих фаерволу, action файлов.

Вроде ничего не упустил.

Материал взят с сайта: http://webcache.googleusercontent.com/search?q=cache:kS55UNzgFikJ:vds-admin.ru/freebsd/zashchita-unix-servera-ot-podbora-parolei+&cd=4&hl=ru&ct=clnk

Главная > Программы