Обсуждение:Fail2ban

Материал из Linux Wiki
Версия от 10:48, 8 апреля 2011; Rain (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

Переписка с мейнтейнером fail2ban'а в Debian по поводу обнаруженной мною баги:


From: rain
To: Yaroslav Halchenko
Subject: fail2ban
Date: Thu, 4 Nov 2010 02:30:36 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)

Доброго времени суток.

Всплыла старая проблема с fail2ban'ом, сходу нагуглилась переписка в багзилле - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=554162. Насколько понимаю, за более чем год так ничего и не решилось? В моем случае рандомно "выпадают" разные правила из actionstart'а при запуске fail2ban'а (например, не создаются нужные RETURN-цепочки и т.п.). Решилось добавлением секундных sleep'ов между командами (один слип в начале не помог).

Разработчики ничего по этому поводу не пишут?

From: Yaroslav Halchenko
To: rain
Subject: Re: fail2ban
Date: Wed, 3 Nov 2010 20:40:28 -0400
User-Agent: Mutt/1.5.20 (2009-06-14)
privetik... izvini za translit
upstream developer to uzhe davno fail2ban ne trogaet, tak chto on seychas ne osobo razvivaetsya. dlya debiana ya ego podpatchivayu kogda pridetsya
v etom sluchae nado bylo mne podi eti sleeps zasunut'...
ty govorish chto tebe odnogo sleep v nachale ne hvatilo?? stranno... skolko u tebya jails? comp bystriy/zagruzhenniy?
From: rain
To: Yaroslav Halchenko
Subject: Re: fail2ban
Date: Thu, 4 Nov 2010 02:57:39 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)
Пока 2 jail'a, на ssh и на lighttpd (на отлов ругани Suhosin-патча у Апача). Железка достаточно шустрая - http://linuxoid.in/Сервер_linuxoid.in - и сейчас практически не загруженная.
Пробовал еще делать слипы только при первых командах, а уже Insert'ы для Input'a и Forward'а (я добавил правило и для FORWARD'a, так как Апач и прочие сервисы работают на отдельных хостах в своих песочницах) пускал подряд - казалось бы, цепочки уже созданы, должно в любом случае отрабатывать - ан нет, пропадало правило. Пример:
actionstart = iptables -N fail2ban-<name>
              sleep 1
              iptables -A fail2ban-<name> -j RETURN
              sleep 1
              iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
#             sleep 1
              iptables -I FORWARD -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
Что имеем:
root@goro:~# iptables -S | grep fail
-N fail2ban-apache-suhosin
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin 
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh 
-A FORWARD -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin 
-A fail2ban-apache-suhosin -j RETURN 
-A fail2ban-ssh -j RETURN
т.е., правило в FORWARD для ssh'а уже посеяли. В логах:
2010-11-04 00:48:40,145 fail2ban.actions.action: ERROR  iptables -N fail2ban-ssh
sleep 1
iptables -A fail2ban-ssh -j RETURN
sleep 1
iptables -I INPUT -p tcp -m multiport --dports ssh -j fail2ban-ssh
iptables -I FORWARD -p tcp -m multiport --dports ssh -j fail2ban-ssh returned 400
Раскомментируем последний слип, перезапускаем fail2ban:
root@goro:~# iptables -S | grep fail
-N fail2ban-apache-suhosin
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh 
-A INPUT -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin 
-A FORWARD -p tcp -m multiport --dports 22 -j fail2ban-ssh 
-A FORWARD -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin 
-A fail2ban-apache-suhosin -j RETURN 
-A fail2ban-ssh -j RETURN
Теперь все ок.
Утром еще поупражняюсь со sleep'ами, 3 ночи, пора самому спать :)
From: Yaroslav Halchenko
To: rain
Subject: Re: fail2ban
Date: Wed, 3 Nov 2010 21:09:26 -0400
User-Agent: Mutt/1.5.20 (2009-06-14)
nu comp to podzagruzhen sudya po opisaniyu togo chego na nyom ponastavil ;-) tak chto podi iptables i podtormazhivaet zasovivat' noviye directivy, otsyuda i grabli :-/ ne govorya uzhe esli "pesochnitsy" eto virtualizirovanniye hosty (vserver? vmware?)
From: rain
To: Yaroslav Halchenko
Subject: Re: fail2ban
Date: Thu, 4 Nov 2010 03:18:26 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)
Нагрузка 0,2-0,3 для 4-хядерной машины - это не нагрузка :) http://stats.linuxoid.in/sysload.prox.html
motion, например, на ночь убивается, с трекера я тоже нагрузку снял. Так что кроме сидбокса сейчас нагрузки никакой:
# vzlist -o vpsid,laverage
      CTID       LAVERAGE
       101 0.00/0.00/0.00
       102 0.00/0.00/0.00
       103 0.00/0.00/0.00
       104 0.00/0.00/0.00
       105 0.10/0.17/0.17
       106 0.00/0.00/0.00
       107 0.00/0.00/0.00
       108 0.00/0.00/0.00
       109 0.00/0.00/0.00
       110 0.00/0.00/0.00
