Обсуждение: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, поэтому только его и правил)