Denyhosts - защищаем ssh, ftp и не только (черный список IP адресов)Подписка на Комментарии к "Denyhosts - защищаем ssh, ftp и не только (черный список IP адресов)"

Аватар zenon

На медне вспомнил, о почему-то мало упоминаемой штуке под названием denyhosts.
Denyhosts представляет из себя набор Python скриптов для защиты SSH (и не только) серверов от перебора паролей (брутфорса).
Скрипт следит за логами системы, о неудачных попытках авторизации. После обнаружения ложных вводов логина-пароля блокирует IP адрес, с которого производилась атака (вносит IP адрес в /etc/hosts.deny)

Запускается в качестве системной службы (init скрипт), либо по расписанию через cron.

Вся радость denyhosts не только в блокировании хостов, пытающихся пробиться к вашему SSH серверу, но и в том, что можно синхронизировать свой "черный список" с серверами denyhosts. Таким образом создается коллективный список хостов, содержащий всех нападающих.

Документации по программе не очень много (на английском довольно большой FAQ), все опции конфигурирования нормально описаны и комментированы в конфигурационном файле (/etc/denyhosts.conf).

Как мы увидели denyhosts это анализатор лога, сообщения от SSH попадают в /var/log/messages (/var/log/secure - RH, Fedora, /var/log/auth.log - FreeBSD, OpenBSD), а это значит, что в системе обязательно должен быть установлена служба syslog-ng.

Чтобы denyhosts блокировал попытки взломов других сервисов, обязательно необходимо проверить попадают ли данные в лог файл (по-умолчанию SECURE_LOG = /var/log/messages).

Например у меня работает ftp сервер proftpd, - обязательно проверте попадает ли информация в SECURE_LOG.
Вот как примерно это выглядит:

Feb 20 19:12:53 proftpd[9224]: 192.168.0.1 - ProFTPD 1.3.3g (maint) (built Вт. февр. 12 2013 14:20:55 MSK) standalone mode STARTUP
Feb 20 19:13:11 proftpd[9327]: 192.168.0.1 (::ffff:192.168.0.8[::ffff:192.168.0.8]) - FTP session opened.
Feb 20 15:13:11 proftpd[9327]: 192.168.0.1 (::ffff:192.168.0.8[::ffff:192.168.0.8]) - Preparing to chroot to directory '/mnt/srv/ftp'
Feb 20 15:13:11 proftpd[9327]: 192.168.0.1 (::ffff:192.168.0.8[::ffff:192.168.0.8]) - ANON ftp: Login successful.
Feb 20 19:22:19 proftpd[12722]: 192.168.0.1 (::ffff:80.00.00.00[::ffff:80.80.00.00]) - FTP session opened.
Feb 20 19:22:35 proftpd[12722]: 192.168.0.1 (::ffff:80.00.00.00[::ffff:80.80.00.00]) - USER john (Login failed): User in /etc/ftpusers
Feb 20 19:22:40 proftpd[12722]: 192.168.0.1 (::ffff:88.00.00.00[::ffff:80.80.00.00]) - FTP session closed.

Итак в Gentoo установка:

# emerge --ask app-admin/denyhosts app-admin/syslog-ng net-misc/openssh

Важно, чтобы net-misc/openssh и app-admin/syslog-ng были собраны с флагом +tcpd.
Также не забываем добавить в make.conf флаг +syslog, чтобы другие программы им пользовались.
# echo 'net-misc/openssh tcpd' >> /etc/portage/package.use
# echo 'app-admin/syslog-ng tcpd' >> /etc/portage/package.use

Запуск службы и добавление в автозагрузку:

# /etc/init.d/denyhosts start
# rc-update add denyhosts default

Вариант - запуск по расписанию - подходит для любых дистрибутивов (отредактировать /etc/crontab):

# запуск DenyHosts каждые 10 минут
*/10  *  * * *    python /usr/bin/denyhosts -c /etc/denyhosts.conf

В Debian (как и во многих других) пакет в репозиториях:

