Sshit во FreeBSD - защищаем сервер от перебора паролей


muff

Просматривая логи, опять обнаружил как кто-то битый час подбирал пароль доступа по ssh.
# tail -f /var/log/auth.log

Aug 23 00:38:29 web0 sshd[31139]: Invalid user alexis from 190.152.99.19
Aug 23 00:38:31 web0 sshd[31141]: Invalid user mlmb from 190.152.99.19
Aug 23 00:38:34 web0 sshd[31143]: Invalid user mlmb from 190.152.99.19
Aug 23 00:38:44 web0 sshd[31151]: Invalid user user from 190.152.99.19
Aug 23 00:38:46 web0 sshd[31153]: Invalid user test from 190.152.99.19
Aug 23 00:38:49 web0 sshd[31155]: Invalid user test from 190.152.99.19
Aug 23 00:38:51 web0 sshd[31157]: Invalid user test from 190.152.99.19
Aug 23 00:38:54 web0 sshd[31159]: Invalid user test from 190.152.99.19
Aug 23 00:38:56 web0 sshd[31161]: Invalid user ftp from 190.152.99.19
Aug 23 00:38:58 web0 sshd[31163]: Invalid user oracle from 190.152.99.19
Aug 23 00:39:01 web0 sshd[31165]: Invalid user oracle from 190.152.99.19
Aug 23 00:39:03 web0 sshd[31167]: Invalid user oracle from 190.152.99.19
Aug 23 00:39:06 web0 sshd[31169]: Invalid user service from 190.152.99.19
Aug 23 00:39:09 web0 sshd[31171]: Invalid user service from 190.152.99.19
Aug 23 00:39:11 web0 sshd[31173]: Invalid user office from 190.152.99.19
Aug 23 00:39:14 web0 sshd[31175]: Invalid user payment from 190.152.99.19
Aug 23 00:39:16 web0 sshd[31177]: Invalid user haisou from 190.152.99.19
Aug 23 00:39:19 web0 sshd[31179]: Invalid user asoto from 190.152.99.19
Aug 23 00:39:21 web0 sshd[31181]: Invalid user rainman from 190.152.99.19
Aug 23 00:39:24 web0 sshd[31183]: Invalid user archive from 190.152.99.19
Aug 23 00:39:26 web0 sshd[31185]: Invalid user archive1 from 190.152.99.19
Aug 23 00:39:28 web0 sshd[31187]: Invalid user art from 190.152.99.19
Aug 23 00:39:31 web0 sshd[31189]: Invalid user archive2 from 190.152.99.19
Aug 23 00:39:33 web0 sshd[31191]: Invalid user archive3 from 190.152.99.19
Aug 23 00:39:36 web0 sshd[31193]: Invalid user bobyn from 190.152.99.19
Aug 23 00:39:38 web0 sshd[31195]: Invalid user desiree from 190.152.99.19


Конечно, можно зафильтровать на файрволе 22 порт, оставив разрешенными соединения с доверенных хостов. Однако меня это не устраивает. Иногда подключаюсь с разных ip-адресов, от разных провайдеров. Соответственно список "доверенных" хостов делается условно доверенным. Однако есть готовое решение, когда хост блокируется после определенного количества неудачных попыток авторизоваться. Даное решение можно реализовать с помощью sshit

Приступим к установка порта:
# cd /usr/ports/

# make search name='sshit'
Port: sshit-0.6_4
Path: /usr/ports/security/sshit
Info: Checks for SSH/FTP bruteforce and blocks given IPs
Maint: rafan@FreeBSD.org
B-deps:
R-deps: p5-IPC-Shareable-0.60_1 p5-Proc-PID-File-1.24 p5-Unix-Syslog-1.1 perl-threaded-5.8.9_3
WWW: http://anp.ath.cx/sshit/

# cd /usr/ports/security/sshit

# make install clean

# rehash


Следуя послеинсталяционным указаниям, добавляем строку "auth.info;authpriv.info |exec /usr/local/sbin/sshit" в /etc/syslog.conf и перестартовываем syslogd:
# cat /etc/syslog.conf
# $FreeBSD: src/etc/syslog.conf,v 1.28 2005/03/12 12:31:16 glebius Exp $
#
# Spaces ARE valid field separators in this file. However,
# other *nix-like systems still insist on using tabs as field
# separators. If you are sharing this file between systems, you
# may want to use only tabs as field separators here.
# Consult the syslog.conf(5) manpage.
*.err;kern.warning;auth.notice;mail.crit /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.* /var/log/security
auth.info;authpriv.info /var/log/auth.log
auth.info;authpriv.info |exec /usr/local/sbin/sshit
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
ftp.info /var/log/xferlog
cron.* /var/log/cron
*.=debug /var/log/debug.log
*.emerg *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.* /var/log/all.log
# uncomment this to enable logging to a remote loghost named loghost
#*.* @loghost
# uncomment these if you're running inn
# news.crit /var/log/news/news.crit
# news.err /var/log/news/news.err
# news.notice /var/log/news/news.notice
!startslip
*.* /var/log/slip.log
!ppp
*.* /var/log/ppp.log
# sh /etc/rc.d/syslogd restart


Отредактируем конфигурационный файл /usr/local/etc/sshit.conf соответственно к нашим требованиям. Благо опций немного ;)
# cat /usr/local/etc/sshit.conf

# Я использую ipfw

FIREWALL_TYPE = ipfw2

# Количество неверных вводов пароля, после которых IP-адрес клиента будет заблокирован
MAX_COUNT = 3

# Промежуток времени, в котором будет считаться кольчество попыток авторизации (в секундах)
WITHIN_TIME = 300

# Время, на которое будет заблокирован доступ (в секундах)
RESET_IP = 1200

# Исполняемая команда

IPFW_CMD2 = /sbin/ipfw

# Таблица файрвола, в которую будут добавляться "недоброжелательные" хосты
IPFW2_TABLE_NO = 10


Теперь необходимо добавить в файрвол правило, запрещающее доступ к нашему серверу. Обычно я размещаю это правило сразу после настройки обмена трафиком по loopback-интерфейсу.
# ipfw add 150 deny all from "table(10)" to any

# ipfw show

00100 34514 4580238 allow ip from any to any via lo0
00110 0 0 deny ip from any to 127.0.0.0/8
00120 0 0 deny ip from 127.0.0.0/8 to any
00150 123 10368 deny ip from table(10) to any
...

Можно протестировать созданную защиту, попробовав ввести неверный логин и пароль при подключении. Только будьте осторожны, подумайте над тем, как вы сможете попасть на сервер, если доступа с другого IP нету



Примечание:

Для более уверенной работы советую отключить резолвинг ДНС для ssh. Для этого в /etc/ssh/sshd_config необходимо добавить параметр "UseDNS no" и перезапустить sshd:
# echo 'UseDNS no' >> /etc/ssh/sshd_config

# sh /etc/rc.d/sshd restart

Обновлено: 12.03.2015