Ежедневно наблюдаю такую ситуацию
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.
Перечислю здесь наиболее распространённые из них: bruteblock, denyhosts, fail2ban, sshguard,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