Существуют такие ситуации, когда сервис SSH должен быть открыт для всего интернета, а не только для определённых адресов. Однако в этом случае большинство системных администраторов сталкивается с проблемой перебора паролей. Так называемой брутфорс-атакой. Это явление не столько опасное (хотя конечно же недооценивать опасность не стоит), сколько просто неприятное. Однако решение у этой проблемы есть, и даже не одно.
Существует множество различных скриптов, принцип работы которых одинаков: анализируется лог авторизации, и закрывается доступ к серверу с IP-адресов, с которых было несколько неудачных попыток авторизации в течении короткого времени. В этой статье будет описан один из них - blocksshd, который представляет собой демона, написанного на perl, и имеющего достаточно гибкую конфигурацию. Всё написанное справедливо для дистрибутива Gentoo Linux. Для других дистрибутивов инструкции могут немного отличаться.
Итак. Само собой для начала нужно установить blocksshd:
emerge layman layman --add sunrise emerge blocksshd
Далее копируем пример файла конфигурации как /etc/blocksshd/blocksshd.conf и открываем в редакторе:
cp /etc/blocksshd/blocksshd.conf.sample /etc/blocksshd/blocksshd.conf nano -w /etc/blocksshd/blocksshd.conf
Интересных параметров тут достаточно много. Например по умолчанию логом авторизации считается файл /var/log/messages. Если же вы настроили syslog так, чтобы логи авторизации складывались в другой файл, например /var/log/auth.log, то вам нужно соответствующим образом подправить эту строку:
logfile => '/var/log/auth.log',
Далее нам нужно ограничить максимальное количество неудачных попыток авторизации. По умолчанию оно равно четырём. Лучше уменьшить до трёх или даже до двух:
max_attempts => '2',
Далее разрешим "разбанивать" заблокированные адреса по истечении unblock_timeout:
unblock => '1',
Кроме того есть интересная пара параметров: send_email и email. Если первый установлен в 1, то отправляется письмо на адрес, указанный во втором. Мой мобильный оператор предоставляет услугу отправки SMS через e-mail. Т.е. если отправить e-mail на адрес: <мой_номер_телефона>@<мой_оператор.ru>, то мне приходит SMS. Именно этим я и воспользовался, но поскольку по умолчанию в письмо добавляется так же вывод whois для блокируемого IP-адреса, который имеет достаточно большой размер и потому не всегда помещается в одну SMS, то можно отключить отправку whois на e-mail:
email_whois_lookup => '0',
Можно так же не отключать whois, но вместо него использовать какую-то другую программу. Например иногда достаточно получить вывод команды nslookup. Это делается так:
email_whois_lookup => '1', whois => '/usr/bin/nslookup',
Кроме того вы можете изменить имя цепочки правил iptables, которую использует blocksshd:
chain => 'blocksshd',
Закончив конфигурирование запускаем демон:
rc-update add default /etc/init.d/blocksshd start
Но это ещё не всё. Далее нужно настроить iptables. Сейчас мы будем исходить из того, что у вас разрешения строятся по принципу "ничего кроме...". Если у вас не так - мне вас жаль.
Итак. В вашем скрипте установки правил iptables должна быть примерно такая строка:
iptables -A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
Перед этой строкой нужно добавить ещё несколько строк. Должно получится примерно вот так:
# Удаляем цепочку blocksshd iptables -X blocksshd # Инициализируем пустую цепочку blocksshd iptables -N blocksshd # Проверяем не входит ли IP в цепочку blocksshd iptables -I INPUT -m tcp -p tcp --dport 22 -j blocksshd # Разрешаем SSH для всех (исходная строка) iptables -A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
Далее применяем новые правила iptables и сохраняем их:
/etc/init.d/iptables save
Всё. Теперь брутфорс-атаки вам не так страшны, как ещё полчаса назад:)
Очень надеюсь что вам пригодится эта статья, но не обещаю что всё будет именно так, как тут написано:)
d_xaos 2007-12-19 15:40:48 (#)