Этот будет немного попроще чем предыдущий, но не менее эффективный.
Первое что мы сделаем это немного поднастроем ssh, для этого заходим в /etc/ssh/sshd_config и уменьшим количество неавторизированных сессий и количество попыток в каждой сессии:
MaxAuthTries 2
MaxStartups 3
Добавим правило в iptables, которое уменьшит количество возможных попыток аутентификации на 22 порту до 5 в минут:
iptables -A INPUT -p tcp —dport 22 -m recent —name ssh —set -j ACCEPT
Так же добавим сразу ветку crackers, она прегодиться нам позднее, сюда мы будем вносить IP адреса нарушителей. Если предположить что eth0 это ваш внешний IP, то выполняем такие команды:
iptables -A INPUT -i eth0 -j crackers
Перезапускаем iptables
И в завершении добавим вот такие скрипты, который будет парсить наш лог «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