Увидев, с какой скорость перебирает пароли по http
прога WWWHack (http://www.wwwhack.com/),
я решил сделать какую нибудь защиту от этого.
Точно подходящего решения не нашлось,
зато выяснилось что блокировать лучше не юзеров,
т.к. в этом случае легко реализовать DoS атаку,
в результате которой заблокируются все юзеры :-((.
Лучше блокировать "подозрительные" IP-адреса.
Наиболее подошел для этого модуль SpeedLimit.pm
(http://www.modperl.com/book/source/wrapmod-code-1.02.tar.gz.),
который, проще говоря, ограничивает число http-запросов в единицу времени с
какого-либо ip-адреса.
Лучше бы найти модуль, который ограничивал бы число
именно неудачных аутентификаций с одного IP-адреса,
но за неимением лучшего........
Установил Perl5.005_03 на FreeBSD 2.2.6,
а SpeedLimit.pm требовал модуль IPC-Shareable-0.60, который требовал
Storable-1.0.11.
Пришлось установить и их.
Установил apache_1.3.19rusPL30.4:
./configure --activate-module=src/modules/perl/libperl.a \
--enable-shared=perl \
и mod_perl-1.25 как DSO:
perl Makefile.PL \
USE_APXS=1 \
WITH_APXS=/usr/local/apache/bin/apxs \
EVERYTHING=1 \
Фрагмент конфига Апача:
---------------------------------------
LoadModule perl_module libexec/libperl.so
PerlModule Apache::SpeedLimit.
Alias /perl/ /usr/local/apache/perl/
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On
allow from all
PerlAccessHandler Apache::SpeedLimit
PerlSetVar SpeedLimit 61
PerlSetVar SpeedSamples 20
PerlSetVar SpeedForgive 10
</Location>
---------------------------------------
Но SpeedLimit.pm не хочет работать:
$ httpd -t
Syntax error on line 282 of /usr/local/apache/conf/httpd.conf:
Undefined subroutine &IPC::SysV::SEM_UNDO called at
/usr/local/lib/perl5/site_perl/5.005/IPC/Shareable.pm line 45.
BEGIN failed--compilation aborted at
/usr/local/apache/lib/perl/Apache/SpeedLimit.pm line 6.
Т.е. mod_perl все-таки находит модуль IPC::SysV.
Однако, SEM_UNDO в нем встречается, но это уж точно не subroutine:
@EXPORT_OK = qw(
..........
SEM_A SEM_ALLOC SEM_DEST SEM_ERR SEM_ORDER SEM_R SEM_UNDO
........
)
После продолжительной переписки с автором IPC::Shareable
выяснилось, что дело якобы в эмуляции каких-то SysV-функций
через модуль IPC::SysV под моей FreeBSD 2.2.6:
> > Can I use IPC-Shareable on FreeBSD 2.2.6 at all?
> > Or only on SysV-ish OSes?
>
> It should work on FreeBSD; as far as I know it's supported SysV IPC for
> some time, and I've been in contact with people who have used it on
> FreeBSD.
>
> Perhaps SysV IPC isn't compiled into your kernel? Unfortunately, I don't
> use FreeBSD myself so I can't tell you how to find out.
Порывшись в директориях, я нашел
/usr/local/lib/perl5/5.00503/IPC/SysV.pm
/usr/local/lib/perl5/5.00503/i386-freebsd/auto/IPC/SysV/SysV.bs
/usr/local/lib/perl5/5.00503/i386-freebsd/auto/IPC/SysV/SysV.so
Все это включено в стандартный Perl 5.005_03
и должно работать!
Самое смешное:
Берем IPC-SysV-1.03, файлы из которого совпадают
по размеру с включенными в Perl 5.005_03.
После успешного make Makefile.pl делаю
---------------------------------------
$make
.....................
SysV.xs: In function `XS_IPC__Msg__stat_pack':
SysV.xs:69: storage size of `Perl_ds' isn't known
SysV.xs: In function `XS_IPC__Msg__stat_unpack':
SysV.xs:89: dereferencing pointer to incomplete type
SysV.xs:92: dereferencing pointer to incomplete type
SysV.xs:95: dereferencing pointer to incomplete type
SysV.xs:97: dereferencing pointer to incomplete type
SysV.xs:99: dereferencing pointer to incomplete type
SysV.xs:101: dereferencing pointer to incomplete type
SysV.xs:103: dereferencing pointer to incomplete type
SysV.xs:105: dereferencing pointer to incomplete type
SysV.xs:107: dereferencing pointer to incomplete type
SysV.xs:109: dereferencing pointer to incomplete type
SysV.xs:111: dereferencing pointer to incomplete type
SysV.xs:113: dereferencing pointer to incomplete type
SysV.xs:115: dereferencing pointer to incomplete type
SysV.xs:117: dereferencing pointer to incomplete type
SysV.xs: In function `XS_IPC__Semaphore__stat_unpack':
SysV.xs:135: dereferencing pointer to incomplete type
SysV.xs:138: dereferencing pointer to incomplete type
SysV.xs:140: arithmetic on pointer to an incomplete type
SysV.xs:140: dereferencing pointer to incomplete type
SysV.xs:141: arithmetic on pointer to an incomplete type
SysV.xs:141: dereferencing pointer to incomplete type
SysV.xs:142: arithmetic on pointer to an incomplete type
SysV.xs:142: dereferencing pointer to incomplete type
SysV.xs:143: arithmetic on pointer to an incomplete type
SysV.xs:143: dereferencing pointer to incomplete type
SysV.xs:144: arithmetic on pointer to an incomplete type
SysV.xs:144: dereferencing pointer to incomplete type
SysV.xs:145: arithmetic on pointer to an incomplete type
SysV.xs:145: dereferencing pointer to incomplete type
SysV.xs:146: arithmetic on pointer to an incomplete type
SysV.xs:146: dereferencing pointer to incomplete type
SysV.xs:147: arithmetic on pointer to an incomplete type
SysV.xs:147: dereferencing pointer to incomplete type
SysV.xs: In function `XS_IPC__Semaphore__stat_pack':
SysV.xs:158: storage size of `Perl_ds' isn't known
*** Error code 1
Stop.
---------------------------------------
Однако, я сам компилил и устанавливал Perl 5.005_03,
и мата насчет IPC::SysV не было!
Полез в сырец perl5.005_03/ext/IPC/SysV,
а сырцы этого модуля действительно отличаются!
Как минимум, make для него прошел без ошибок.
А "make test":
---------------------------------------
$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl -Iblib/arch -Iblib/lib
-I/usr/local/lib/perl5/5.00503/i386-freebsd -I/usr/local/lib/perl5/5.00503
-e 'use Test::Harness qw(&runtests $verbose); $verbose=0;
runtests @ARGV;' t/*.tt/msg...............
Can't load 'blib/arch/auto/IPC/SysV/SysV.so' for module IPC::SysV:
Undefined symbol "_ftok" in perl:blib/arch/auto/IPC/SysV/SysV.so
at /usr/local/lib/perl5/5.00503/i386-freebsd/DynaLoader.pm line 169.
at blib/lib/IPC/SysV.pm line 54
BEGIN failed--compilation aborted at t/msg.t line 1.dubious
Test returned status 255 (wstat 65280, 0xff00)
t/sem...............Can't load 'blib/arch/auto/IPC/SysV/SysV.so' for module
IPC:
:SysV: Undefined symbol "_ftok" in perl:blib/arch/auto/IPC/SysV/SysV.so at
/usr/
local/lib/perl5/5.00503/i386-freebsd/DynaLoader.pm line 169.
at blib/lib/IPC/SysV.pm line 54
BEGIN failed--compilation aborted at t/sem.t line 12.
dubious
Test returned status 255 (wstat 65280, 0xff00)
FAILED--2 test scripts could be run, alas--no output ever seen
*** Error code 2
Stop.
---------------------------------------
Итак (уф-ф!), вопрос:
Реально ли заставить этот модуль заработать,
или есть другие подходящие для сабжа
модули/настройки конфигов?
=============================================================================
= Apache-Rus@xxxxxxxxxxxxx mailing list =
Mail "unsubscribe apache-rus" to majordomo@xxxxxxxxxxxxx if you want to quit.
= Archive avaliable at http://www.lexa.ru/mail-archive =
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.