Pull to refresh

Comments 54

А можно комментарии практикующих пользователей услышать по этой программе?
Я использую на всех серверах-в зависимости от попадания в логах каких-от записей, Ip блочатся на фаерволле. Использую для антибрутфорса ssh и asterisk. 5 неудачных попыток и в бан. Правда если попыток много за короткое время, то пока fail2ban родит и заблочит, бот успеет еще раз 30-40 поломится. Сообщения о бане присылает на почту вместе с whois информацией о Ip, с которого шла атака.
Изучение принципов работы fail2ban и настройка заняли у меня полдня, а потом нужные правила писал за 10 минут каждое — регексы там очень удобны и упрощены до предела всякими словами-патернами.
я пробовал пользоваться. На слабом ВПСе забирал слишком много ресурсов, но в принципе работал хорошо. Сейчас ограничился защитой на уровне iptables — разрешено 3 подключения к порту в 120 секунд. Для меня этого вполне достаточно.
Рекомендую SshGuard www.sshguard.net
Смотрит в прямом эфире, кто пытается авторизоваться и блочит в зависимости от настроек
Я, например, блочу в случае 3 ошибок в течение 1 секунды
А если раз в секунду, но с 10к разных адресов?
Логи говорят, что такого не происходит )
Долбятся по нескольку раз с 1 ip
А ipfw потом шевелиться будет? Записей-то можно получить огого после такого.
ipfw table 1 add xxx
использовать надо. Тогда точно тормозов не будет.
Праивльнее, конечно же, заносить адреса в таблицы ipfw.
Про таблицы я не подумал, т.к. не так хорошо знаю ipfw, но на моем сервере он шевелился даже при 3-4 тысячах правил без затруднений. Хотя и нагрузки на нем не те, чтобы я мог об этом Вам что-то сказать.
UFO just landed and posted this here
Посмотрите на /usr/ports/security/bruteblock в портах, похоже что он делает практически то же самое.
Кстати, для добавления deny правил в ipfw грамотнее использовать таблицы, что bruteblock и делает.
Пользуюсь им сам уже много лет, никаких нареканий нет.
А что лучше, он или fail2ban? Я вот как раз решаю что использовать.
Не знаю, не пользовался fail2ban.
Попался когда-то под руку bruteblock, он настраивается легко и гибко. Неприхотлив, из зависимостей кажется перл только. Если сильно долбят снаружи то нагрузка пойдёт на ipfw в основном, так что типичную нагрузку эта связка должна держать. Вроде ничего больше и не нужно…
Альтернативы даже не смотрел, но за bruteblock могу сказать по своему реальному опыту — работает железно и никогда не подводил.
Вот блин, сейчас посмотрел, он оказывается на чистом С написан, так что там даже и перл не нужен :) Чёрт побери, мне это нравится…
trusted_net='192.168.'

А я бы и локальной сетке не доверял, если уж полноценно подходить к защите корпоративной информации. Ладно там раз-другой неудачно кто-то пароль ввел, но если начнется брут из локалки, сознательный или кто-нибудь чего-нибудь подцепит — ваш скрипт ему мешать не будет, как я понял из беглого его просмотра.
Я ей тоже не доверяю, но делаю допущение, т.к. все компы защищены корпоративным DrWeb. Кроме того, не хочется лишний раз беспокоить директора, который вдруг не увидит свою почту.
Это очень слабое место, но при использовании sh, мне кажется, иначе не поступить. Разве только начинать писать конкурента bruteblock.

Спасибо за подсказку, я изучу bruteblock.

Пока писал, пришло в голову: можно для доверенных подсетей сделать другой порог срабатывания. Т.е. дать им немного больше попыток ошибиться, чем внешним пользователям.
Коллеги, а вот я столкнулся с такой ситуацией, когда в логи попадает имя хоста с пробелом, это полностью парализует скрипт, т.к. пробел — есть разделитесь для {print $n}. Кто-нибудь в курсе, как такое поведение злоумышленника отработано в предложенных программах?
  • bruteblock
  • fail2ban
  • SshGuard


Пример:
2011-10-12 16:06:42 auth_login authenticator failed for host104-147-static.34-88-b.business.telecomitalia.it (windows) [88.34.147.104]: 535 Incorrect authentication data
The Full DNS name for internal domain can contain letters (a-z, A-Z), numbers (0-9), and hyphens, but not spaces.

# dig -x 88.34.147.104 +short
host104-147-static.34-88-b.business.telecomitalia.it.
# host 88.34.147.104
104.147.34.88.in-addr.arpa domain name pointer host104-147-static.34-88-b.business.telecomitalia.it.

скорей всего Exim так пишет лог
Я делал похожие вещи для своего сервера. Но потом сервер начал тупить. Решилось командой EXIT в конце скрипта.

и еще, это не самый производительный вариант парсить логи.
сегодня ваш лог весить 40Мб а завтра 1Гб.

Особенно использование «cat /tmp/auth.log | grep „Did not receive identification string“ |»

тут достаточно использовать один grep.

Запустите два разных скрипта с cat и без cat так time ./script.sh. Очень заметно на больших логах.
Вопрос в рациональности анализа логов остается, можно сэкономить кучу нервов и сил если:
1)ССШ зафаерволить (открыть только с определенных адресов)
2) аналогично произвести с админкой веба ограничив доступ с определенных адресов(если такая имеется) .htaccess

