Есть 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 мин.
Может у кого аеть комментарии или мысли как с этим справиться...
>Есть 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();
}
>попробуй читать лог в реальном времени
>
>use IO::Handle;
>
>for (;;){
> open(LOGFILE, "<$watchfile");
> while (<LOGFILE>) {
> ...
> ...
> ...
> }
> sleep(1);
> LOGFILE->clearerr();
>}:) Может так и надо, только как его запустить ? (прошу прощения за глупый вопрос) С автозагрузки ? Если я его запущу в шелле, он просто будет крутиться на сервере, но шелл надо будет закрыть и скрипт остановится :(
P.S. До таких тонкостей я ещё не разбирался...
>>попробуй читать лог в реальном времени
>>
>>use IO::Handle;
>>
>>for (;;){
>> open(LOGFILE, "<$watchfile");
>> while (<LOGFILE>) {
>> ...
>> ...
>> ...
>> }
>> sleep(1);
>> LOGFILE->clearerr();
>>}
>
>:) Может так и надо, только как его запустить ? (прошу прощения
>за глупый вопрос) С автозагрузки ? Если я его запущу в
>шелле, он просто будет крутиться на сервере, но шелл надо будет
>закрыть и скрипт остановится :(
>P.S. До таких тонкостей я ещё не разбирался...
./script.pl &
он уйдет в background и будет щасте ;]
>./script.pl &
>он уйдет в background и будет щасте ;]Отличная идея :)
Проблема была в следующем:
У меня правило 340 - разрешает все ssh, а 65500 запрещает -> до этого правила дело не доходит.
>>./script.pl &
>>он уйдет в background и будет щасте ;]
>
>Отличная идея :)
>Проблема была в следующем:
>У меня правило 340 - разрешает все ssh, а 65500 запрещает -> до этого правила дело не доходит.
правильнее было в sshd.config добавить:
AllowUsers user1 user2
#только для правильных users