SSHGuard. Защита от брутфорса.
SSHGuard — небольшая программа, внимательно наблюдающая за журналами и, в случае обнаружения попыток перебора паролей на известных ей сервисах, блокирующая атакующего средствами фаервола. Очень полезна, как мне кажется.
Рассмотрим установку и настройку на примере сервера под CentOS Linux 6, фаервол — iptables.
Итак, скачиваем с оффсайта исходный код. Распаковываем, конфигурируем и собираем:
sudo ./configure --with-firewall=iptables sudo make && make install
Я на этом этапе ещё и слегка изменил исходники, чтоб sshguard при старте не выводил мне в консоль все правила iptables 🙂 :
src/fwalls/command_iptables.h
#define COMMAND_INIT "iptables -L"
меняем на
#define COMMAND_INIT "iptables -L 1>/dev/null"
Делать это надо, естественно, до конфигурации и сборки 🙂
Теперь необходимо создать в iptables цепочку с именем sshguard:
sudo iptables -N sshguard subo ip6tables -N sshguard
Если мы хотим блокировать весь трафик от хостов, попавших в банлист, то:
sudo iptables -A INPUT -j sshguard sudo ip6tables -A INPUT -j sshguard
Если только ssh, то:
sudo iptables -A INPUT -p tcp -m tcp --dport 22 -j sshguard sudo ip6tables -A INPUT -p tcp -m tcp --dport 22 -j sshguard
Или, если мы хотим работать с несколькими сервисами, то:
iptables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143 -j sshguard ip6tables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143 -j sshguard
Ну и сохраним изменения:
sudo iptables-save > /etc/sysconfig/iptables sudo ip6tables-save > /etc/sysconfig/ip6tables
Здесь предполагается, что у нас используются IPv4 и IPv6. Если используется только IPv4, то все строки с ip6tables нам не нужны.
Мы, как никогда близки к развязке :), осталось только запустить sshguard:
/usr/local/sbin/sshguard -l /var/log/secure
параметр -l говорит sshguard какой журнал читать, их может быть несколько и выглядит это примерно так:
/usr/local/sbin/sshguard -l /var/log/secure -l /var/log/messages
Всё. Оно работает. После первых 4 (по умолчанию) попыток атакующий блокируется на 10 минут, потом блокировка снимается. После повторной попытки — на 20 и далее по экспоненте.
Но после перезагрузки надо запускать всё это заново. Поэтому, создадим файлик
/etc/rc.d/init.d/sshguard
#! /bin/sh # # chkconfig: 2345 90 25 # ### BEGIN INIT INFO # Provides: $sshguard # Required-Start: $syslog # Default-Start: 2 3 4 5 # Short-Description: starting and stoppning SSHGuard Daemon # Description: Sshguard is a small program that monitors services running \ # on your machine from the log files. When it detects that someone is \ # doing something bad to a service, sshguard blocks the IP address of \ # the bad guy with a firewall rule.\ # Project page http://www.sshguard.net\ # Startup script by an0maly.andr@gmail.com # #Source function library. . /etc/init.d/functions D_PATH="/usr/local/sbin/sshguard" LOGFILES=(/var/log/secure) PIDFILE="/var/run/sshguard.pid" PROG="SSHGuard" OPTIONS="-a 5 -w 127.0.0.1" LOGSUCKER_OPT="" check() { status $D_PATH } start() { echo -n $"Starting $PROG: " if [ -f $PIDFILE ]; then echo -n "$PROG already started" echo_failure echo else for lfl in ${LOGFILES[@]}; do if [ ! -f $lfl ]; then echo -n "$lfl not found!" else LOGSUCKER_OPT="$LOGSUCKER_OPT -l $lfl" fi; done $D_PATH $LOGSUCKER_OPT $OPTIONS -i $PIDFILE 2>/dev/null & sleep 2 if [ -f $PIDFILE ]; then echo_success else echo_failure fi; echo return fi; } stop() { echo -n $"Stopping $PROG: " killproc -p $PIDFILE echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) check ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart|status}" ;; esac exit $RETVAL
вот здесь можно его скачать. sshguard (UPD. Чтобы привести этот файл в вид, не вызывающий отторжение у операционной системы — воспользуемся советом из этой заметки)
выполним
sudo chkconfig sshguard on sudo service sshguard start
и будем наслаждаться жизнью.
ПС. Небольшое дополнение по переменным в стартовом скрипте.
D_PATH — полный путь к программе
D_PATH="/usr/local/sbin/sshguard
LOGFILES — массив обрабатываемых журналов, через пробел
LOGFILES=(/var/log/secure /var/log/messages /path/to/log)
PIFILE — Файл с идентификатором процесса
PIDFILE="/var/run/sshguard.pid"
OPTIONS — дополнительные опции sshguard, смотреть которые нужно здесь sshguard —help 🙂
OPTIONS="-a 5 -w 127.0.0.1"
LOGSUCKER_OPT — служебная переменная, должна быть пустой
LOGSUCKER_OPT=""
где еще пофлудить не знаю 😀 с праздником, хоть и немного запоздало 🙂 день админко прошел, но тем не менее
Да уж, давненько тебя не было видно 😀
А ещё я первый раз аппрувлю камменты из лесов Карелии 🙂 🙂 🙂
давно меня тут не было :))
добавлю про энту штуку немного, тоже некоторое время назад было принято категоричное решение ставить 🙂 на FreeBSD это дело выглядит немного подругому и на мое скромное о даже несколько попроще:
[cc lang=»bash»]
# cd /usr/ports/security/sshguard
# make install clean
[/cc]
ну а дальше нужно просто почитать, что говорит порт в конце установки, а именно о том, что нам сделали файл
[cc lang=»bash»]
Sshguard is going to use /etc/hosts.allow, I have touched it for you.
[/cc]
в конфиге ничего примечательно сложного нет, строки на манер:
[cc lang=»bash»]
ALL : ALL : allow
sendmail : ALL : allow
[/cc]
и уточнение в самом начале # The rules here work on a «First match wins» basis. говорят сами за себя.
и добавили нам строку в syslog.con, которую мы пойдем и раскомментим
[cc lang=»bash»]
#auth.info;authpriv.info |exec /usr/local/sbin/sshguard
[/cc]
добавляем в /etc/rc.conf
[cc lang=»bash»]
sshguard_enable=»YES»
[/cc]
и пишем в командную строку
[cc lang=»bash»]
# /usr/local/etc/rc.d/sshguard start
[/cc]
вот и фсе
жень, сделай теги?