Песочницы - OpenVZ.
From: Yaroslav Halchenko
To: rain
Subject: Re: fail2ban
Date: Wed, 3 Nov 2010 21:27:51 -0400
User-Agent: Mutt/1.5.20 (2009-06-14)
On Thu, 04 Nov 2010, rain wrote:
> Нагрузка 0,2-0,3 для 4-хядерной машины - это не нагрузка :)
> http://stats.linuxoid.in/sysload.prox.html
eto ono konechno da... von alioth.debian.org (on zhe git. svn. etc) --
no ono uzhe i ne prikolno...
no vidat' hot' nagruzka i ne bolshaya, no vsya virtualizatsiya etc vliyaet na responsiveness, vot iptables v yadre i zanimaet vremya vsyo dobavit' ...
da ty i poprobuy v tsikle nasovat' novih pravil (kazhis v originalnom bugreport tak i delali) i posmotri ili plevatsya ne nachnet
From: rain
To: Yaroslav Halchenko
Subject: Re: fail2ban
Date: Thu, 4 Nov 2010 15:06:59 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)
Сам по себе iptables вполне успешно отрабатывает последовательное скармливание ряда команд - циклы работают вполне хорошо - http://paste.org/pastebin/view/24416, главное - не пытаться пускать команды впараллель, iptables этого не умеет, поэтому циклы с &: и валятся. Собственно, в том багрепорте уже об этом написано.
Код не ковырял, но, насколько понимаю, проблема в том, что для разных jail'ов команды пускаются впараллель? Ибо когда остается только один ssh (даже без слипов) - все отрабатывает хорошо. Но в таком случае sleep'ы тоже не выход - не исключена ситуация, что команды синхронно выполнятся, синхронно слипнут (в случае использования значений из $RANDOM опять-таки, не исключена ситуация совпадения чисел) и в итоге целевые команды (вызовы iptables) выполнятся тоже синхронно. Так что использование sleep - костыль, хоть и работающий в 99% случаев :).
Привязка к LA, отзывчивость и т.п. - слабый аргумент. fail2ban все-таки больше на серверах используется, а там нагрузка - сам видишь, может быть как большая, так и маленькая.
Т.е., требуется просто некий пул команд, куда из различных jail'ов с любой степенью параллельности будут закидываться вызовы iptables, а уже оттуда некий скрипт будет их брать и последовательно выполнять.
> top - 01:28:09 up 440 days, 18:42, 3 users, load average: 12.80, 14.88, 16.40
> up 440 days
Эх... А у меня вот максимальный аптайм был чуть больше 2 месяцев, а все из-за отключений света :(
Сейчас вообще грустно - меняют линии электропередачи, отключения через день. Пришлось jabber с конференцией временно перенести на VPS'ку.
--------
Провел только что еще один эксперимент - сделал враппер, вызываемый из скриптов и пишущий время выполнения и команду в файл:
Вариант с секундными слипами:
1288874281.897344867 iptables -N fail2ban-ssh
1288874281.906470822 iptables -N fail2ban-apache-suhosin
1288874282.909057955 iptables -A fail2ban-ssh -j RETURN
1288874282.917404903 iptables -A fail2ban-apache-suhosin -j RETURN
1288874283.919482342 iptables -I INPUT -p tcp -m multiport --dports ssh -j fail2ban-ssh
1288874283.927726263 iptables -I INPUT -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin
1288874284.929473249 iptables -I FORWARD -p tcp -m multiport --dports ssh -j fail2ban-ssh
1288874284.937888798 iptables -I FORWARD -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin
т.е., получается то, о чем я написал выше - команды пускаются впараллель, синхронно спят и практически синхронно (после точки - наносекунды, date +%N, т.е., разница на уровне единиц мс для моей машины) запускаются, что и не переваривается iptables'ом. Слип помогает только тем, что на iptables сваливается в 3 (в моем случае - 4) раза меньше команд за единицу времени.
Вариант без слипов:
1288874515.400945581 iptables -N fail2ban-ssh
1288874515.410019876 iptables -A fail2ban-ssh -j RETURN
1288874515.413204981 iptables -N fail2ban-apache-suhosin
1288874515.418687638 iptables -I INPUT -p tcp -m multiport --dports ssh -j fail2ban-ssh
1288874515.422014016 iptables -A fail2ban-apache-suhosin -j RETURN
1288874515.427451997 iptables -I FORWARD -p tcp -m multiport --dports ssh -j fail2ban-ssh
1288874515.428473217 iptables -I INPUT -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin
1288874515.437022247 iptables -I FORWARD -p tcp -m multiport --dports 80 -j fail2ban-apache-suhosin
аналогичная ситуация, а шаг выполнения кое-где достигает сотен мкс.
Как вариант, наверное, сделаю у себя упомянутый пул на шелле, пока не будет варианта получше - что-то вроде:
# где-то в стартовых скриптах, с соответствующими проверками и установкой прав
mkfifo -m 600 /var/run/fail2ban.com.sock
tail -f /var/run/fail2ban.com.sock | sh

# и в action скриптах
echo "команда" > /var/run/fail2ban.com.sock
From: Yaroslav Halchenko
To: rain
Subject: Re: fail2ban
Date: Thu, 4 Nov 2010 09:14:25 -0400
User-Agent: Mutt/1.5.20 (2009-06-14)
On Thu, 04 Nov 2010, rain wrote:
> Т.е., требуется просто некий пул команд, куда из различных jail'ов с любой степенью параллельности будут закидываться вызовы iptables, а уже оттуда некий скрипт будет их брать и последовательно выполнять.
vo vo -- eto budet poluchshe ;) poetomu to etot sleep i ne zasunul ya vidat' "all around" ;)
> Как вариант, наверное, сделаю у себя упомянутый пул на шелле, пока не будет варианта получше - что-то вроде:
> # где-то в стартовых скриптах, с соответствующими проверками и установкой прав
> mkfifo -m 600 /var/run/fail2ban.com.sock
> tail -f /var/run/fail2ban.com.sock | sh
> # и в action скриптах
> echo "команда" > /var/run/fail2ban.com.sock
nu vobschem prover'.... mozhet potom k fail2ban na Pythone zabadyazhish vnutril fail2ban-server ? ;) po idee dolzhna byt' option dlya lyuboy 'action' to be queued or not. and if queued -- just create a little queue class which would collect and dispatch them.
From: rain
To: Yaroslav Halchenko
Subject: Re: fail2ban
Date: Fri, 5 Nov 2010 01:44:03 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)
В общем, в итоге я так и сделал:
# grep -n com.sock /etc/init.d/fail2ban
103:    rm -f /var/run/fail2ban/fail2ban.com.sock 2>/dev/null
104:    mkfifo -m 600 /var/run/fail2ban/fail2ban.com.sock
112:    (tail -f --pid=$(pgrep fail2ban-server) /var/run/fail2ban/fail2ban.com.sock | sh &)
150:    rm -f /var/run/fail2ban/fail2ban.com.sock 2>/dev/null
первые 2 строки - до запуска демона в do_start, 3-я - после запуска там же, 4-я - в do_stop + соответствующие изменения в iptables-multiport.conf (у меня только он используется). Теперь все работает нормально.
Без особых заморочек и не сильно красиво - лучше было б, конечно, использовать переменную SOCKFILE, которая там уже есть, добавив какой-то суффикс, но тогда эту же переменную надо было бы как-то вытягивать в action-файлах, чтобы знать, куда скидывать команды - или делать то же в Python'овых скриптах, которые с этими файлами работают.
> mozhet potom k fail2ban na Pythone zabadyazhish
> vnutril fail2ban-server ? ;)
Я не знаю Python, да и ты с программой дольше знаком, проще разобраться будет, что и где надо подпилить, чтобы оно работало как надо :)
> po idee dolzhna byt' option dlya lyuboy
> 'action' to be queued or not. and if queued -- just create a little
> queue class which would collect and dispatch them.
Может быть, но чтобы полностью понять, как оно все работает - надо перелопатить 4 десятка скриптов, из которых fail2ban состоит (понятно, что если докапываться только до обработки jail'ов - то меньше, но все же), а с учетом моего незнания Python'a - это достаточно грустное занятие. Так что оставлю это дело для других ;)
From: Yaroslav Halchenko
To: rain
Subject: Re: fail2ban
Date: Thu, 4 Nov 2010 20:39:37 -0400
User-Agent: Mutt/1.5.20 (2009-06-14)
molodtsa
vobschem ne prishlesh li polniy /etc/init.d/fail2ban i podpilenniy action (s "echo"s) -- ya togda ego k bugreportu dobavlyu (ili konechno mozhesh sam ot svoego imeni) -- ty tolko skazhi kak zovut to tebya (konechno mogu tebya linuxoid.rain obozvat' in "acknowledgement).
pravilnoye "razresheniye" problemy -- mozhet kogda nid' doydu do 'podpilivaniya', no ne dumayu chto skoro -- drugih zabot hvatat.
оппа -- а кажись я русский своему vimу подчинил да и забыл про это ;-)
ну да ладно
Удачи
From: rain
To: Yaroslav Halchenko
Subject: Re: fail2ban
Date: Fri, 5 Nov 2010 13:57:21 +0200
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; i486-pc-linux-gnu)
См. в аттаче. Из изменений: я передвинул функцию do_status чуть выше, чтобы ее можно было использовать для проверки работы демона в do_start и do_stop и tail'у скармливаю PID из файлика, а не отгрепывая процессы - pgrep может не работать, если работает несколько fail2ban'ов (например, один в CT0 и один в еще каком-то контейнере в OpenVZ - в нулевой ноде тогда они будут светиться как 2 одинаковых процесса с разными PID'ами... В итоге можем следить не за "своим" fail2ban'ом).
В action-скриптах подобным образом надо изменить все, что относится к iptables:
$ ls -1 /etc/fail2ban/action.d/iptables*
/etc/fail2ban/action.d/iptables-allports.conf
/etc/fail2ban/action.d/iptables.conf
/etc/fail2ban/action.d/iptables-multiport.conf
/etc/fail2ban/action.d/iptables-multiport-log.conf
/etc/fail2ban/action.d/iptables-new.conf
(как я говорил, у меня используется только multiport, поэтому только его и правил)