Еще один антибрутофорс SSH

Этот будет немного попроще чем предыдущий, но не менее эффективный.

Первое что мы сделаем это немного поднастроем ssh, для этого заходим в /etc/ssh/sshd_config и уменьшим количество неавторизированных сессий и количество попыток в каждой сессии:

LoginGraceTime 30 # 30 sec
MaxAuthTries 2
MaxStartups 3

Добавим правило в iptables, которое уменьшит количество возможных попыток аутентификации на 22 порту до 5 в минут:

iptables -A INPUT -p tcp —dport 22 -m recent —name ssh —update —seconds 3600 —hitcount 5 -j REJECT
iptables -A INPUT -p tcp —dport 22 -m recent —name ssh —set -j ACCEPT

Так же добавим сразу ветку crackers, она прегодиться нам позднее, сюда мы будем вносить IP адреса нарушителей. Если предположить что eth0 это ваш внешний IP, то выполняем такие команды:

iptables -N crackers
iptables -A INPUT -i eth0 -j crackers

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

service iptables restart

И в завершении добавим вот такие скрипты, который будет парсить наш лог «secure» и выявлять нарушителей. Скрипт secure.sh это основа, он проводит парсинг и в случа выявления нарушителей с количеством попыток больше заданных помещает его IP в iptables в ветку crackers. Скрипт можно выполнить в двух режимах, для последнего часа и для прошлого дня, для этого запустите его с опциями day или hours. Параметры COUNT_D количество попыток за день, COUNT_H в час, если параметр SEND_MAIL равен 1, то будет выслан небольшой отчет.

#!/bin/bash
#If u wish to recive mail then 1, if u dont then 0
SEND_MAIL=1
COUNT_D=3
COUNT_H=5

case "$1" in

help)
echo "help - Help"
echo "day - Day report"
echo "houre - Houre report"
;;

day)
sh log.sh day
declare -a IP
i=0
while read LINE
do
IP[$i]=`echo $LINE | grep 'Failed password for' | awk '{split($0,a,"from "); print a[2]}'| awk '{print $1}'|awk '{split($0,a,":"); print a[4]}'`
i=$[$i+1]
done < tmp_file

for item in ${IP[*]}
do
echo $item'n' >> TMP_n
echo $item >> TMP
done
cat TMP_n |sort|uniq >> ip_n

while read LINE
do
FCOUNT=`cat TMP_n|grep "$LINE"|wc -l`
IP_TRUE=`echo $LINE|awk '{split($0,a,"n"); print a[1]}'`
if [ $FCOUNT -gt $COUNT_D ]; then
iptables -A crackers -s $IP_TRUE -j DROP
fi
echo "$IP_TRUE $FCOUNT" >> ip.count
done < ip_n
rm -f tmp_file
rm -f TMP_n
rm -f ip_n
rm -f TMP

if [ $SEND_MAIL -eq 1 ];then
sh mail.sh
fi
;;

hours)
sh log.sh hours
declare -a IP
i=0
while read LINE
do
IP[$i]=`echo $LINE | grep 'Failed password for' | awk '{split($0,a,"from "); print a[2]}'| awk '{print $1}'|awk '{split($0,a,":"); print a[4]}'`
i=$[$i+1]
done < tmp_file
for item in ${IP[*]}
do
echo $item'n' >> TMP_n
echo $item >> TMP
done
cat TMP_n |sort|uniq >> ip_n

while read LINE
do
FCOUNT=`cat TMP_n|grep "$LINE"|wc -l`
IP_TRUE=`echo $LINE|awk '{split($0,a,"n"); print a[1]}'`
if [ $FCOUNT -gt $COUNT_H ]; then
iptables -A crackers -s $IP_TRUE -j DROP
fi
echo "$IP_TRUE $FCOUNT" >> ip.count
done < ip_n
rm -f TMP_n
rm -f ip_n
rm -f TMP

rm -f tmp_file ;;
*)
echo "help|day|houre"
exit 1
;;

esac
exit 0

Второй скрипт — log.sh, он создает логи:

#!/bin/bash

case "$1" in
day)
zcat /var/log/secure.1.gz > today
zcat /var/log/secure.2.gz > yestarday
DATE=`date +'%e' --date='1 days ago'`
while read LINE
do
TODAY=`echo $LINE|awk '{print $2}'`
if [ $TODAY == $DATE ]
then
echo $LINE >> tmp_file
fi
done < yestarday
while read LINE2
do
TODAY2=`echo $LINE2|awk '{print $2}'`
if [ $TODAY2 == $DATE ]
then
echo $LINE2 >> tmp_file
fi
done < today
rm -f today
rm -f yestarday
;;

hours)
cp /var/log/secure today
zcat /var/log/secure.1.gz > yestarday

 

NOW=`date +'%e %T ' --date='-1 hours'|awk '{split($0,a,":"); print a[1]}'`

while read LINE
do
echo $LINE |grep "$NOW"
if [ $? -eq 0 ]
then
echo $LINE >> tmp_file
fi
done < yestarday

while read LINE
do
echo $LINE |grep "$NOW" &> /dev/null
if [ $? -eq 0 ]
then
echo $LINE >> tmp_file
fi
done < today

rm -f today
rm -f yestarday
rm -f tmp_line
;;

*)
echo "day|hours"
exit 1
;;

esac
exit 0

И последний — mail.sh, он формирует письмо и отсылает его на указанный email, вам необходимо поправить параметры MAIL — куда слать и USER — от кого слать

#!/bin/bash
#Send mail
USER=root
[email protected]
HOST=`hostname -f`
DATE=`date +'%m-%d-%Y'`
(echo "To: $MAIL"
echo "Subject: $DATE: Brute Force Report for $HOST"
echo "Precedence: bulk"
echo ""
cat "ip.count") | sudo -u $USER -H sendmail -t

Все что осталось сделать это добавить в cron

0 20 * * * sh /path/to/script.sh day

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>