Антибрутофорс ssh

Я думаю, что у каждого возникала данная проблема, когда ваш сервер смотрит в мир и на нем открыт ssh, естественно его пытаются постоянно брутофорсить, то есть подобрать пароль и логин. И в прицепе ничего страшного в этом нет, но все же неприятно, нагружает сервер и мало ли, вдруг все же подберут. Вот и меня когда-то возникла данная проблема. Порыскав в инете, я наше достаточно хороший навесок на PAM — pam_abl, который по заверению авторов должен был избавить меня от данной проблемы. Данная программа при определенном количестве попыток вносит ip адресс нарушителя себе в базу, и в следующий раз когда он пытается войти в систему блокирует его. Установив и потестив ее, выяснилось, что в базу она ip вносит, но вот блокировать не хочет, может проблема была в CentOS может в програмке, но оно так и не заработало по полной. И тогда немного подумав, я решил дописать пару скриптов, так как база с ip нарушителей у нас есть, то можно ведь этих нарушителей внести в iptables.
Если вам ненужен открытый ssh порт на внешнем порту, вы его можете просто отключить, для этого надо зайти в /etc/ssh/sshd_config и отредактировать параметр ListenAddress

И так начнем:

yum install pam_abl

В файле /etc/security/pam_abl.conf

host_db=/var/lib/abl/hosts.db
# Количество дней на которые блокируется Хост
host_purge=5d
# Количество попыток за /1h или /1d после чего наступает блокировка данного хоста
host_rule=*:5/1h,10/1d

Для активации необходимо добавить в начале файла /etc/pam.d/sshd

auth required /lib/security/pam_env.so
auth required /lib/security/pam_abl.so config=/etc/security/pam_abl.conf
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so

Перезапускаем sshd

$service sshd restart

Для просмотра заблокированных хостов используется команда –

$pam_abl -rv /etc/security/pam_abl.conf

Протестируем pam_abl, введя 5 раз неверный пароль–

Reading config from /etc/security/pam_abl.conf
No user_db in /etc/security/pam_abl.conf
Failed hosts:
192.168.0.200 (1)
0/00:45:51

после чего хост занесен в базу pam_abl
Вот скрипт который будут смотреть в данную базу и делать соответствующие записи в iptables.

#!/bin/bash
#Задаем переменные
# define variables
chain_name="crackers"    //Имя цепочки в iptables
iptables=/sbin/iptables
is="/sbin/iptables-save"
abl_hostdb=/var/lib/abl/hosts.db    //Пусть к базе pam_abl
#Проверка доступа к iptables
# check access to iptables
if [ ! -x $iptables ]; then
echo "cannot execute iptables!"
echo "please correct iptables-variable in $0"
exit
fi
#Проверка наличия базы pam_abl
# check access to read-db-script
if [ ! -x $read_dbscript ]; then
echo "cannot execute read-db-script!"
echo "please correct read_dbscript-variable in $0"
exit
fi
#Проверка существования цепочки(в нашем случаи crackers)
# check if defined chain exist in current iptable-rules
if [ -z "`$iptables -n -L | grep -i "chain $chain_name"`" ]; then
echo "chain $chain_name is not defined in your iptable rules!"
echo "cannot add a rule into a non-existing chain. please update your iptables-config."
exit
fi
#Обнуление цепочки(если этого не делать, то у нас при каждом запуске скрипта будут возникать повторяющиеся правила)
#flush iptables
$iptables -t filter -F $chain_name
#добавление правил в цепочку crackers из базы pam_abl
# reload chain with actual crackers
for i in `/usr/sbin/pam_abl | grep -v hosts: | grep -v ocking | awk '{print $1}'`; do
$iptables -t filter -A $chain_name -s $i -j DROP
done
#Сохраняем iptables, что бы при перезагрузке не потерять созданных правил
# Saving iptables
$is > /etc/sysconfig/iptables

Добавляем самой первой в iptables в таблицу *filter

:crackers — [0:0]
-A INPUT –i внешний порт(как пример это может быть eth0) –j crackers

Теперь добавляем ранее созданный скрипт на автозапуск в crontab
Редактируем фаил /etc/crontab и добавляем там

*/5 * * * * root /usr/local/block/iptables-block

Запуск будет производиться каждые пять минут.

Второй скрипт присылает каждый день репорт с правилами добавленными в iptables за сутки, а также делает бекап iptables каждые сутки в папку ipdir в формате iptables-daily-$DATE
Вот текс скрипта:

#!/bin/bash
DATE=`date +'%m-%d-%Y'`
export DATE;
mail_to=ваш почтовый адресс
export mail_to;
host_name=`hostname`
export host_name
is="/sbin/iptables-save"
tmp="/tmp/"
ipdir="/usr/local/block/iptables"
ipdaily="$ipdir/iptables-daily-$DATE"
#Difference in configuration
#
$is > $ipdaily
if [ -a $tmp/iptables-yestarday ]
then
comm -3 $tmp/iptables-yestarday $ipdaily > $tmp/iptables.dif
# diff -U 4 $ipdaily $tmp/iptables-yestarday > $tmp/iptables.dif
$is > "$tmp/iptables-yestarday"
else
echo "Script runned first time $DATA" > $tmp/iptables.dif
$is > "$tmp/iptables-yestarday"
fi
#Mail notification about changes
if [ ! -s $TMPDIR/iptables.dif ]
then
(
cat $tmp/iptables.dif | mail -s "$DATE List of iptables chains with Bloked IP on $host_name last day" $mail_to
)
else
(
(cat $tmp/iptables.dif & echo "No new iptables chains") | mail -s "$DATE List of iptables chains with Bloked IP on $host_name last day" $mail_to
)

Добавляем данный скрипт в /etc/crontab

32 4 * * * root /usr/local/block/block-report-daily

Выполняется каждый день в 4:32 утра

Вот и все, проблем с брутофорсерами стало на много меньше 🙂

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>