URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID10
Нить номер: 2886
[ Назад ]

Исходное сообщение
"Вопрос по ведению лога auth.log"

Отправлено StainlessRat , 06-Сен-06 10:07 
Есть FreeBSD, перелопатил один скрипт из журнала "Системный администратор" (кривой он был и не рабочий)
#!/usr/bin/perl -w
#use Sys::Syslog;

$max=           10;
$watchfile=     '/var/log/auth.log';
$ipfw=          '/sbin/ipfw';
$ipfw_list=     '/var/tmp/ipfw.list';
$num_rule=      65500;
$my_ip=         '111.111.111.111'; # Мой внешний IP

%tries=();
%blocked=();

`$ipfw list $num_rule > $ipfw_list`;

open(IPFWLIST, "<$ipfw_list");
while (<IPFWLIST>){
    $blocked{$1}=1 if (/(\d+\.\d+\.\d+\.\d+)/);
}
close IPFWLIST;

open(LOGFILE, "<$watchfile");
while (<LOGFILE>) {
    if (/sshd\[\d+\]: Failed password for .+ from (\d+\.\d+\.\d+\.\d+) port/) {
        $ip=$1;
        next if defined($blocked{$ip});
        $tries{$ip}+=1;
        if ($tries{$ip} eq $max){
            `$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
            $blocked{$ip}=1;
#           syslog('warning', "IP $ip has been blocked !");
        }
    }
    if (/sshd\[\d+\]: Illegal user .+ from (\d+\.\d+\.\d+\.\d+)/) {
        $ip=$1;
        next if defined($blocked{$ip});
        $tries{$ip}+=1;
        if ($tries{$ip} eq $max){
            `$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
            $blocked{$ip}=1;
#           syslog('warning', "IP $ip has been blocked !");
        }
    }
}
close(LOGFILE);

Юзайте, может кому пригодится ;)
Смысл прост. Смотрим лог auth.log, если встречается попытка подбора пароля более 10 раз, то в ipwf добавляется правило типа (для примера)
ipfw add 65500 deny tcp from 212.191.6.130 to 111.111.111.111 ssh
И так каждые 11 минут через крон :)
Только есть недостаток :( такое впечатление, что в auth.log пишется всё с задержкой и мой скрипт опаздывает, если атака идёт на протяжении 15-20 мин.
Может у кого аеть комментарии или мысли как с этим справиться...


Содержание

Сообщения в этом обсуждении
"Вопрос по ведению лога auth.log"
Отправлено Gabber , 06-Сен-06 12:57 
>Есть FreeBSD, перелопатил один скрипт из журнала "Системный администратор" (кривой он был
>и не рабочий)
>#!/usr/bin/perl -w
>#use Sys::Syslog;
>
>$max=           10;
>
>$watchfile=     '/var/log/auth.log';
>$ipfw=          '/sbin/ipfw';
>$ipfw_list=     '/var/tmp/ipfw.list';
>$num_rule=      65500;
>$my_ip=         '111.111.111.111'; # Мой
>внешний IP
>
>%tries=();
>%blocked=();
>
>`$ipfw list $num_rule > $ipfw_list`;
>
>open(IPFWLIST, "<$ipfw_list");
>while (<IPFWLIST>){
>    $blocked{$1}=1 if (/(\d+\.\d+\.\d+\.\d+)/);
>}
>close IPFWLIST;
>
>open(LOGFILE, "<$watchfile");
>while (<LOGFILE>) {
>    if (/sshd\[\d+\]: Failed password for .+ from (\d+\.\d+\.\d+\.\d+)
>port/) {
>        $ip=$1;
>        next if defined($blocked{$ip});
>        $tries{$ip}+=1;
>        if ($tries{$ip} eq $max){
>
>            
>`$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
>            
>$blocked{$ip}=1;
>#           syslog('warning',
>"IP $ip has been blocked !");
>        }
>    }
>    if (/sshd\[\d+\]: Illegal user .+ from (\d+\.\d+\.\d+\.\d+)/) {
>
>        $ip=$1;
>        next if defined($blocked{$ip});
>        $tries{$ip}+=1;
>        if ($tries{$ip} eq $max){
>
>            
>`$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
>            
>$blocked{$ip}=1;
>#           syslog('warning',
>"IP $ip has been blocked !");
>        }
>    }
>}
>close(LOGFILE);
>
>Юзайте, может кому пригодится ;)
>Смысл прост. Смотрим лог auth.log, если встречается попытка подбора пароля более 10
>раз, то в ipwf добавляется правило типа (для примера)
>ipfw add 65500 deny tcp from 212.191.6.130 to 111.111.111.111 ssh
>И так каждые 11 минут через крон :)
>Только есть недостаток :( такое впечатление, что в auth.log пишется всё с
>задержкой и мой скрипт опаздывает, если атака идёт на протяжении 15-20
>мин.
>Может у кого аеть комментарии или мысли как с этим справиться...


попробуй читать лог в реальном времени

use IO::Handle;

for (;;){
    open(LOGFILE, "<$watchfile");
    while (<LOGFILE>) {
    ...
    ...
    ...
    }
    sleep(1);
    LOGFILE->clearerr();
}


"Вопрос по ведению лога auth.log"
Отправлено StainlessRat , 06-Сен-06 14:57 
>попробуй читать лог в реальном времени
>
>use IO::Handle;
>
>for (;;){
>    open(LOGFILE, "<$watchfile");
>    while (<LOGFILE>) {
>    ...
>    ...
>    ...
>    }
>    sleep(1);
>    LOGFILE->clearerr();
>}

:) Может так и надо, только как его запустить ? (прошу прощения за глупый вопрос) С автозагрузки ? Если я его запущу в шелле, он просто будет крутиться на сервере, но шелл надо будет закрыть и скрипт остановится :(
P.S. До таких тонкостей я ещё не разбирался...


"Вопрос по ведению лога auth.log"
Отправлено Gabber , 06-Сен-06 15:02 
>>попробуй читать лог в реальном времени
>>
>>use IO::Handle;
>>
>>for (;;){
>>    open(LOGFILE, "<$watchfile");
>>    while (<LOGFILE>) {
>>    ...
>>    ...
>>    ...
>>    }
>>    sleep(1);
>>    LOGFILE->clearerr();
>>}
>
>:) Может так и надо, только как его запустить ? (прошу прощения
>за глупый вопрос) С автозагрузки ? Если я его запущу в
>шелле, он просто будет крутиться на сервере, но шелл надо будет
>закрыть и скрипт остановится :(
>P.S. До таких тонкостей я ещё не разбирался...


./script.pl &
он уйдет в background и будет щасте ;]


"Вопрос по ведению лога auth.log"
Отправлено StainlessRat , 08-Сен-06 10:26 
>./script.pl &
>он уйдет в background и будет щасте ;]

Отличная идея :)
Проблема была в следующем:
У меня правило 340 - разрешает все ssh, а 65500 запрещает -> до этого правила дело не доходит.


"Вопрос по ведению лога auth.log"
Отправлено kvk , 19-Сен-06 18:03 
>>./script.pl &
>>он уйдет в background и будет щасте ;]
>
>Отличная идея :)
>Проблема была в следующем:
>У меня правило 340 - разрешает все ssh, а 65500 запрещает -> до этого правила дело не доходит.


правильнее было в sshd.config добавить:
AllowUsers user1 user2
#только для правильных users