Категорії
FreeBSD Security

bruteblock: боремся с подбором паролей по ssh

Ежедневно наблюдаю такую ситуацию

Feb 23 02:59:13 mail sshd[47740]: Invalid user abuse from 221.6.179.212
Feb 23 02:59:17 mail sshd[47743]: Invalid user adam from 221.6.179.212
Feb 23 02:59:21 mail sshd[47745]: Invalid user admin from 221.6.179.212
Feb 23 02:59:26 mail sshd[47747]: Invalid user admin from 221.6.179.212
Feb 23 02:59:30 mail sshd[47749]: Invalid user administrator from 221.6.179.212
Feb 23 02:59:34 mail sshd[47751]: Invalid user admin from 221.6.179.212

Покопавшись в инете, нашёл немало методов для борьбы с этим. Некоторые советуют повеситьssh на нестандартный порт, или сделать авторизацию по ключам или вообще экзотические как наподобии поднять туннель pptp.
Перечислю здесь наиболее распространённые из них: bruteblockdenyhostsfail2bansshguard,sshit, blocksshd. Я же выбрал приложение, которое парсит логи auth.log и заносит негодяев в файервол или другими словами bruteblock.

И так, приступим. Идём в порты и ставим bruteblock:

#cd /usr/ports/security/bruteblock && make install clean

После этого идём в папку /usr/local/etc/bruteblock и находим там конфиги для ssh и proftpd. Я расскажу только про настройку для ssh. В proftpd – делается всё аналогично. Кстати, читал, что можно так же прикруть поддержку pop3,imap,smtp к bruteblock по подбору паролей.

Открываем конфиг и приводим его к такому виду:

regexp          = sshd.*(?:Illegal|Invalid) user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
regexp1         = sshd.*Failed \S+ for (?:(?:illegal|invalid) user )?\S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
regexp2         = sshd.*error: PAM: authentication error for (?:(?:illegal|invalid) user )\S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
regexp3         = "sshd.*Failed keyboard-interactive\/pam for \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
regexp4         = sshd.*Did not receive identification string from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
regexp5         = sshd.*User \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) not allowed because not listed in AllowUsers
regexp6 = sshd.*error: PAM: authentication error for \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

# Number of failed login attempts within time before we block
max_count       = 4

# Time in seconds in which all failed login attempts must occur
within_time     = 120

# Time in seconds to block ip in firewall (2 days)
reset_ip = 172800

# IPFW table number to add "bad" hosts (номер таблицы в файерволе ipfw, куда будут заносится негодяи)
ipfw2_table_no = 1

Пояснять я думаю не надо, из комментариев и так всё ясно. Единственно скажу, я поставил время блокировки IP на 2 дня. Вы же можете поставить своё значение. Насчёт регулярных выражений, так я их писал путём аналоза логов. При таких regexp’ax блокировка несуществующего юзера производится после 2-ух неудачных попыток, существующего – после 4-ох.

Конфиг готов, теперь нужно включить парсировку логов. Для этого открываем /etc/syslog.conf и дописываем такую строку:

auth.info;authpriv.info                         | exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/ssh.conf

После этого перезапускаем syslog (можно конечно и перечитать конфиг, но у меня что-то не хотели применятся изменения). Для запуска демона bruteblockd в /etc/rc.conf дописываем такую строку:

bruteblockd_enable="YES"
bruteblockd_table="1"
bruteblockd_flags="-s 5"

Для того, что бы не сбивать с толку наш блокировщик сообщениями вида

"last message was repeated 3 times"

добавим в /etc/rc.conf такую строчку

syslogd_flags="-c"

Так же не помешает сделать изменение в конфиге sshd, в частности в файле /etc/ssh/sshd_config:

UseDNS no

что бы в логах отображались IP-адреса, а не их доменные имена (поскольку bruteblock работает только с IP адресами). И естественно перечитать конфиг sshd:

#/etc/rc.d/sshd reload

Теперь приступим к последним штрихам. Создадим правила в файероле для наших негодяев и запускаем bruteblockd

#ipfw add deny all from 'table(1)' to me
#ipfw add deny all from me to 'table(1)'
#/usr/local/etc/rc.d/bruteblockd start

Теперь перечитаем rc.conf для вступления в силу параметра “-c” для syslog. О том, как это сделать – читаем здесь.

Осталось дело за малым – ждать, когда кто-то попадётся. При срабатывании в логах появляется такая запись:

Feb 27 17:14:51 query2 bruteblock[3325]: Adding 64.27.6.173 to the ipfw table 1

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff