Proftpd Bruteforce — Достойный ответ для подбирателей паролей

Бредовое вступление.
Давно я чтото не делился с вами своими простенькими поделиями на bash. Не от того что перестал их писать, просто лень описывать 🙂 Но вот чтото захотелось …. Ловите!

Последнее время розвелось много ботов-подбирателей паролей ко всему чему угодно. Рано или поздно это надоедает! Да и ничего хорошего от ботов ждать не приходится, только создают никому ненужную сетевую активность, засоряют логи и грузят сервис непотребными действиями. Решил дать достойный отпор, ибо задолбало!
Потихоньку-неспеша накропал такой вот скриптец, который брутфорсеров отправляет в некую таблицу фаервола, где им имитируется 99% потерь в канале 🙂

1. Скрипт, bash, FreeBSD … что это? Куда я попал и где мои вещи?
Ну, обо всем по порядку! Вот сам скрипт, он на bash:

root@black:~# cat /root/scripts/ftp_bots.sh
#!/usr/local/bin/bash

ban_log="/var/log/ftp_ban.log"

[ -f ${ban_log} ] || touch ${ban_log}

ftp_log="/var/log/proftpd.log"
ftp_bots=`grep -E -e 'no such user' ${ftp_log} |egrep -v '77.99.175.111|111.222.200.100' |sed -e 's/^.*from //' -e 's/\ .*//'| sort -nr | uniq -c | awk '{if($1>7)print $2}'`

for bot in $ftp_bots
 do
  TIME_NOW=`date "+%F %T"`

    pfctl -q -t bots -T test $bot

    if [ $? -eq 0 ]
        then
          continue
        else
         pfctl -q -t bruteforce -T test $bot
          if [ $? -eq 0 ]
            then
                continue
            else
                pfctl -q -t bruteforce -T add $bot
                pfctl -q -K $bot
                pfctl -q -k $bot
                echo "${TIME_NOW} --- Banned IP --- $bot" >> ${ban_log}
          fi
    fi
done

2. И это работает? Да ладно!!! Какието букавки непонятные … и что же этот скрипт делает?
Чуток опишу логику работы скрипта:
/var/log/ftp_ban.log — лог файл скрипта. Туда будут писаться дата-время-ip заблокированных ботов
ftp_log=»/var/log/proftpd.log» — лог FTP сервера
77.99.175.111|111.222.200.100 — некие IP адреса которые я хочу исключить из лога, заведомо считаем что это «белый список». Рекомендую вписать сюда свои IP, а также самых активных пользователей сервера. Заведомо даем им возможность делать ошибки в регистрации, мало ли что 🙂 Как обычно — разраб. сайта пароль на FTP забудет 🙂
ftp_bots — это переменная-список в которую попадут все кроме «белого списка», которые получили от proftpd ошибку — ‘no such user’ более 7 раз!
for bot in $ftp_bots — Ну дальше берем список $ftp_bots и смотрим есть ли IP из списка в таблице bots, если есть — следующий по списку ip, если нету, проверяем есть ли IP из списка в таблице bruteforce, если есть — следующий по списку ip, если нету, добавляем ip в таблицу bruteforce и делаем об этом запись в ${ban_log} и следующая итерация … до тех пор пока список $ftp_bots не закончится.

3. Таблицы, фаерволы … что это и как оно работает?
Теперь про таблицы и фаервол. В качестве фаервола — PF. Обожаю его, простой как двери и достаточно функциональный. В нем есть 2 таблицы — bots и bruteforce. В таблицу bots я закидываю «особо отличившихся» красавчиков. Эта таблица блочится для мира начисто:

block in log quick on $INET_IF from <bots> to any

Для тех же кто просто балуется брутфорсиком — есть табличка bruteforce для ip которой фаерволом имитируются потери в канале 99%

block in log quick on $INET_IF from <bruteforce> to any probability 99%

4. А если этих самых ботов тыщи???
Ну и чтобы не копить себе IP злоумышленников до бесконечности (они всетаки захламляют RAM) — по cron периодически очищаем табличку bruteforce от старых записей. Я настроил на очистку записей старше 86400 секунд, тоесть даю боту сутки на то чтоб подумал надо своим поведением. Также по крону запускаю скрипт ftp_bots.sh каждые 5 минут.

root@black:~# crontab -l
MAILTO=""
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#### <- For clean entries from table SSH BRUTEFORCE older than 1 day ! -> ####
52      *       *       *       *       /sbin/pfctl -t bruteforce -T expire 86400
#### <= FTP bots => ####
*/5     *       *       *       *       /root/scripts/ftp_bots.sh

root@black:~#

5. А зачем нам лог в скрипте? С ним что делать?
Ну и на последок, так выглядит log файл. Его можно глянуть в случай если вам ктото позвонил и грозно заявил что «сервер перестал видеться в сети …». Там можно найти кого в последнее время банили чтобы оперативно розбанить:

root@black:~# cat /var/log/ftp_ban.log
2014-06-03 11:15:20 --- Banned IP --- 109.186.76.161
2014-06-03 19:45:00 --- Banned IP --- 199.193.71.123
2014-06-03 19:00:00 --- Banned IP --- 186.205.53.223
2014-06-03 19:00:00 --- Banned IP --- 91.121.195.189
2014-06-03 19:05:00 --- Banned IP --- 59.58.139.120
2014-06-04 12:25:00 --- Banned IP --- 109.186.76.161
2014-06-04 20:00:00 --- Banned IP --- 199.193.71.123
2014-06-04 20:55:00 --- Banned IP --- 186.205.53.223
2014-06-04 20:55:01 --- Banned IP --- 91.121.195.189
2014-06-04 20:55:01 --- Banned IP --- 59.58.139.120
root@black:~#

Пробуйте … пишите комменты, замечания и т.д.
P.S. Некоторые в таких случаях еще заявляют — а как же клиенты за NAT, многопользовательские сети/сервера и прочее. IP залочен одним нехорошим клиентом — остальная масса пользователей за NAT тоже получается залочены. Мой ответ прост — да мне пофигу! Мой сервер, мой ресурс и мое решение. Если какойто Вася поймал вирь и от этого 200 клиентов рядом с ним перестали видеть мой сервер — мне жаль их 🙂 Пусть почитают с соседнего сервера статью про маленьких пушистых котиков …

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?