В любом случае скрипт это хорошо, но опять же это будет хорошо работать при низкой интенсивности брутфорса.
У меня всегда недопонимание, когда я слышу о таком подходе. А если с телефона надо зайти? А если админ в отпуске (в другом городе, стране)?
VPN для этого и придумали. В конце концов в отпуске должен быть заместитель, который может решить текущие задачи ;)
А если VPN тоже будут брутфорсить? )
это менее вероятно. Например OpenVPN попробуйте)
По своему опыту: увы, vpn не со всеми домашними провайдерами работает. Это касается как и OpenVPN, так и pptp/l2tp.
Я так недавно не смог подключиться к офисному pptp из отеля в отпуске.
pptp требует умного ната, т.к используются протокол GRE, в большинстве сошо-роутерах может одновременно только 1 сессия pptp существовать.
С опенвпн все просто — ставишь его на порт 443(если ваш провайдер не зверь и он не режет/проксируется https то все будет ок.
Спасибо. Годный совет, кстати. Надо попробовать.
Вариант, но это опять же костыли. Еще есть такой момент что если для кнока использовать UDP порты то количество попыток «достучатся» заметно увеличивается)
#!/bin/sh

у вас во фряхе баш дефолтным шеллом?

Ну и фраза «подобрать пароль к exim», извиние, порвала в клочья.
#!/bin/sh — вполне нормально для FreeBSD. Никакой это не bash.
ooops, не доглядел. Действительно, скрипт сишелловый. А сначала показалось почему-то, что на баше :)
Я использую эту строку, ибо mc в таком случае подсвечивает синтаксис.
ИМХО, описанное решение — это слегка overkill для большинства систем. Наверняка среди россыпи фрёвых фаерволов есть такой, который позволяет ограничивать количество подключений к порту каким-то стандартным правилом, и этого будет вполне достаточно.
да, на PF можно настроить ограничения по кол-ву соединений в минуту(если неошибаюсь) + также можно заносить провинившихся в отдельную таблицу, но опять же придется использовать крон чтобы список применялся, что не всегда уместно делать.
>но опять же придется использовать крон чтобы список применялся,
Не надо там такого извращения, в таблице и на правило. Вот чтобы очищать таблицу от устаревших правил да, надо дополнительно ставить либо pfguard, либо руками.
Здесь еще не упоминалась замечательная програмка sshit, которая очень легко конфигурится, и которую использую на домашнем сервере уже не первый год.
pipe pipe pipe… Блин меня убивает такой код… Научись наконец awk и правильным использованием пайпов :)
А Вы не могли бы привести свой пример замены awk для конкретного случая, например для websec.sh в блоке «Вылавливаем спецов по нарушению RFC»?
Этого должно хватить :)

fgrep "request without hostname" /tmp/${cur_log_file} |awk 'sub("]", " ");{print $8}' | sort | uniq -c
Меня смущает cat всего файла, да еще и каждую минуту!

Я бы использовал tail -f logfile | script.sh &
Поэтому разрастающиеся логи ротируются каждую минуту в отдельную папочку с текущей датой. Это в самом начале скрипта:
# копируем логи
cat ${cur_log_dir}/${cur_log_file} > /tmp/${cur_log_file}
# очищаем исходный логфайл
cat /dev/null > ${cur_log_dir}/${cur_log_file}
# обновляем архивный логфайл
cat /tmp/${cur_log_file} >> ${log_file}


tail же выдаст только последнюю часть файла, а не все события за период. В этом случае смысл скрипта пропадает.
А вообще тут я бы рекомендовал использовать fifo и работать c данными уже из него.
Ок, попробую ответить развернуто.

У Вас на каждый тип проверки перечитывается файл (cat | grep «type»)

При использовании tail -f |
наш скрипт обрабатывает лог построчно:

#!/bin/sh

while read mon day time domain pname msg; do
тут можно разбирать, что в наших переменных
например $msg — текст сообщения, $time — время и тд, думаю Вы поняли смысл
done

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

И такая архитектура избавит Вас от необходимости как-то дополнительно подготавливать (ротировать) файлы
Что ж, все понятно. Осталось придумать, как следить, чтобы сервис был постоянно запущен. Кажется, с этим будут сложности, также как и при запуске после ребута.
О, совсем нет.
script.sh & и процес работает в фоне. А while read настолько прост, что никогда не падает сам ;)
Сделал примерно похожий скрипт по анализу логов и бану через ipfw
Если его запускать «руками» работает отлично
При запуске через крон отказывается работать.
Долгие копания привели к тому, что я выяснил, что при запуске через крон grep возвращает ноль, а руками — нормальную цифру
Ни кто не знает в чем может быть проблема?
Команда вот такая

/bin/ps aux | /usr/bin/grep httpd | /usr/bin/wc -l

Это я по количеству процессов httpd определяю активность на сайтах

не работает именно /usr/bin/grep и только при запуске через крон
Ларчик открывается просто:
— делаете файл sh, куда пишите свой скрипт
— пишите в крон строку на его запуск
А может надо в кавычки взять греп-строку?
скрипт /root/apachecount.sh
Содержимое:
/bin/ps aux | /usr/bin/grep httpd | /usr/bin/wc -l > /root/apachecount.txt
запуск через /etc/crontab от имени рута
Через крон пишет всегда 1
Руками пишет всегда нормальную цифру
httpd пробовал писать и с двойными кавычками и с одинарными и без ковычек
Sign up to leave a comment.

Articles