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=""

 

Помогла заметка - поделись с другом:
    • neo
    • Июль 29th, 2013

    где еще пофлудить не знаю 😀 с праздником, хоть и немного запоздало 🙂 день админко прошел, но тем не менее

    • an0maly
    • Июль 2nd, 2013

    Да уж, давненько тебя не было видно 😀
    А ещё я первый раз аппрувлю камменты из лесов Карелии 🙂 🙂 🙂

    • neo
    • Июль 2nd, 2013

    давно меня тут не было :))
    добавлю про энту штуку немного, тоже некоторое время назад было принято категоричное решение ставить 🙂 на 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]
    вот и фсе

    жень, сделай теги?

  1. Октябрь 23rd, 2014

Оставьте эти два поля как есть:

 
Яндекс.Метрика