# apt-get install denyhosts

//////
Настройка не сложна, если нет каких-то личных предпочтений почти всё можно отсавить по-умолчанию, но предупреждаю, ограничения довольно суровые, root блокируется сразу после одной неудачной авторизации, пользователь после трех.
Вот как примерно работает у меня:

# grep -v -E "#|^$" /etc/denyhosts.conf
SECURE_LOG = /var/log/messages
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY =
BLOCK_SERVICE = ALL
DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID = 5
DENY_THRESHOLD_ROOT = 3
DENY_THRESHOLD_RESTRICTED = 1
WORK_DIR = /var/lib/denyhosts
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=YES
LOCK_FILE = /var/run/denyhosts.pid
ADMIN_EMAIL =
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <nobody@localhost>
SMTP_SUBJECT = DenyHosts Report
SYSLOG_REPORT=YES
AGE_RESET_VALID=5d
AGE_RESET_ROOT=25d
AGE_RESET_RESTRICTED=25d
AGE_RESET_INVALID=10d
DAEMON_LOG = /var/log/denyhosts
 
DAEMON_SLEEP = 30s
DAEMON_PURGE = 1h
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911

Как можно заметить синхронизация тоже настроена - SYNC_SERVER = http://xmlrpc.denyhosts.net:9911.
Не забудьте добавить разрешающее правило в брандмауэр!

......
//////
Для гиков. Установка из исходников (на данный момент версия 2.6):

$ tar xvfz DenyHosts-2.6.tar.gz
$ cd DenyHosts-2.6
# python setup.py install

После этого необходимо скопировать конфигурационный файл в каталог /etc:

# cp ./denyhosts.cfg-dist /etc/denyhosts.cfg

А также файл daemon-control-dist в /usr/sbin/daemon-control:

# cp ./daemon-control-dist /usr/sbin/daemon-control

Далее нужно открыть файл на редактирование /usr/sbin/daemon-control и внести изменение в несколько первых строк:

DENYHOSTS_BIN = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/etc/denyhosts.cfg"
PYTHON_BIN = "/usr/bin/env python"

Запуск:

# /usr/sbin/daemon-control start > /dev/hull &

......
//////

PS: Так как все блокировки основаны на hosts.deny, для использования на шлюзе имеет смысл парсить этот файл и блокировать с помощью iptables.

......
//////
Маленький нюанс, о котором хотел рассказать - вчера была новость про массовый взлом серверов на базе Linux, где сообщалось, что одному из пользователей удалось при помощи snoopy проанализировать действия злоумышленника, установившего бэкдор и почистившего логи, из его сообщения видно IP адрес откуда были совершены эти действия - 46.105.20.166.
После синхронизации denyhosts решил проверить, внесен ли этот IP адрес в их базу:

# cat /var/lib/denyhosts/sync-received | grep 46.105.20.166
46.105.20.166:Wed Feb 20 05:59:21 2013
46.105.20.166:Wed Feb 20 08:59:33 2013

Пожелания/критика/ругательства - принимаются :)
Похожие материалы:
Аватар Stas

Здравствуйте.
Подскажите/отправите почитать.
DENYHOST добавляет IP в файл hosts.deny и таким образом блокирует особо настырных. Т.е. блокируется INPUT. А как, и возможно ли, используя тот же список в hosts.deny закрыть и FORWARD? Т.е. поподбирали пароли - всего хорошего и в INPUT и в FORWARD. Спасибо

Аватар zenon

Да пожалуйста, скриптом обработай hots.deny, уже расписал подробно тут.
Также надо не забывать про эту наглядную картинку, чтобы понять на каком этапе надо применять блокировку:
4wdkf.png

Аватар Stas

Ага, с выборкой IP ясно, разобрался, спасибо.
А как можно заблокировать настырных и в INPUT и в FORWARD одним правилом? Возможно такое? Правильно ли использовать DROP в PREROUTING?
Спасибо.

Добавить комментарий