среда, 9 сентября 2009 г.

Защита ssh в debian с помощью denyhosts

Denyhosts - это скрипт, написанный на Python для защиты[в основном] SSH серверов от переборов паролей[брутфорса].Скрипт отслеживает логи системы о неудачных авторизациях и после того, как N-раз был неверно введена связка "логин-пароль" блокирует IP-адрес, с которого производилась атака[Банально вносит IP-адрес в /etc/hosts.deny].

Я покажу как за несколько минут защитить сервер от подбора паролей[знаю, что тема избитая, но решил написать для людей, кому не интересно долго ковыряться в настройках]. Итак, у вас уже должен быть установлен python. Если нет то устанавливаем:
apt-get install python
Скачиваем сам скрипт [На момент написания заметки версия 2.6].
wget http://sourceforge.net/projects/denyhosts/files/denyhosts/2.6/DenyHosts-2.6.tar.gz/download
Дальше распаковываем архив, заходим в него и запускаем процесс установки[из под root]:
$ 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
После того как все удачно завершилось переходим к конфигурированию /etc/denyhosts.cfg. Т.к. статья расчитана на "немного ленивых админов"[сам из таких =)], то я сразу прикладываю нужный вам конфиг:
debian:/# cat ./denyhosts.cfg
SECURE_LOG = /var/log/auth.log
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY =
BLOCK_SERVICE = sshd
DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID = 10
DENY_THRESHOLD_ROOT = 1
DENY_THRESHOLD_RESTRICTED = 1
WORK_DIR = /usr/share/denyhosts/data
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=YES
LOCK_FILE = /var/run/denyhosts.pid
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
Далее нужно открыть файл на редактирование /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"
Теперь просто стартуем наш denyhosts следующей командой и прописать эту же команду в автозагрузку например в /etc/rc.local:
/usr/sbin/daemon-control start > /dev/hull &
Через некоторое время у вас в файле начнут появляться заблокированные IP-адреса, с которых 5 раз[параметр DENY_THRESHOLD_INVALID = 5] был введены логин с паролем.

Замечательная автошкола приглашает всех желающих пройти курсы вождения.

7 комментариев:

JackYF комментирует...

Но denyhosts имеется в репозитории, начиная с oldstable (etch). Зачем ставить из исходников?

vkapas комментирует...

Для бана по IP после n-количества неудачных авторизаций есть замечательный fail2ban. Можно настраивать время бана, максимальное количество неудачных логинов и многое другое.
Есть в репозитории Debian.

Описание: bans IPs that cause multiple authentication errors
Monitors log files (e.g. /var/log/auth.log, /var/log/apache/access.log) and temporarily or persistently bans failure-prone
addresses by updating existing firewall rules. The software was completely rewritten at version 0.7.0 and now allows easy
specification of different actions to be taken such as to ban an IP using iptables or hostsdeny rules, or simply to send a
notification email. Currently, by default, supports ssh/apache/vsftpd but configuration can be easily extended for
monitoring any other ASCII file. All filters and actions are given in the config files, thus fail2ban can be adopted to be
used with a variety of files and firewalls.
Сайт: http://www.fail2ban.org

yurmax комментирует...

тоже хотел про fail2ban сказать по ходу читания статьи.
там еще и бан по другим сервисам можно ставить, не только от перебора по ssh а еще и по почтовым портам, ftp. вобщем дельная штука.

Никита комментирует...

Спасибо. Обязательно посмотрю

Triaklodis комментирует...
Этот комментарий был удален автором.
Triaklodis комментирует...

Зачем придумывать велосипед?
iptables с етим хорошо справляется (только нужно чтоб в ядре recent (ipt_recent) был включен) в дефолтных ядрах он включен, 2.6.30+ которые сам компилиш выключен по умолчанию


==================
iptables -N ssh_brute_check # Создаем цепочку для проверки попыток соединений на защищаемый порт
# Если за последние 10 минут (600 секунд) с одного адреса было 3 или более новых соединений — блокируем этот адрес
iptables -A ssh_brute_check -m recent --update --seconds 600 --hitcount 3 -j DROP
# В противном случае — разрешаем, и при этом заносим в список
iptables -A ssh_brute_check -m recent --set -j ACCEPT
iptables -F INPUT # Очищаем цепочку INPUT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешаем пакеты по установленным соединениям
# Все попытки открыть новое соединение по SSH направляем на проверку
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ssh_brute_check
# Здесь можно разрешать те порты, для которых такая проверка не нужна. Например, HTTP
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP # Что не разрешено — то запрещено
===================

Unknown комментирует...

Спасибо всё работает :)
Но во как бы ещё сделать что бы он не банил локальные айпи а только внешку