mirror of https://github.com/fail2ban/fail2ban
commit
93125ae6ac
19
CHANGELOG
19
CHANGELOG
|
@ -4,9 +4,26 @@
|
||||||
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
||||||
|
|
||||||
=============================================================
|
=============================================================
|
||||||
Fail2Ban (version 0.7.5) 2006/12/07
|
Fail2Ban (version 0.7.6) 2007/01/04
|
||||||
=============================================================
|
=============================================================
|
||||||
|
|
||||||
|
ver. 0.7.6 (2007/01/04) - beta
|
||||||
|
----------
|
||||||
|
- Added a "sleep 1" in redhat-initd. Thanks to Jim Wight
|
||||||
|
- Use /dev/log for SYSLOG output. Thanks to Joerg Sommrey
|
||||||
|
- Use numeric output for iptables in "actioncheck"
|
||||||
|
- Fixed removal of host in hosts.deny. Thanks to René Berber
|
||||||
|
- Added new date format (2006-12-21 06:43:20) and Exim4
|
||||||
|
filter. Thanks to mEDI
|
||||||
|
- Several "failregex" and "ignoreregex" are now accepted.
|
||||||
|
Creation of rules should be easier now.
|
||||||
|
- Added license in COPYING. Thanks to Axel Thimm
|
||||||
|
- Allow comma in action options. The value of the option must
|
||||||
|
be escaped with " or '. Thanks to Yaroslav Halchenko
|
||||||
|
- Now Fail2ban goes in /usr/share/fail2ban instead of
|
||||||
|
/usr/lib/fail2ban. This is more compliant with FHS. Thanks
|
||||||
|
to Axel Thimm and Yaroslav Halchenko
|
||||||
|
|
||||||
ver. 0.7.5 (2006/12/07) - beta
|
ver. 0.7.5 (2006/12/07) - beta
|
||||||
----------
|
----------
|
||||||
- Do not ban a host that is currently banned. Thanks to
|
- Do not ban a host that is currently banned. Thanks to
|
||||||
|
|
|
@ -0,0 +1,339 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
2
PKG-INFO
2
PKG-INFO
|
@ -1,6 +1,6 @@
|
||||||
Metadata-Version: 1.0
|
Metadata-Version: 1.0
|
||||||
Name: fail2ban
|
Name: fail2ban
|
||||||
Version: 0.7.5
|
Version: 0.7.6
|
||||||
Summary: Ban IPs that make too many password failure
|
Summary: Ban IPs that make too many password failure
|
||||||
Home-page: http://fail2ban.sourceforge.net
|
Home-page: http://fail2ban.sourceforge.net
|
||||||
Author: Cyril Jaquier
|
Author: Cyril Jaquier
|
||||||
|
|
11
README
11
README
|
@ -4,7 +4,7 @@
|
||||||
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
||||||
|
|
||||||
=============================================================
|
=============================================================
|
||||||
Fail2Ban (version 0.7.5) 2006/12/07
|
Fail2Ban (version 0.7.6) 2007/01/04
|
||||||
=============================================================
|
=============================================================
|
||||||
|
|
||||||
Fail2Ban scans log files like /var/log/pwdfail and bans IP
|
Fail2Ban scans log files like /var/log/pwdfail and bans IP
|
||||||
|
@ -28,11 +28,11 @@ Optional:
|
||||||
|
|
||||||
To install, just do:
|
To install, just do:
|
||||||
|
|
||||||
> tar xvfj fail2ban-0.7.5.tar.bz2
|
> tar xvfj fail2ban-0.7.6.tar.bz2
|
||||||
> cd fail2ban-0.7.5
|
> cd fail2ban-0.7.6
|
||||||
> python setup.py install
|
> python setup.py install
|
||||||
|
|
||||||
This will install Fail2Ban into /usr/lib/fail2ban. The
|
This will install Fail2Ban into /usr/share/fail2ban. The
|
||||||
executable scripts are placed into /usr/bin.
|
executable scripts are placed into /usr/bin.
|
||||||
|
|
||||||
Gentoo: ebuilds are available on the website.
|
Gentoo: ebuilds are available on the website.
|
||||||
|
@ -72,7 +72,8 @@ Kévin Drapel, Marvin Rouge, Sireyessire, Robert Edeker,
|
||||||
Tom Pike, Iain Lea, Andrey G. Grozin, Yaroslav Halchenko,
|
Tom Pike, Iain Lea, Andrey G. Grozin, Yaroslav Halchenko,
|
||||||
Jonathan Kamens, Stephen Gildea, Markus Hoffmann, Mark
|
Jonathan Kamens, Stephen Gildea, Markus Hoffmann, Mark
|
||||||
Edgington, Patrick Börjesson, kojiro, zugeschmiert, Tyler,
|
Edgington, Patrick Börjesson, kojiro, zugeschmiert, Tyler,
|
||||||
Nick Munger, Christoph Haas, Justin Shore, Joël Bertrand
|
Nick Munger, Christoph Haas, Justin Shore, Joël Bertrand,
|
||||||
|
René Berber, mEDI, Axel Thimm
|
||||||
|
|
||||||
License:
|
License:
|
||||||
--------
|
--------
|
||||||
|
|
4
TODO
4
TODO
|
@ -4,7 +4,7 @@
|
||||||
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
||||||
|
|
||||||
=============================================================
|
=============================================================
|
||||||
ToDo $Revision: 468 $
|
ToDo $Revision: 509 $
|
||||||
=============================================================
|
=============================================================
|
||||||
|
|
||||||
Legend:
|
Legend:
|
||||||
|
@ -13,6 +13,8 @@ Legend:
|
||||||
# partially done
|
# partially done
|
||||||
* done
|
* done
|
||||||
|
|
||||||
|
- Improve parsing of the action parameters in jailreader.py
|
||||||
|
|
||||||
- Better handling of the protocol in transmitter.py
|
- Better handling of the protocol in transmitter.py
|
||||||
|
|
||||||
- Add gettext support (I18N)
|
- Add gettext support (I18N)
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 288 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 288 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-08-22 23:59:51 +0200 (Tue, 22 Aug 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -110,6 +110,17 @@ class Beautifier:
|
||||||
for ip in response[:-1]:
|
for ip in response[:-1]:
|
||||||
msg = msg + "|- " + ip + "\n"
|
msg = msg + "|- " + ip + "\n"
|
||||||
msg = msg + "`- " + response[len(response)-1]
|
msg = msg + "`- " + response[len(response)-1]
|
||||||
|
elif inC[2] in ("failregex", "addfailregex", "delfailregex",
|
||||||
|
"ignoreregex", "addignoreregex", "delignoreregex"):
|
||||||
|
if len(response) == 0:
|
||||||
|
msg = "No regular expression is defined"
|
||||||
|
else:
|
||||||
|
msg = "The following regular expression are defined:\n"
|
||||||
|
c = 0
|
||||||
|
for ip in response[:-1]:
|
||||||
|
msg = msg + "|- [" + str(c) + "]: " + ip + "\n"
|
||||||
|
c += 1
|
||||||
|
msg = msg + "`- [" + str(c) + "]: " + response[len(response)-1]
|
||||||
except Exception:
|
except Exception:
|
||||||
logSys.warn("Beautifier error. Please report the error")
|
logSys.warn("Beautifier error. Please report the error")
|
||||||
logSys.error("Beautify " + `response` + " with " + `self.__inputCmd` +
|
logSys.error("Beautify " + `response` + " with " + `self.__inputCmd` +
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 458 $
|
# $Revision: 505 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 458 $"
|
__version__ = "$Revision: 505 $"
|
||||||
__date__ = "$Date: 2006-11-12 15:52:36 +0100 (Sun, 12 Nov 2006) $"
|
__date__ = "$Date: 2006-12-24 00:20:16 +0100 (Sun, 24 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -67,8 +67,14 @@ class FilterReader(ConfigReader):
|
||||||
elif opt == "timepattern":
|
elif opt == "timepattern":
|
||||||
stream.append(["set", self.__name, "timepattern", self.__opts[opt]])
|
stream.append(["set", self.__name, "timepattern", self.__opts[opt]])
|
||||||
elif opt == "failregex":
|
elif opt == "failregex":
|
||||||
stream.append(["set", self.__name, "failregex", self.__opts[opt]])
|
for regex in self.__opts[opt].split('\n'):
|
||||||
|
# Do not send a command if the rule is empty.
|
||||||
|
if regex != '':
|
||||||
|
stream.append(["set", self.__name, "addfailregex", regex])
|
||||||
elif opt == "ignoreregex":
|
elif opt == "ignoreregex":
|
||||||
stream.append(["set", self.__name, "ignoreregex", self.__opts[opt]])
|
for regex in self.__opts[opt].split('\n'):
|
||||||
|
# Do not send a command if the rule is empty.
|
||||||
|
if regex != '':
|
||||||
|
stream.append(["set", self.__name, "addignoreregex", regex])
|
||||||
return stream
|
return stream
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 470 $
|
# $Revision: 509 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 470 $"
|
__version__ = "$Revision: 509 $"
|
||||||
__date__ = "$Date: 2006-11-18 16:15:58 +0100 (Sat, 18 Nov 2006) $"
|
__date__ = "$Date: 2007-01-04 12:58:58 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -112,6 +112,8 @@ class JailReader(ConfigReader):
|
||||||
stream.append(["set", self.__name, "maxretry", self.__opts[opt]])
|
stream.append(["set", self.__name, "maxretry", self.__opts[opt]])
|
||||||
elif opt == "ignoreip":
|
elif opt == "ignoreip":
|
||||||
for ip in self.__opts[opt].split():
|
for ip in self.__opts[opt].split():
|
||||||
|
# Do not send a command if the rule is empty.
|
||||||
|
if ip != '':
|
||||||
stream.append(["set", self.__name, "addignoreip", ip])
|
stream.append(["set", self.__name, "addignoreip", ip])
|
||||||
elif opt == "findtime":
|
elif opt == "findtime":
|
||||||
stream.append(["set", self.__name, "findtime", self.__opts[opt]])
|
stream.append(["set", self.__name, "findtime", self.__opts[opt]])
|
||||||
|
@ -132,7 +134,31 @@ class JailReader(ConfigReader):
|
||||||
m = JailReader.actionCRE.match(action)
|
m = JailReader.actionCRE.match(action)
|
||||||
d = dict()
|
d = dict()
|
||||||
if not m.group(2) == None:
|
if not m.group(2) == None:
|
||||||
for param in m.group(2).split(','):
|
# Huge bad hack :( This method really sucks. TODO Reimplement it.
|
||||||
|
actions = ""
|
||||||
|
escapeChar = None
|
||||||
|
allowComma = False
|
||||||
|
for c in m.group(2):
|
||||||
|
if c in ('"', "'") and not allowComma:
|
||||||
|
# Start
|
||||||
|
escapeChar = c
|
||||||
|
allowComma = True
|
||||||
|
elif c == escapeChar:
|
||||||
|
# End
|
||||||
|
escapeChar = None
|
||||||
|
allowComma = False
|
||||||
|
else:
|
||||||
|
if c == ',' and allowComma:
|
||||||
|
actions += "<COMMA>"
|
||||||
|
else:
|
||||||
|
actions += c
|
||||||
|
|
||||||
|
# Split using ,
|
||||||
|
actionsSplit = actions.split(',')
|
||||||
|
# Replace the tag <COMMA> with ,
|
||||||
|
actionsSplit = [n.replace("<COMMA>", ',') for n in actionsSplit]
|
||||||
|
|
||||||
|
for param in actionsSplit:
|
||||||
p = param.split('=')
|
p = param.split('=')
|
||||||
try:
|
try:
|
||||||
d[p[0].strip()] = p[1].strip()
|
d[p[0].strip()] = p[1].strip()
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 433 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 433 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-10-24 21:40:51 +0200 (Tue, 24 Oct 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 456 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 456 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-11-12 11:56:40 +0100 (Sun, 12 Nov 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -30,19 +30,23 @@ import textwrap
|
||||||
# Describes the protocol used to communicate with the server.
|
# Describes the protocol used to communicate with the server.
|
||||||
|
|
||||||
protocol = [
|
protocol = [
|
||||||
|
['', "Basic", ""],
|
||||||
["start", "starts the server and the jails"],
|
["start", "starts the server and the jails"],
|
||||||
["reload", "reloads the configuration"],
|
["reload", "reloads the configuration"],
|
||||||
["stop", "stops all jails and terminate the server"],
|
["stop", "stops all jails and terminate the server"],
|
||||||
["status", "gets the current status of the server"],
|
["status", "gets the current status of the server"],
|
||||||
["ping", "tests if the server is alive"],
|
["ping", "tests if the server is alive"],
|
||||||
['', ''],
|
['', "Logging", ""],
|
||||||
["set loglevel <LEVEL>", "sets logging level to <LEVEL>. 0 is minimal, 4 is debug"],
|
["set loglevel <LEVEL>", "sets logging level to <LEVEL>. 0 is minimal, 4 is debug"],
|
||||||
["get loglevel", "gets the logging level"],
|
["get loglevel", "gets the logging level"],
|
||||||
["set logtarget <TARGET>", "sets logging target to <TARGET>. Can be STDOUT, STDERR, SYSLOG or a file"],
|
["set logtarget <TARGET>", "sets logging target to <TARGET>. Can be STDOUT, STDERR, SYSLOG or a file"],
|
||||||
["get logtarget", "gets logging target"],
|
["get logtarget", "gets logging target"],
|
||||||
['', ''],
|
['', "Jail control", ""],
|
||||||
["add <JAIL> <BACKEND>", "creates <JAIL> using <BACKEND>"],
|
["add <JAIL> <BACKEND>", "creates <JAIL> using <BACKEND>"],
|
||||||
['', ''],
|
["start <JAIL>", "starts the jail <JAIL>"],
|
||||||
|
["stop <JAIL>", "stops the jail <JAIL>. The jail is removed"],
|
||||||
|
["status <JAIL>", "gets the current status of <JAIL>"],
|
||||||
|
['', "Jail configuration", ""],
|
||||||
["set <JAIL> idle on|off", "sets the idle state of <JAIL>"],
|
["set <JAIL> idle on|off", "sets the idle state of <JAIL>"],
|
||||||
["set <JAIL> addignoreip <IP>", "adds <IP> to the ignore list of <JAIL>"],
|
["set <JAIL> addignoreip <IP>", "adds <IP> to the ignore list of <JAIL>"],
|
||||||
["set <JAIL> delignoreip <IP>", "removes <IP> from the ignore list of <JAIL>"],
|
["set <JAIL> delignoreip <IP>", "removes <IP> from the ignore list of <JAIL>"],
|
||||||
|
@ -50,8 +54,10 @@ protocol = [
|
||||||
["set <JAIL> dellogpath <FILE>", "removes <FILE> to the monitoring list of <JAIL>"],
|
["set <JAIL> dellogpath <FILE>", "removes <FILE> to the monitoring list of <JAIL>"],
|
||||||
["set <JAIL> timeregex <REGEX>", "sets the regular expression <REGEX> to match the date format for <JAIL>. This will disable the autodetection feature."],
|
["set <JAIL> timeregex <REGEX>", "sets the regular expression <REGEX> to match the date format for <JAIL>. This will disable the autodetection feature."],
|
||||||
["set <JAIL> timepattern <PATTERN>", "sets the pattern <PATTERN> to match the date format for <JAIL>. This will disable the autodetection feature."],
|
["set <JAIL> timepattern <PATTERN>", "sets the pattern <PATTERN> to match the date format for <JAIL>. This will disable the autodetection feature."],
|
||||||
["set <JAIL> failregex <REGEX>", "sets the regular expression <REGEX> which must match failures for <JAIL>"],
|
["set <JAIL> addfailregex <REGEX>", "adds the regular expression <REGEX> which must match failures for <JAIL>"],
|
||||||
["set <JAIL> ignoreregex <REGEX>", "sets the regular expression <REGEX> which should match pattern to exclude for <JAIL>"],
|
["set <JAIL> delfailregex <INDEX>", "removes the regular expression at <INDEX> for failregex"],
|
||||||
|
["set <JAIL> addignoreregex <REGEX>", "adds the regular expression <REGEX> which should match pattern to exclude for <JAIL>"],
|
||||||
|
["set <JAIL> delignoreregex <INDEX>", "removes the regular expression at <INDEX> for ignoreregex"],
|
||||||
["set <JAIL> findtime <TIME>", "sets the number of seconds <TIME> for which the filter will look back for <JAIL>"],
|
["set <JAIL> findtime <TIME>", "sets the number of seconds <TIME> for which the filter will look back for <JAIL>"],
|
||||||
["set <JAIL> bantime <TIME>", "sets the number of seconds <TIME> a host will be banned for <JAIL>"],
|
["set <JAIL> bantime <TIME>", "sets the number of seconds <TIME> a host will be banned for <JAIL>"],
|
||||||
["set <JAIL> maxretry <RETRY>", "sets the number of failures <RETRY> before banning the host for <JAIL>"],
|
["set <JAIL> maxretry <RETRY>", "sets the number of failures <RETRY> before banning the host for <JAIL>"],
|
||||||
|
@ -64,13 +70,13 @@ protocol = [
|
||||||
["set <JAIL> actioncheck <ACT> <CMD>", "sets the check command <CMD> of the action <ACT> for <JAIL>"],
|
["set <JAIL> actioncheck <ACT> <CMD>", "sets the check command <CMD> of the action <ACT> for <JAIL>"],
|
||||||
["set <JAIL> actionban <ACT> <CMD>", "sets the ban command <CMD> of the action <ACT> for <JAIL>"],
|
["set <JAIL> actionban <ACT> <CMD>", "sets the ban command <CMD> of the action <ACT> for <JAIL>"],
|
||||||
["set <JAIL> actionunban <ACT> <CMD>", "sets the unban command <CMD> of the action <ACT> for <JAIL>"],
|
["set <JAIL> actionunban <ACT> <CMD>", "sets the unban command <CMD> of the action <ACT> for <JAIL>"],
|
||||||
['', ''],
|
['', "Jail information", ""],
|
||||||
["get <JAIL> logpath", "gets the list of the monitored files for <JAIL>"],
|
["get <JAIL> logpath", "gets the list of the monitored files for <JAIL>"],
|
||||||
["get <JAIL> ignoreip", "gets the list of ignored IP addresses for <JAIL>"],
|
["get <JAIL> ignoreip", "gets the list of ignored IP addresses for <JAIL>"],
|
||||||
["get <JAIL> timeregex", "gets the regular expression used for the time detection for <JAIL>"],
|
["get <JAIL> timeregex", "gets the regular expression used for the time detection for <JAIL>"],
|
||||||
["get <JAIL> timepattern", "gets the pattern used for the time detection for <JAIL>"],
|
["get <JAIL> timepattern", "gets the pattern used for the time detection for <JAIL>"],
|
||||||
["get <JAIL> failregex", "gets the regular expression which matches the failures for <JAIL>"],
|
["get <JAIL> failregex", "gets the list of regular expressions which matches the failures for <JAIL>"],
|
||||||
["get <JAIL> ignoreregex", "gets the regular expression which matches patterns to ignore for <JAIL>"],
|
["get <JAIL> ignoreregex", "gets the list of regular expressions which matches patterns to ignore for <JAIL>"],
|
||||||
["get <JAIL> findtime", "gets the time for which the filter will look back for failures for <JAIL>"],
|
["get <JAIL> findtime", "gets the time for which the filter will look back for failures for <JAIL>"],
|
||||||
["get <JAIL> bantime", "gets the time a host is banned for <JAIL>"],
|
["get <JAIL> bantime", "gets the time a host is banned for <JAIL>"],
|
||||||
["get <JAIL> maxretry", "gets the number of failures allowed for <JAIL>"],
|
["get <JAIL> maxretry", "gets the number of failures allowed for <JAIL>"],
|
||||||
|
@ -80,10 +86,6 @@ protocol = [
|
||||||
["get <JAIL> actioncheck <ACT>", "gets the check command for the action <ACT> for <JAIL>"],
|
["get <JAIL> actioncheck <ACT>", "gets the check command for the action <ACT> for <JAIL>"],
|
||||||
["get <JAIL> actionban <ACT>", "gets the ban command for the action <ACT> for <JAIL>"],
|
["get <JAIL> actionban <ACT>", "gets the ban command for the action <ACT> for <JAIL>"],
|
||||||
["get <JAIL> actionunban <ACT>", "gets the unban command for the action <ACT> for <JAIL>"],
|
["get <JAIL> actionunban <ACT>", "gets the unban command for the action <ACT> for <JAIL>"],
|
||||||
['', ''],
|
|
||||||
["start <JAIL>", "starts the jail <JAIL>"],
|
|
||||||
["stop <JAIL>", "stops the jail <JAIL>. The jail is removed"],
|
|
||||||
["status <JAIL>", "gets the current status of <JAIL>"]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -94,14 +96,41 @@ def printFormatted():
|
||||||
INDENT=4
|
INDENT=4
|
||||||
MARGIN=41
|
MARGIN=41
|
||||||
WIDTH=34
|
WIDTH=34
|
||||||
|
firstHeading = False
|
||||||
for m in protocol:
|
for m in protocol:
|
||||||
if m[0] == '':
|
if m[0] == '' and firstHeading:
|
||||||
print
|
print
|
||||||
|
firstHeading = True
|
||||||
first = True
|
first = True
|
||||||
for n in textwrap.wrap(m[1], WIDTH):
|
for n in textwrap.wrap(m[1], WIDTH):
|
||||||
if first:
|
if first:
|
||||||
n = ' ' * INDENT + m[0] + ' ' * (MARGIN - len(m[0])) + n
|
line = ' ' * INDENT + m[0] + ' ' * (MARGIN - len(m[0])) + n
|
||||||
first = False
|
first = False
|
||||||
else:
|
else:
|
||||||
n = ' ' * (INDENT + MARGIN) + n
|
line = ' ' * (INDENT + MARGIN) + n
|
||||||
print n
|
print line
|
||||||
|
|
||||||
|
##
|
||||||
|
# Prints the protocol in a "mediawiki" format.
|
||||||
|
|
||||||
|
def printWiki():
|
||||||
|
firstHeading = False
|
||||||
|
for m in protocol:
|
||||||
|
if m[0] == '':
|
||||||
|
if firstHeading:
|
||||||
|
print "|}"
|
||||||
|
__printWikiHeader(m[1], m[2])
|
||||||
|
firstHeading = True
|
||||||
|
else:
|
||||||
|
print "|-"
|
||||||
|
print "| <span style=\"white-space:nowrap;\"><tt>" + m[0] + "</tt></span> || || " + m[1]
|
||||||
|
print "|}"
|
||||||
|
|
||||||
|
def __printWikiHeader(section, desc):
|
||||||
|
print
|
||||||
|
print "=== " + section + " ==="
|
||||||
|
print
|
||||||
|
print desc
|
||||||
|
print
|
||||||
|
print "{|"
|
||||||
|
print "| '''Command''' || || '''Description'''"
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 480 $
|
# $Revision: 512 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 480 $"
|
__version__ = "$Revision: 512 $"
|
||||||
__date__ = "$Date: 2006-12-07 22:47:53 +0100 (Thu, 07 Dec 2006) $"
|
__date__ = "$Date: 2007-01-04 13:59:09 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
version = "0.7.5"
|
version = "0.7.6"
|
||||||
|
|
|
@ -2,30 +2,30 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 455 $
|
# $Revision: 496 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstart = touch <tmpfile>
|
actionstart = touch <tmpfile>
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstop = rm -f <tmpfile>
|
actionstop = rm -f <tmpfile>
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck =
|
actioncheck =
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -36,7 +36,7 @@ actioncheck =
|
||||||
actionban = IP=<ip> &&
|
actionban = IP=<ip> &&
|
||||||
echo "ALL: $IP" >> <file>
|
echo "ALL: $IP" >> <file>
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -44,9 +44,7 @@ actionban = IP=<ip> &&
|
||||||
# <time> unix timestamp of the ban time
|
# <time> unix timestamp of the ban time
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionunban = IP=<ip> &&
|
actionunban = IP=<ip> && sed -i.old /ALL:\ $IP/d <file>
|
||||||
grep -v "ALL: $IP" <file> > <tmpfile> &&
|
|
||||||
mv <tmpfile> <file>
|
|
||||||
|
|
||||||
[Init]
|
[Init]
|
||||||
|
|
||||||
|
@ -55,10 +53,3 @@ actionunban = IP=<ip> &&
|
||||||
# Values: STR Default: /etc/hosts.deny
|
# Values: STR Default: /etc/hosts.deny
|
||||||
#
|
#
|
||||||
file = /etc/hosts.deny
|
file = /etc/hosts.deny
|
||||||
|
|
||||||
# Option: file
|
|
||||||
# Notes.: hosts.deny temporary file path.
|
|
||||||
# Values: STR Default: /etc/hostsdeny.failban
|
|
||||||
#
|
|
||||||
tmpfile = /tmp/hosts.deny.tmp
|
|
||||||
|
|
||||||
|
|
|
@ -3,33 +3,33 @@
|
||||||
# Author: Nick Munger
|
# Author: Nick Munger
|
||||||
# Modified by: Cyril Jaquier
|
# Modified by: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 254 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstart =
|
actionstart =
|
||||||
|
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstop =
|
actionstop =
|
||||||
|
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck =
|
actioncheck =
|
||||||
|
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -37,10 +37,10 @@ actioncheck =
|
||||||
# <time> unix timestamp of the ban time
|
# <time> unix timestamp of the ban time
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionban = ipfw add deny tcp from <ip> to <localhost> <port>
|
actionban = ipaction add deny tcp from <ip> to <localhost> <port>
|
||||||
|
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -48,7 +48,7 @@ actionban = ipfw add deny tcp from <ip> to <localhost> <port>
|
||||||
# <time> unix timestamp of the ban time
|
# <time> unix timestamp of the ban time
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionunban = ipfw delete `ipfw list | grep -i <ip> | awk '{print $1;}'`
|
actionunban = ipaction delete `ipfw list | grep -i <ip> | awk '{print $1;}'`
|
||||||
|
|
||||||
[Init]
|
[Init]
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 455 $
|
# $Revision: 494 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -15,7 +15,7 @@ actionstart = iptables -N fail2ban-<name>
|
||||||
iptables -A fail2ban-<name> -j RETURN
|
iptables -A fail2ban-<name> -j RETURN
|
||||||
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>
|
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -23,13 +23,13 @@ actionstop = iptables -D INPUT -p <protocol> --dport <port> -j fail2ban-<name>
|
||||||
iptables -F fail2ban-<name>
|
iptables -F fail2ban-<name>
|
||||||
iptables -X fail2ban-<name>
|
iptables -X fail2ban-<name>
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck = iptables -L INPUT | grep -q fail2ban-<name>
|
actioncheck = iptables -n -L INPUT | grep -q fail2ban-<name>
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -39,7 +39,7 @@ actioncheck = iptables -L INPUT | grep -q fail2ban-<name>
|
||||||
#
|
#
|
||||||
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
|
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 254 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -16,7 +16,7 @@ actionstart = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: started" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: started" <dest>
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -25,13 +25,13 @@ actionstop = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: stopped" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: stopped" <dest>
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck =
|
actioncheck =
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -47,7 +47,7 @@ actionban = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip>" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip>" <dest>
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 254 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -16,7 +16,7 @@ actionstart = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: started" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: started" <dest>
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
|
@ -25,13 +25,13 @@ actionstop = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: stopped" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: stopped" <dest>
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck =
|
actioncheck =
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -45,7 +45,7 @@ actionban = echo -en "Hi,\n
|
||||||
Regards,\n
|
Regards,\n
|
||||||
Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip>" <dest>
|
Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip>" <dest>
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
|
|
@ -2,30 +2,30 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 394 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
|
||||||
# Option: fwstart
|
# Option: actionstart
|
||||||
# Notes.: command executed once at the start of Fail2Ban.
|
# Notes.: command executed once at the start of Fail2Ban.
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstart =
|
actionstart =
|
||||||
|
|
||||||
# Option: fwend
|
# Option: actionend
|
||||||
# Notes.: command executed once at the end of Fail2Ban
|
# Notes.: command executed once at the end of Fail2Ban
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actionstop =
|
actionstop =
|
||||||
|
|
||||||
# Option: fwcheck
|
# Option: actioncheck
|
||||||
# Notes.: command executed once before each fwban command
|
# Notes.: command executed once before each actionban command
|
||||||
# Values: CMD
|
# Values: CMD
|
||||||
#
|
#
|
||||||
actioncheck =
|
actioncheck =
|
||||||
|
|
||||||
# Option: fwban
|
# Option: actionban
|
||||||
# Notes.: command executed when banning an IP. Take care that the
|
# Notes.: command executed when banning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
@ -35,7 +35,7 @@ actioncheck =
|
||||||
#
|
#
|
||||||
actionban = shorewall reject <ip>
|
actionban = shorewall reject <ip>
|
||||||
|
|
||||||
# Option: fwunban
|
# Option: actionunban
|
||||||
# Notes.: command executed when unbanning an IP. Take care that the
|
# Notes.: command executed when unbanning an IP. Take care that the
|
||||||
# command is executed with Fail2Ban user rights.
|
# command is executed with Fail2Ban user rights.
|
||||||
# Tags: <ip> IP address
|
# Tags: <ip> IP address
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 412 $
|
# $Revision: 494 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -18,14 +18,16 @@
|
||||||
loglevel = 3
|
loglevel = 3
|
||||||
|
|
||||||
# Option: logtarget
|
# Option: logtarget
|
||||||
# Notes.: Set the log target. This could be a file, SYSLOG, STDERR.
|
# Notes.: Set the log target. This could be a file, SYSLOG, STDERR or STDOUT.
|
||||||
# Values: STDERR SYSLOG file Default: /var/log/fail2ban.log
|
# Only one log target can be specified.
|
||||||
|
# Values: STDOUT STDERR SYSLOG file Default: /var/log/fail2ban.log
|
||||||
#
|
#
|
||||||
logtarget = /var/log/fail2ban.log
|
logtarget = /var/log/fail2ban.log
|
||||||
|
|
||||||
# Option: socket
|
# Option: socket
|
||||||
# Notes.: Set the socket file. This is used to communication with the
|
# Notes.: Set the socket file. This is used to communicate with the daemon. Do
|
||||||
# daemon.
|
# not remove this file when Fail2ban runs. It will not be possible to
|
||||||
|
# communicate with the server afterwards.
|
||||||
# Values: FILE Default: /tmp/fail2ban.sock
|
# Values: FILE Default: /tmp/fail2ban.sock
|
||||||
#
|
#
|
||||||
socket = /tmp/fail2ban.sock
|
socket = /tmp/fail2ban.sock
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 471 $
|
# $Revision: 495 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failure messages in the logfile. The
|
# Notes.: regex to match the password failure messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = [[]client <HOST>[]] user .*(?:: authentication failure|not found)
|
failregex = [[]client <HOST>[]] user .*(?:: authentication failure|not found)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 394 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failure messages in the logfile. The
|
# Notes.: regex to match the password failure messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = [[]client <HOST>[]] File does not exist: .*(\.php|\.asp)
|
failregex = [[]client <HOST>[]] File does not exist: .*(\.php|\.asp)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# Author: Christoph Haas
|
# Author: Christoph Haas
|
||||||
# Modified by: Cyril Jaquier
|
# Modified by: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 267 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -11,10 +11,11 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = LOGIN FAILED, ip=\[<HOST>\]$
|
failregex = LOGIN FAILED, .*, ip=\[<HOST>\]$
|
||||||
|
|
||||||
# Option: ignoreregex
|
# Option: ignoreregex
|
||||||
# Notes.: regex to ignore. If this regex matches, the line is ignored.
|
# Notes.: regex to ignore. If this regex matches, the line is ignored.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 267 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = error,relay=<HOST>,.*550 User unknown
|
failregex = error,relay=<HOST>,.*550 User unknown
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 267 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = reject: RCPT from (.*)\[<HOST>\]: 554
|
failregex = reject: RCPT from (.*)\[<HOST>\]: 554
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Yaroslav Halchenko
|
# Author: Yaroslav Halchenko
|
||||||
#
|
#
|
||||||
# $Revision: 331 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = USER \S+: no such user found from \S* ?\[<HOST>\] to \S+\s*$
|
failregex = USER \S+: no such user found from \S* ?\[<HOST>\] to \S+\s*$
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 267 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = (?:[\d,.]+[\d,.] rblsmtpd: |421 badiprbl: ip )<HOST>
|
failregex = (?:[\d,.]+[\d,.] rblsmtpd: |421 badiprbl: ip )<HOST>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Yaroslav Halchenko
|
# Author: Yaroslav Halchenko
|
||||||
#
|
#
|
||||||
# $Revision: 331 $
|
# $Revision: 510 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = : warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed$
|
failregex = : warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed$
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 471 $
|
# $Revision: 513 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,10 +10,13 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = (?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) <HOST>
|
failregex = (?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid))? user .*(?: from|FROM) <HOST>
|
||||||
|
ROOT LOGIN REFUSED .* FROM <HOST>
|
||||||
|
[iI](?:llegal|nvalid) user .* from <HOST>
|
||||||
|
|
||||||
# Option: ignoreregex
|
# Option: ignoreregex
|
||||||
# Notes.: regex to ignore. If this regex matches, the line is ignored.
|
# Notes.: regex to ignore. If this regex matches, the line is ignored.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 471 $
|
# $Revision: 495 $
|
||||||
#
|
#
|
||||||
|
|
||||||
[Definition]
|
[Definition]
|
||||||
|
@ -10,7 +10,8 @@
|
||||||
# Option: failregex
|
# Option: failregex
|
||||||
# Notes.: regex to match the password failures messages in the logfile. The
|
# Notes.: regex to match the password failures messages in the logfile. The
|
||||||
# host must be matched by a group named "host". The tag "<HOST>" can
|
# host must be matched by a group named "host". The tag "<HOST>" can
|
||||||
# be used for standard IP/hostname matching.
|
# be used for standard IP/hostname matching and is only an alias for
|
||||||
|
# (?:::f{4,6}:)?(?P<host>\S+)
|
||||||
# Values: TEXT
|
# Values: TEXT
|
||||||
#
|
#
|
||||||
failregex = vsftpd: \(pam_unix\) authentication failure; .* rhost=<HOST>
|
failregex = vsftpd: \(pam_unix\) authentication failure; .* rhost=<HOST>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 470 $
|
# $Revision: 509 $
|
||||||
#
|
#
|
||||||
|
|
||||||
# The DEFAULT allows a global definition of the options. They can be override
|
# The DEFAULT allows a global definition of the options. They can be override
|
||||||
|
@ -10,18 +10,29 @@
|
||||||
|
|
||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
|
|
||||||
# "ignoreip" can be an IP address, a CIDR mask or a DNS host.
|
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
|
||||||
|
# ban a host which matches an address in this list. Several addresses can be
|
||||||
|
# defined using space separator.
|
||||||
ignoreip = 127.0.0.1
|
ignoreip = 127.0.0.1
|
||||||
|
|
||||||
# "bantime" is the number of seconds that a host is banned.
|
# "bantime" is the number of seconds that a host is banned.
|
||||||
bantime = 600
|
bantime = 600
|
||||||
# A host is banned if it has generated "maxretry" during the
|
|
||||||
# last "findtime" seconds.
|
# A host is banned if it has generated "maxretry" during the last "findtime"
|
||||||
|
# seconds.
|
||||||
findtime = 600
|
findtime = 600
|
||||||
|
|
||||||
# "maxretry" is the number of failures before a host get banned.
|
# "maxretry" is the number of failures before a host get banned.
|
||||||
maxretry = 3
|
maxretry = 3
|
||||||
|
|
||||||
# "backend" specifies the backend used to get files modification. Available
|
# "backend" specifies the backend used to get files modification. Available
|
||||||
# options are "gamin", "polling" and "auto".
|
# options are "gamin", "polling" and "auto". This option can be overridden in
|
||||||
|
# each jail too (use "gamin" for a jail and "polling" for another).
|
||||||
|
#
|
||||||
|
# gamin: requires Gamin (a file alteration monitor) to be installed. If Gamin
|
||||||
|
# is not installed, Fail2ban will use polling.
|
||||||
|
# polling: uses a polling algorithm which does not require external libraries.
|
||||||
|
# auto: will choose Gamin if available and polling otherwise.
|
||||||
backend = auto
|
backend = auto
|
||||||
|
|
||||||
|
|
||||||
|
@ -130,13 +141,15 @@ action = shorewall
|
||||||
logpath = /var/log/apache2/error_log
|
logpath = /var/log/apache2/error_log
|
||||||
|
|
||||||
# This jail uses ipfw, the standard firewall on FreeBSD. The "ignoreip"
|
# This jail uses ipfw, the standard firewall on FreeBSD. The "ignoreip"
|
||||||
# option is overridden in this jail.
|
# option is overridden in this jail. Moreover, the action "mail-whois" defines
|
||||||
|
# the variable "name" which contains a comma using "". The characters '' are
|
||||||
|
# valid too.
|
||||||
|
|
||||||
[ssh-ipfw]
|
[ssh-ipfw]
|
||||||
|
|
||||||
enabled = false
|
enabled = false
|
||||||
filter = sshd
|
filter = sshd
|
||||||
action = ipfw[localhost=192.168.0.1]
|
action = ipfw[localhost=192.168.0.1]
|
||||||
mail-whois[name=SSH, dest=yourmail@mail.com]
|
mail-whois[name="SSH,IPFW", dest=yourmail@mail.com]
|
||||||
logpath = /var/log/auth.log
|
logpath = /var/log/auth.log
|
||||||
ignoreip = 168.192.0.1
|
ignoreip = 168.192.0.1
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 477 $
|
# $Revision: 511 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 477 $"
|
__version__ = "$Revision: 511 $"
|
||||||
__date__ = "$Date: 2006-12-03 23:01:18 +0100 (Sun, 03 Dec 2006) $"
|
__date__ = "$Date: 2007-01-04 13:58:21 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ import getopt, time, readline, shlex, socket
|
||||||
|
|
||||||
# Inserts our own modules path first in the list
|
# Inserts our own modules path first in the list
|
||||||
# fix for bug #343821
|
# fix for bug #343821
|
||||||
sys.path.insert(1, "/usr/lib/fail2ban")
|
sys.path.insert(1, "/usr/share/fail2ban")
|
||||||
|
|
||||||
# Now we can import our modules
|
# Now we can import our modules
|
||||||
from common.version import version
|
from common.version import version
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 300 $
|
# $Revision: 511 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 300 $"
|
__version__ = "$Revision: 511 $"
|
||||||
__date__ = "$Date: 2006-08-23 21:53:09 +0200 (Wed, 23 Aug 2006) $"
|
__date__ = "$Date: 2007-01-04 13:58:21 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -29,10 +29,11 @@ import locale, getopt, sys, time, logging, gc
|
||||||
|
|
||||||
# Inserts our own modules path first in the list
|
# Inserts our own modules path first in the list
|
||||||
# fix for bug #343821
|
# fix for bug #343821
|
||||||
sys.path.insert(1, "/usr/lib/fail2ban")
|
sys.path.insert(1, "/usr/share/fail2ban")
|
||||||
|
|
||||||
from common.version import version
|
from common.version import version
|
||||||
from server.filter import Filter
|
from server.filter import Filter
|
||||||
|
from server.regex import RegexException
|
||||||
|
|
||||||
# Gets the instance of the logger.
|
# Gets the instance of the logger.
|
||||||
logSys = logging.getLogger("fail2ban.regex")
|
logSys = logging.getLogger("fail2ban.regex")
|
||||||
|
@ -83,17 +84,17 @@ class Fail2banRegex:
|
||||||
self.dispVersion()
|
self.dispVersion()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def setRegex(self, value):
|
def testRegex(self, line, regex):
|
||||||
print
|
|
||||||
self.__filter.setFailRegex(value)
|
|
||||||
|
|
||||||
def testRegex(self, line):
|
|
||||||
print
|
print
|
||||||
try:
|
try:
|
||||||
logging.getLogger("fail2ban").setLevel(logging.DEBUG)
|
logging.getLogger("fail2ban").setLevel(logging.DEBUG)
|
||||||
|
self.__filter.addFailRegex(regex)
|
||||||
ret = self.__filter.findFailure(line)
|
ret = self.__filter.findFailure(line)
|
||||||
print
|
print
|
||||||
logging.getLogger("fail2ban").setLevel(logging.CRITICAL)
|
logging.getLogger("fail2ban").setLevel(logging.CRITICAL)
|
||||||
|
except RegexException, e:
|
||||||
|
print e
|
||||||
|
return False
|
||||||
except IndexError:
|
except IndexError:
|
||||||
print "Sorry, but no <host> found in regex"
|
print "Sorry, but no <host> found in regex"
|
||||||
return False
|
return False
|
||||||
|
@ -156,8 +157,7 @@ if __name__ == "__main__":
|
||||||
regex.dispUsage()
|
regex.dispUsage()
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
else:
|
else:
|
||||||
regex.setRegex(sys.argv[2])
|
ret = regex.testRegex(sys.argv[1], sys.argv[2])
|
||||||
ret = regex.testRegex(sys.argv[1])
|
|
||||||
if ret:
|
if ret:
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 472 $
|
# $Revision: 511 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 472 $"
|
__version__ = "$Revision: 511 $"
|
||||||
__date__ = "$Date: 2006-11-19 22:26:47 +0100 (Sun, 19 Nov 2006) $"
|
__date__ = "$Date: 2007-01-04 13:58:21 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import getopt, sys
|
||||||
|
|
||||||
# Inserts our own modules path first in the list
|
# Inserts our own modules path first in the list
|
||||||
# fix for bug #343821
|
# fix for bug #343821
|
||||||
sys.path.insert(1, "/usr/lib/fail2ban")
|
sys.path.insert(1, "/usr/share/fail2ban")
|
||||||
|
|
||||||
from common.version import version
|
from common.version import version
|
||||||
from server.server import Server
|
from server.server import Server
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 467 $
|
# $Revision: 511 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 467 $"
|
__version__ = "$Revision: 511 $"
|
||||||
__date__ = "$Date: 2006-11-16 22:07:42 +0100 (Thu, 16 Nov 2006) $"
|
__date__ = "$Date: 2007-01-04 13:58:21 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ import unittest, logging, sys
|
||||||
|
|
||||||
# Inserts our own modules path first in the list
|
# Inserts our own modules path first in the list
|
||||||
# fix for bug #343821
|
# fix for bug #343821
|
||||||
sys.path.insert(1, "/usr/lib/fail2ban")
|
sys.path.insert(1, "/usr/share/fail2ban")
|
||||||
|
|
||||||
from common.version import version
|
from common.version import version
|
||||||
from testcases import banmanagertestcase
|
from testcases import banmanagertestcase
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#
|
#
|
||||||
# Author: Sireyessire, Cyril Jaquier
|
# Author: Sireyessire, Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 1.2 $
|
# $Revision: 491 $
|
||||||
|
|
||||||
opts="start stop restart reload showlog"
|
opts="start stop restart reload showlog"
|
||||||
|
|
||||||
|
@ -41,6 +41,32 @@ stop() {
|
||||||
eend $? "Failed to stop fail2ban"
|
eend $? "Failed to stop fail2ban"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
if ! service_stopped "${SVCNAME}" ; then
|
||||||
|
svc_stop || return "$?"
|
||||||
|
einfon "Waiting for server to shutdown ."
|
||||||
|
cnt=0
|
||||||
|
while [ 1 ]; do
|
||||||
|
# Ping fail2ban-server
|
||||||
|
${FAIL2BAN} ping &> /dev/null
|
||||||
|
if [ ! "$?" == "0" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
cnt=`expr $cnt + 1`
|
||||||
|
if [ $cnt -gt 60 ] ; then
|
||||||
|
# We have waited 1 minute. Failed
|
||||||
|
echo
|
||||||
|
eend 1 "Failed"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
svc_start
|
||||||
|
}
|
||||||
|
|
||||||
reload() {
|
reload() {
|
||||||
ebegin "Reloading fail2ban"
|
ebegin "Reloading fail2ban"
|
||||||
${FAIL2BAN} reload > /dev/null
|
${FAIL2BAN} reload > /dev/null
|
||||||
|
|
|
@ -48,6 +48,7 @@ stop() {
|
||||||
if [ -n "$pid" ]; then
|
if [ -n "$pid" ]; then
|
||||||
$FAIL2BAN stop > /dev/null
|
$FAIL2BAN stop > /dev/null
|
||||||
fi
|
fi
|
||||||
|
sleep 1
|
||||||
getpid
|
getpid
|
||||||
if [ -z "$pid" ]; then
|
if [ -z "$pid" ]; then
|
||||||
rm -f /var/lock/subsys/fail2ban
|
rm -f /var/lock/subsys/fail2ban
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
||||||
.TH FAIL2BAN-CLIENT "1" "December 2006" "fail2ban-client v0.7.4-SVN" "User Commands"
|
.TH FAIL2BAN-CLIENT "1" "December 2006" "fail2ban-client v0.7.5-SVN" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fail2ban-client \- configure and control the server
|
fail2ban-client \- configure and control the server
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B fail2ban-client
|
.B fail2ban-client
|
||||||
[\fIOPTIONS\fR]... \fI<COMMAND>\fR
|
[\fIOPTIONS\fR]... \fI<COMMAND>\fR
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Fail2Ban v0.7.4\-SVN reads log file that contains password failure report
|
Fail2Ban v0.7.5\-SVN reads log file that contains password failure report
|
||||||
and bans the corresponding IP addresses using firewall rules.
|
and bans the corresponding IP addresses using firewall rules.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
|
@ -37,6 +37,8 @@ display this help message
|
||||||
\fB\-V\fR, \fB\-\-version\fR
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
print the version
|
print the version
|
||||||
.SH COMMAND
|
.SH COMMAND
|
||||||
|
.IP
|
||||||
|
Basic
|
||||||
.TP
|
.TP
|
||||||
\fBstart\fR
|
\fBstart\fR
|
||||||
starts the server and the jails
|
starts the server and the jails
|
||||||
|
@ -54,6 +56,8 @@ server
|
||||||
.TP
|
.TP
|
||||||
\fBping\fR
|
\fBping\fR
|
||||||
tests if the server is alive
|
tests if the server is alive
|
||||||
|
.IP
|
||||||
|
Logging
|
||||||
.TP
|
.TP
|
||||||
\fBset loglevel <LEVEL>\fR
|
\fBset loglevel <LEVEL>\fR
|
||||||
sets logging level to <LEVEL>. 0
|
sets logging level to <LEVEL>. 0
|
||||||
|
@ -69,10 +73,24 @@ file
|
||||||
.TP
|
.TP
|
||||||
\fBget logtarget\fR
|
\fBget logtarget\fR
|
||||||
gets logging target
|
gets logging target
|
||||||
|
.IP
|
||||||
|
Jail control
|
||||||
.TP
|
.TP
|
||||||
\fBadd <JAIL> <BACKEND>\fR
|
\fBadd <JAIL> <BACKEND>\fR
|
||||||
creates <JAIL> using <BACKEND>
|
creates <JAIL> using <BACKEND>
|
||||||
.TP
|
.TP
|
||||||
|
\fBstart <JAIL>\fR
|
||||||
|
starts the jail <JAIL>
|
||||||
|
.TP
|
||||||
|
\fBstop <JAIL>\fR
|
||||||
|
stops the jail <JAIL>. The jail is
|
||||||
|
removed
|
||||||
|
.TP
|
||||||
|
\fBstatus <JAIL>\fR
|
||||||
|
gets the current status of <JAIL>
|
||||||
|
.IP
|
||||||
|
Jail configuration
|
||||||
|
.TP
|
||||||
\fBset <JAIL> idle on|off\fR
|
\fBset <JAIL> idle on|off\fR
|
||||||
sets the idle state of <JAIL>
|
sets the idle state of <JAIL>
|
||||||
.TP
|
.TP
|
||||||
|
@ -104,16 +122,24 @@ match the date format for <JAIL>.
|
||||||
This will disable the
|
This will disable the
|
||||||
autodetection feature.
|
autodetection feature.
|
||||||
.TP
|
.TP
|
||||||
\fBset <JAIL> failregex <REGEX>\fR
|
\fBset <JAIL> addfailregex <REGEX>\fR
|
||||||
sets the regular expression
|
adds the regular expression
|
||||||
<REGEX> which must match failures
|
<REGEX> which must match failures
|
||||||
for <JAIL>
|
for <JAIL>
|
||||||
.TP
|
.TP
|
||||||
\fBset <JAIL> ignoreregex <REGEX>\fR
|
\fBset <JAIL> delfailregex <INDEX>\fR
|
||||||
sets the regular expression
|
removes the regular expression at
|
||||||
|
<INDEX> for failregex
|
||||||
|
.TP
|
||||||
|
\fBset <JAIL> addignoreregex <REGEX>\fR
|
||||||
|
adds the regular expression
|
||||||
<REGEX> which should match pattern
|
<REGEX> which should match pattern
|
||||||
to exclude for <JAIL>
|
to exclude for <JAIL>
|
||||||
.TP
|
.TP
|
||||||
|
\fBset <JAIL> delignoreregex <INDEX>\fR
|
||||||
|
removes the regular expression at
|
||||||
|
<INDEX> for ignoreregex
|
||||||
|
.TP
|
||||||
\fBset <JAIL> findtime <TIME>\fR
|
\fBset <JAIL> findtime <TIME>\fR
|
||||||
sets the number of seconds <TIME>
|
sets the number of seconds <TIME>
|
||||||
for which the filter will look
|
for which the filter will look
|
||||||
|
@ -163,6 +189,8 @@ action <ACT> for <JAIL>
|
||||||
\fBset <JAIL> actionunban <ACT> <CMD>\fR
|
\fBset <JAIL> actionunban <ACT> <CMD>\fR
|
||||||
sets the unban command <CMD> of
|
sets the unban command <CMD> of
|
||||||
the action <ACT> for <JAIL>
|
the action <ACT> for <JAIL>
|
||||||
|
.IP
|
||||||
|
Jail information
|
||||||
.TP
|
.TP
|
||||||
\fBget <JAIL> logpath\fR
|
\fBget <JAIL> logpath\fR
|
||||||
gets the list of the monitored
|
gets the list of the monitored
|
||||||
|
@ -181,13 +209,14 @@ gets the pattern used for the time
|
||||||
detection for <JAIL>
|
detection for <JAIL>
|
||||||
.TP
|
.TP
|
||||||
\fBget <JAIL> failregex\fR
|
\fBget <JAIL> failregex\fR
|
||||||
gets the regular expression which
|
gets the list of regular
|
||||||
matches the failures for <JAIL>
|
expressions which matches the
|
||||||
|
failures for <JAIL>
|
||||||
.TP
|
.TP
|
||||||
\fBget <JAIL> ignoreregex\fR
|
\fBget <JAIL> ignoreregex\fR
|
||||||
gets the regular expression which
|
gets the list of regular
|
||||||
matches patterns to ignore for
|
expressions which matches patterns
|
||||||
<JAIL>
|
to ignore for <JAIL>
|
||||||
.TP
|
.TP
|
||||||
\fBget <JAIL> findtime\fR
|
\fBget <JAIL> findtime\fR
|
||||||
gets the time for which the filter
|
gets the time for which the filter
|
||||||
|
@ -225,16 +254,6 @@ action <ACT> for <JAIL>
|
||||||
\fBget <JAIL> actionunban <ACT>\fR
|
\fBget <JAIL> actionunban <ACT>\fR
|
||||||
gets the unban command for the
|
gets the unban command for the
|
||||||
action <ACT> for <JAIL>
|
action <ACT> for <JAIL>
|
||||||
.TP
|
|
||||||
\fBstart <JAIL>\fR
|
|
||||||
starts the jail <JAIL>
|
|
||||||
.TP
|
|
||||||
\fBstop <JAIL>\fR
|
|
||||||
stops the jail <JAIL>. The jail is
|
|
||||||
removed
|
|
||||||
.TP
|
|
||||||
\fBstatus <JAIL>\fR
|
|
||||||
gets the current status of <JAIL>
|
|
||||||
.SH FILES
|
.SH FILES
|
||||||
\fI/etc/fail2ban/*\fR
|
\fI/etc/fail2ban/*\fR
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
||||||
.TH FAIL2BAN-REGEX "1" "December 2006" "fail2ban-regex v0.7.4-SVN" "User Commands"
|
.TH FAIL2BAN-REGEX "1" "December 2006" "fail2ban-regex v0.7.5-SVN" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fail2ban-regex \- test Fail2ban "failregex" option
|
fail2ban-regex \- test Fail2ban "failregex" option
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B fail2ban-regex
|
.B fail2ban-regex
|
||||||
\fI<logline> <failregex>\fR
|
\fI<logline> <failregex>\fR
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Fail2Ban v0.7.4\-SVN reads log file that contains password failure report
|
Fail2Ban v0.7.5\-SVN reads log file that contains password failure report
|
||||||
and bans the corresponding IP addresses using firewall rules.
|
and bans the corresponding IP addresses using firewall rules.
|
||||||
.PP
|
.PP
|
||||||
This tools can test and benchmark your regular expressions for the "failregex"
|
This tools can test and benchmark your regular expressions for the "failregex"
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36.
|
||||||
.TH FAIL2BAN-SERVER "1" "December 2006" "fail2ban-server v0.7.4-SVN" "User Commands"
|
.TH FAIL2BAN-SERVER "1" "December 2006" "fail2ban-server v0.7.5-SVN" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fail2ban-server \- start the server
|
fail2ban-server \- start the server
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B fail2ban-server
|
.B fail2ban-server
|
||||||
[\fIOPTIONS\fR]
|
[\fIOPTIONS\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Fail2Ban v0.7.4\-SVN reads log file that contains password failure report
|
Fail2Ban v0.7.5\-SVN reads log file that contains password failure report
|
||||||
and bans the corresponding IP addresses using firewall rules.
|
and bans the corresponding IP addresses using firewall rules.
|
||||||
.PP
|
.PP
|
||||||
Only use this command for debugging purpose. Start the server with
|
Only use this command for debugging purpose. Start the server with
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -66,6 +66,12 @@ class DateDetector:
|
||||||
template.setRegex("\d{2}/\S{3}/\d{4}:\d{2}:\d{2}:\d{2}")
|
template.setRegex("\d{2}/\S{3}/\d{4}:\d{2}:\d{2}:\d{2}")
|
||||||
template.setPattern("%d/%b/%Y:%H:%M:%S")
|
template.setPattern("%d/%b/%Y:%H:%M:%S")
|
||||||
self.__templates.append(template)
|
self.__templates.append(template)
|
||||||
|
# Exim 2006-12-21 06:43:20
|
||||||
|
template = DateStrptime()
|
||||||
|
template.setName("Year-Month-Day Hour:Minute:Second")
|
||||||
|
template.setRegex("\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}")
|
||||||
|
template.setPattern("%Y-%m-%d %H:%M:%S")
|
||||||
|
self.__templates.append(template)
|
||||||
# TAI64N
|
# TAI64N
|
||||||
template = DateTai64n()
|
template = DateTai64n()
|
||||||
template.setName("TAI64N")
|
template.setName("TAI64N")
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
# This file is part of Fail2Ban.
|
||||||
|
#
|
||||||
|
# Fail2Ban is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Fail2Ban is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Fail2Ban; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
# Author: Cyril Jaquier
|
||||||
|
#
|
||||||
|
# $Revision: 503 $
|
||||||
|
|
||||||
|
__author__ = "Cyril Jaquier"
|
||||||
|
__version__ = "$Revision: 503 $"
|
||||||
|
__date__ = "$Date: 2006-12-23 17:31:00 +0100 (Sat, 23 Dec 2006) $"
|
||||||
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
from regex import Regex, RegexException
|
||||||
|
|
||||||
|
##
|
||||||
|
# Regular expression class.
|
||||||
|
#
|
||||||
|
# This class represents a regular expression with its compiled version.
|
||||||
|
|
||||||
|
class FailRegex(Regex):
|
||||||
|
|
||||||
|
##
|
||||||
|
# Constructor.
|
||||||
|
#
|
||||||
|
# Creates a new object. This method can throw RegexException in order to
|
||||||
|
# avoid construction of invalid object.
|
||||||
|
# @param value the regular expression
|
||||||
|
|
||||||
|
def __init__(self, value):
|
||||||
|
# Replace "<HOST>" with default regular expression for host.
|
||||||
|
regex = value.replace("<HOST>", "(?:::f{4,6}:)?(?P<host>\S+)")
|
||||||
|
# Initializes the parent.
|
||||||
|
Regex.__init__(self, regex)
|
||||||
|
# Check for group "host"
|
||||||
|
if "host" not in self._regexObj.groupindex:
|
||||||
|
raise RegexException("No 'host' group in '%s'" % self._regex)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Returns the matched host.
|
||||||
|
#
|
||||||
|
# This corresponds to the pattern matched by the named group "host".
|
||||||
|
# @return the matched host
|
||||||
|
|
||||||
|
def getHost(self):
|
||||||
|
host = self._matchCache.group("host")
|
||||||
|
if host == None:
|
||||||
|
raise RegexException("Unexpected error. Please check your regex")
|
||||||
|
return host
|
117
server/filter.py
117
server/filter.py
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 471 $
|
# $Revision: 503 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 471 $"
|
__version__ = "$Revision: 503 $"
|
||||||
__date__ = "$Date: 2006-11-19 22:25:51 +0100 (Sun, 19 Nov 2006) $"
|
__date__ = "$Date: 2006-12-23 17:31:00 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -29,8 +29,10 @@ from failticket import FailTicket
|
||||||
from jailthread import JailThread
|
from jailthread import JailThread
|
||||||
from datedetector import DateDetector
|
from datedetector import DateDetector
|
||||||
from mytime import MyTime
|
from mytime import MyTime
|
||||||
|
from regex import Regex, RegexException
|
||||||
|
from failregex import FailRegex
|
||||||
|
|
||||||
import logging, re, sre_constants
|
import logging, re
|
||||||
|
|
||||||
# Gets the instance of the logger.
|
# Gets the instance of the logger.
|
||||||
logSys = logging.getLogger("fail2ban.filter")
|
logSys = logging.getLogger("fail2ban.filter")
|
||||||
|
@ -61,12 +63,10 @@ class Filter(JailThread):
|
||||||
self.__crtFilename = None
|
self.__crtFilename = None
|
||||||
## The log file path.
|
## The log file path.
|
||||||
self.__logPath = []
|
self.__logPath = []
|
||||||
## The regular expression matching the failure.
|
## The regular expression list matching the failures.
|
||||||
self.__failRegex = ''
|
self.__failRegex = list()
|
||||||
self.__failRegexObj = None
|
## The regular expression list with expressions to ignore.
|
||||||
## The regular expression with expression to ignore.
|
self.__ignoreRegex = list()
|
||||||
self.__ignoreRegex = ''
|
|
||||||
self.__ignoreRegexObj = None
|
|
||||||
## The amount of time to look back.
|
## The amount of time to look back.
|
||||||
self.__findTime = 6000
|
self.__findTime = 6000
|
||||||
## The ignore IP list.
|
## The ignore IP list.
|
||||||
|
@ -158,26 +158,26 @@ class Filter(JailThread):
|
||||||
return self.dateDetector.getDefaultPattern()
|
return self.dateDetector.getDefaultPattern()
|
||||||
|
|
||||||
##
|
##
|
||||||
# Set the regular expression which matches the failure.
|
# Add a regular expression which matches the failure.
|
||||||
#
|
#
|
||||||
# The regular expression can also match any other pattern than failures
|
# The regular expression can also match any other pattern than failures
|
||||||
# and thus can be used for many purporse.
|
# and thus can be used for many purporse.
|
||||||
# @param value the regular expression
|
# @param value the regular expression
|
||||||
|
|
||||||
def setFailRegex(self, value):
|
def addFailRegex(self, value):
|
||||||
try:
|
try:
|
||||||
if value.lstrip() == '':
|
regex = FailRegex(value)
|
||||||
self.__failRegex = value
|
self.__failRegex.append(regex)
|
||||||
self.__failRegexObj = None
|
except RegexException, e:
|
||||||
else:
|
logSys.error(e)
|
||||||
# Replace "<HOST>" with default regular expression for host.
|
|
||||||
regex = value.replace("<HOST>", "(?:::f{4,6}:)?(?P<host>\S+)")
|
|
||||||
self.__failRegex = regex
|
def delFailRegex(self, index):
|
||||||
self.__failRegexObj = re.compile(regex)
|
try:
|
||||||
logSys.info("Set failregex = %s" % self.__failRegex)
|
del self.__failRegex[index]
|
||||||
except sre_constants.error:
|
except IndexError:
|
||||||
logSys.error("Unable to compile regular expression " +
|
logSys.error("Cannot remove regular expression. Index %d is not "
|
||||||
self.__failRegex)
|
"valid" % index)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Get the regular expression which matches the failure.
|
# Get the regular expression which matches the failure.
|
||||||
|
@ -185,25 +185,31 @@ class Filter(JailThread):
|
||||||
# @return the regular expression
|
# @return the regular expression
|
||||||
|
|
||||||
def getFailRegex(self):
|
def getFailRegex(self):
|
||||||
return self.__failRegex
|
failRegex = list()
|
||||||
|
for regex in self.__failRegex:
|
||||||
|
failRegex.append(regex.getRegex())
|
||||||
|
return failRegex
|
||||||
|
|
||||||
##
|
##
|
||||||
# Set the regular expression which matches the failure.
|
# Add the regular expression which matches the failure.
|
||||||
#
|
#
|
||||||
# The regular expression can also match any other pattern than failures
|
# The regular expression can also match any other pattern than failures
|
||||||
# and thus can be used for many purporse.
|
# and thus can be used for many purporse.
|
||||||
# @param value the regular expression
|
# @param value the regular expression
|
||||||
|
|
||||||
def setIgnoreRegex(self, value):
|
def addIgnoreRegex(self, value):
|
||||||
try:
|
try:
|
||||||
if value.lstrip() == '':
|
regex = Regex(value)
|
||||||
self.__ignoreRegexObj = None
|
self.__ignoreRegex.append(regex)
|
||||||
else:
|
except RegexException, e:
|
||||||
self.__ignoreRegexObj = re.compile(value)
|
logSys.error(e)
|
||||||
self.__ignoreRegex = value
|
|
||||||
logSys.info("Set ignoreregex = %s" % value)
|
def delIgnoreRegex(self, index):
|
||||||
except sre_constants.error:
|
try:
|
||||||
logSys.error("Unable to compile regular expression " + value)
|
del self.__ignoreRegex[index]
|
||||||
|
except IndexError:
|
||||||
|
logSys.error("Cannot remove regular expression. Index %d is not "
|
||||||
|
"valid" % index)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Get the regular expression which matches the failure.
|
# Get the regular expression which matches the failure.
|
||||||
|
@ -211,7 +217,10 @@ class Filter(JailThread):
|
||||||
# @return the regular expression
|
# @return the regular expression
|
||||||
|
|
||||||
def getIgnoreRegex(self):
|
def getIgnoreRegex(self):
|
||||||
return self.__ignoreRegex
|
ignoreRegex = list()
|
||||||
|
for regex in self.__ignoreRegex:
|
||||||
|
ignoreRegex.append(regex.getRegex())
|
||||||
|
return ignoreRegex
|
||||||
|
|
||||||
##
|
##
|
||||||
# Set the time needed to find a failure.
|
# Set the time needed to find a failure.
|
||||||
|
@ -413,35 +422,35 @@ class Filter(JailThread):
|
||||||
|
|
||||||
def findFailure(self, line):
|
def findFailure(self, line):
|
||||||
failList = list()
|
failList = list()
|
||||||
# Checks if failregex is defined.
|
# Checks if we must ignore this line.
|
||||||
if self.__failRegexObj == None:
|
for ignoreRegex in self.__ignoreRegex:
|
||||||
logSys.error("No failregex is set")
|
ignoreRegex.search(line)
|
||||||
return failList
|
if ignoreRegex.hasMatched():
|
||||||
# Checks if ignoreregex is defined.
|
|
||||||
if not self.__ignoreRegexObj == None:
|
|
||||||
match = self.__ignoreRegexObj.search(line)
|
|
||||||
if match:
|
|
||||||
# The ignoreregex matched. Return.
|
# The ignoreregex matched. Return.
|
||||||
logSys.debug("Ignoring this line")
|
logSys.debug("Ignoring this line")
|
||||||
return failList
|
return failList
|
||||||
match = self.__failRegexObj.search(line)
|
# Iterates over all the regular expressions.
|
||||||
if match:
|
for failRegex in self.__failRegex:
|
||||||
|
failRegex.search(line)
|
||||||
|
if failRegex.hasMatched():
|
||||||
# The failregex matched.
|
# The failregex matched.
|
||||||
date = self.dateDetector.getUnixTime(match.string)
|
date = self.dateDetector.getUnixTime(line)
|
||||||
if date == None:
|
if date == None:
|
||||||
logSys.debug("Found a match but no valid date/time found "
|
logSys.debug("Found a match but no valid date/time found "
|
||||||
+ "for " + match.string + ". Please contact "
|
+ "for " + line + ". Please contact the "
|
||||||
+ "the author in order to get support for "
|
+ "author in order to get support for this "
|
||||||
+ "this format")
|
+ "format")
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
ipMatch = DNSUtils.textToIp(match.group("host"))
|
host = failRegex.getHost()
|
||||||
|
ipMatch = DNSUtils.textToIp(host)
|
||||||
if ipMatch:
|
if ipMatch:
|
||||||
for ip in ipMatch:
|
for ip in ipMatch:
|
||||||
failList.append([ip, date])
|
failList.append([ip, date])
|
||||||
except IndexError:
|
# We matched a regex, it is enough to stop.
|
||||||
logSys.error("There is no 'host' group in the rule. " +
|
break
|
||||||
"Please correct your configuration.")
|
except RegexException, e:
|
||||||
|
logSys.error(e)
|
||||||
return failList
|
return failList
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 354 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 354 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-13 23:31:22 +0200 (Wed, 13 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 354 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 354 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-13 23:31:22 +0200 (Wed, 13 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 321 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 321 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-04 21:19:58 +0200 (Mon, 04 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
# This file is part of Fail2Ban.
|
||||||
|
#
|
||||||
|
# Fail2Ban is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Fail2Ban is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Fail2Ban; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
# Author: Cyril Jaquier
|
||||||
|
#
|
||||||
|
# $Revision: 505 $
|
||||||
|
|
||||||
|
__author__ = "Cyril Jaquier"
|
||||||
|
__version__ = "$Revision: 505 $"
|
||||||
|
__date__ = "$Date: 2006-12-24 00:20:16 +0100 (Sun, 24 Dec 2006) $"
|
||||||
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
import re, sre_constants
|
||||||
|
|
||||||
|
##
|
||||||
|
# Regular expression class.
|
||||||
|
#
|
||||||
|
# This class represents a regular expression with its compiled version.
|
||||||
|
|
||||||
|
class Regex:
|
||||||
|
|
||||||
|
##
|
||||||
|
# Constructor.
|
||||||
|
#
|
||||||
|
# Creates a new object. This method can throw RegexException in order to
|
||||||
|
# avoid construction of invalid object.
|
||||||
|
# @param value the regular expression
|
||||||
|
|
||||||
|
def __init__(self, regex):
|
||||||
|
self._matchCache = None
|
||||||
|
if regex.lstrip() == '':
|
||||||
|
raise RegexException("Cannot add empty regex")
|
||||||
|
try:
|
||||||
|
self._regexObj = re.compile(regex)
|
||||||
|
self._regex = regex
|
||||||
|
except sre_constants.error:
|
||||||
|
raise RegexException("Unable to compile regular expression '%s'" %
|
||||||
|
regex)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Gets the regular expression.
|
||||||
|
#
|
||||||
|
# The effective regular expression used is returned.
|
||||||
|
# @return the regular expression
|
||||||
|
|
||||||
|
def getRegex(self):
|
||||||
|
return self._regex
|
||||||
|
|
||||||
|
##
|
||||||
|
# Searches the regular expression.
|
||||||
|
#
|
||||||
|
# Sets an internal cache (match object) in order to avoid searching for
|
||||||
|
# the pattern again. This method must be called before calling any other
|
||||||
|
# method of this object.
|
||||||
|
# @param value the line
|
||||||
|
|
||||||
|
def search(self, value):
|
||||||
|
self._matchCache = self._regexObj.search(value)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Checks if the previous call to search() matched.
|
||||||
|
#
|
||||||
|
# @return True if a match was found, False otherwise
|
||||||
|
|
||||||
|
def hasMatched(self):
|
||||||
|
if self._matchCache:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# Exception dedicated to the class Regex.
|
||||||
|
|
||||||
|
class RegexException(Exception):
|
||||||
|
pass
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 470 $
|
# $Revision: 503 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 470 $"
|
__version__ = "$Revision: 503 $"
|
||||||
__date__ = "$Date: 2006-11-18 16:15:58 +0100 (Sat, 18 Nov 2006) $"
|
__date__ = "$Date: 2006-12-23 17:31:00 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -165,14 +165,20 @@ class Server:
|
||||||
def getFindTime(self, name):
|
def getFindTime(self, name):
|
||||||
return self.__jails.getFilter(name).getFindTime()
|
return self.__jails.getFilter(name).getFindTime()
|
||||||
|
|
||||||
def setFailRegex(self, name, value):
|
def addFailRegex(self, name, value):
|
||||||
self.__jails.getFilter(name).setFailRegex(value)
|
self.__jails.getFilter(name).addFailRegex(value)
|
||||||
|
|
||||||
|
def delFailRegex(self, name, index):
|
||||||
|
self.__jails.getFilter(name).delFailRegex(index)
|
||||||
|
|
||||||
def getFailRegex(self, name):
|
def getFailRegex(self, name):
|
||||||
return self.__jails.getFilter(name).getFailRegex()
|
return self.__jails.getFilter(name).getFailRegex()
|
||||||
|
|
||||||
def setIgnoreRegex(self, name, value):
|
def addIgnoreRegex(self, name, value):
|
||||||
self.__jails.getFilter(name).setIgnoreRegex(value)
|
self.__jails.getFilter(name).addIgnoreRegex(value)
|
||||||
|
|
||||||
|
def delIgnoreRegex(self, name, index):
|
||||||
|
self.__jails.getFilter(name).delIgnoreRegex(index)
|
||||||
|
|
||||||
def getIgnoreRegex(self, name):
|
def getIgnoreRegex(self, name):
|
||||||
return self.__jails.getFilter(name).getIgnoreRegex()
|
return self.__jails.getFilter(name).getIgnoreRegex()
|
||||||
|
@ -300,13 +306,19 @@ class Server:
|
||||||
finally:
|
finally:
|
||||||
self.__loggingLock.release()
|
self.__loggingLock.release()
|
||||||
|
|
||||||
|
##
|
||||||
|
# Sets the logging target.
|
||||||
|
#
|
||||||
|
# target can be a file, SYSLOG, STDOUT or STDERR.
|
||||||
|
# @param target the logging target
|
||||||
|
|
||||||
def setLogTarget(self, target):
|
def setLogTarget(self, target):
|
||||||
try:
|
try:
|
||||||
self.__loggingLock.acquire()
|
self.__loggingLock.acquire()
|
||||||
# Remove previous handler
|
|
||||||
logging.getLogger("fail2ban").handlers = []
|
|
||||||
if target == "SYSLOG":
|
if target == "SYSLOG":
|
||||||
hdlr = logging.handlers.SysLogHandler()
|
facility = logging.handlers.SysLogHandler.LOG_DAEMON
|
||||||
|
hdlr = logging.handlers.SysLogHandler("/dev/log",
|
||||||
|
facility = facility)
|
||||||
elif target == "STDOUT":
|
elif target == "STDOUT":
|
||||||
hdlr = logging.StreamHandler(sys.stdout)
|
hdlr = logging.StreamHandler(sys.stdout)
|
||||||
elif target == "STDERR":
|
elif target == "STDERR":
|
||||||
|
@ -318,8 +330,11 @@ class Server:
|
||||||
hdlr = logging.FileHandler(target)
|
hdlr = logging.FileHandler(target)
|
||||||
except IOError:
|
except IOError:
|
||||||
logSys.error("Unable to log to " + target)
|
logSys.error("Unable to log to " + target)
|
||||||
|
logSys.info("Logging to previous target " + self.__logTarget)
|
||||||
return False
|
return False
|
||||||
self.__logTarget = target
|
self.__logTarget = target
|
||||||
|
# Remove previous handler
|
||||||
|
logging.getLogger("fail2ban").handlers = []
|
||||||
# set a format which is simpler for console use
|
# set a format which is simpler for console use
|
||||||
formatter = logging.Formatter("%(asctime)s %(name)-16s: %(levelname)-6s %(message)s")
|
formatter = logging.Formatter("%(asctime)s %(name)-16s: %(levelname)-6s %(message)s")
|
||||||
# tell the handler to use this format
|
# tell the handler to use this format
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 470 $
|
# $Revision: 503 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 470 $"
|
__version__ = "$Revision: 503 $"
|
||||||
__date__ = "$Date: 2006-11-18 16:15:58 +0100 (Sat, 18 Nov 2006) $"
|
__date__ = "$Date: 2006-12-23 17:31:00 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -143,13 +143,21 @@ class Transmitter:
|
||||||
value = command[2]
|
value = command[2]
|
||||||
self.__server.setTimePattern(name, value)
|
self.__server.setTimePattern(name, value)
|
||||||
return self.__server.getTimePattern(name)
|
return self.__server.getTimePattern(name)
|
||||||
elif command[1] == "failregex":
|
elif command[1] == "addfailregex":
|
||||||
value = command[2]
|
value = command[2]
|
||||||
self.__server.setFailRegex(name, value)
|
self.__server.addFailRegex(name, value)
|
||||||
return self.__server.getFailRegex(name)
|
return self.__server.getFailRegex(name)
|
||||||
elif command[1] == "ignoreregex":
|
elif command[1] == "delfailregex":
|
||||||
|
value = int(command[2])
|
||||||
|
self.__server.delFailRegex(name, value)
|
||||||
|
return self.__server.getFailRegex(name)
|
||||||
|
elif command[1] == "addignoreregex":
|
||||||
value = command[2]
|
value = command[2]
|
||||||
self.__server.setIgnoreRegex(name, value)
|
self.__server.addIgnoreRegex(name, value)
|
||||||
|
return self.__server.getIgnoreRegex(name)
|
||||||
|
elif command[1] == "delignoreregex":
|
||||||
|
value = int(command[2])
|
||||||
|
self.__server.delIgnoreRegex(name, value)
|
||||||
return self.__server.getIgnoreRegex(name)
|
return self.__server.getIgnoreRegex(name)
|
||||||
elif command[1] == "findtime":
|
elif command[1] == "findtime":
|
||||||
value = command[2]
|
value = command[2]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[install]
|
[install]
|
||||||
install-purelib=/usr/lib/fail2ban
|
install-purelib=/usr/share/fail2ban
|
||||||
|
|
||||||
[sdist]
|
[sdist]
|
||||||
formats=bztar
|
formats=bztar
|
||||||
|
|
15
setup.py
15
setup.py
|
@ -18,17 +18,17 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 473 $
|
# $Revision: 511 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 473 $"
|
__version__ = "$Revision: 511 $"
|
||||||
__date__ = "$Date: 2006-11-19 22:35:54 +0100 (Sun, 19 Nov 2006) $"
|
__date__ = "$Date: 2007-01-04 13:58:21 +0100 (Thu, 04 Jan 2007) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
from distutils.core import setup
|
from distutils.core import setup
|
||||||
from common.version import version
|
from common.version import version
|
||||||
from os.path import isfile, join
|
from os.path import isfile, join, isdir
|
||||||
from sys import argv
|
from sys import argv
|
||||||
from glob import glob
|
from glob import glob
|
||||||
|
|
||||||
|
@ -113,6 +113,13 @@ if obsoleteFiles:
|
||||||
print "\t" + f
|
print "\t" + f
|
||||||
print
|
print
|
||||||
|
|
||||||
|
if isdir("/usr/lib/fail2ban"):
|
||||||
|
print
|
||||||
|
print "Fail2ban is not installed under /usr/lib anymore. The new " \
|
||||||
|
"location is under /usr/share. Please remove the directory " \
|
||||||
|
"/usr/lib/fail2ban and everything under this directory."
|
||||||
|
print
|
||||||
|
|
||||||
# Update config file
|
# Update config file
|
||||||
if argv[1] == "install":
|
if argv[1] == "install":
|
||||||
print
|
print
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 382 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 382 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-09-25 19:03:48 +0200 (Mon, 25 Sep 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 253 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 253 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-07-17 00:21:58 +0200 (Mon, 17 Jul 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 253 $
|
# $Revision: 504 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 253 $"
|
__version__ = "$Revision: 504 $"
|
||||||
__date__ = "$Date: 2006-07-17 00:21:58 +0200 (Mon, 17 Jul 2006) $"
|
__date__ = "$Date: 2006-12-23 17:37:17 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
|
|
||||||
# Author: Cyril Jaquier
|
# Author: Cyril Jaquier
|
||||||
#
|
#
|
||||||
# $Revision: 437 $
|
# $Revision: 503 $
|
||||||
|
|
||||||
__author__ = "Cyril Jaquier"
|
__author__ = "Cyril Jaquier"
|
||||||
__version__ = "$Revision: 437 $"
|
__version__ = "$Revision: 503 $"
|
||||||
__date__ = "$Date: 2006-10-30 23:48:52 +0100 (Mon, 30 Oct 2006) $"
|
__date__ = "$Date: 2006-12-23 17:31:00 +0100 (Sat, 23 Dec 2006) $"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ class GetFailures(unittest.TestCase):
|
||||||
output = ('193.168.0.128', 3, 1124013599.0)
|
output = ('193.168.0.128', 3, 1124013599.0)
|
||||||
|
|
||||||
self.__filter.addLogPath(GetFailures.FILENAME_01)
|
self.__filter.addLogPath(GetFailures.FILENAME_01)
|
||||||
self.__filter.setFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) (?:::f{4,6}:)?(?P<host>\S*)")
|
self.__filter.addFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) (?:::f{4,6}:)?(?P<host>\S*)")
|
||||||
|
|
||||||
self.__filter.getFailures(GetFailures.FILENAME_01)
|
self.__filter.getFailures(GetFailures.FILENAME_01)
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ class GetFailures(unittest.TestCase):
|
||||||
output = ('141.3.81.106', 4, 1124013539.0)
|
output = ('141.3.81.106', 4, 1124013539.0)
|
||||||
|
|
||||||
self.__filter.addLogPath(GetFailures.FILENAME_02)
|
self.__filter.addLogPath(GetFailures.FILENAME_02)
|
||||||
self.__filter.setFailRegex("Failed .* (?:::f{4,6}:)(?P<host>\S*)")
|
self.__filter.addFailRegex("Failed .* (?:::f{4,6}:)(?P<host>\S*)")
|
||||||
|
|
||||||
self.__filter.getFailures(GetFailures.FILENAME_02)
|
self.__filter.getFailures(GetFailures.FILENAME_02)
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ class GetFailures(unittest.TestCase):
|
||||||
output = ('203.162.223.135', 6, 1124013544.0)
|
output = ('203.162.223.135', 6, 1124013544.0)
|
||||||
|
|
||||||
self.__filter.addLogPath(GetFailures.FILENAME_03)
|
self.__filter.addLogPath(GetFailures.FILENAME_03)
|
||||||
self.__filter.setFailRegex("error,relay=(?:::f{4,6}:)?(?P<host>\S*),.*550 User unknown")
|
self.__filter.addFailRegex("error,relay=(?:::f{4,6}:)?(?P<host>\S*),.*550 User unknown")
|
||||||
|
|
||||||
self.__filter.getFailures(GetFailures.FILENAME_03)
|
self.__filter.getFailures(GetFailures.FILENAME_03)
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ class GetFailures(unittest.TestCase):
|
||||||
('212.41.96.185', 4, 1124013598.0)]
|
('212.41.96.185', 4, 1124013598.0)]
|
||||||
|
|
||||||
self.__filter.addLogPath(GetFailures.FILENAME_04)
|
self.__filter.addLogPath(GetFailures.FILENAME_04)
|
||||||
self.__filter.setFailRegex("Invalid user .* (?P<host>\S*)")
|
self.__filter.addFailRegex("Invalid user .* (?P<host>\S*)")
|
||||||
|
|
||||||
self.__filter.getFailures(GetFailures.FILENAME_04)
|
self.__filter.getFailures(GetFailures.FILENAME_04)
|
||||||
|
|
||||||
|
@ -166,3 +166,32 @@ class GetFailures(unittest.TestCase):
|
||||||
except FailManagerEmpty:
|
except FailManagerEmpty:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def testGetFailuresMultiRegex(self):
|
||||||
|
output = ('141.3.81.106', 8, 1124013541.0)
|
||||||
|
|
||||||
|
self.__filter.addLogPath(GetFailures.FILENAME_02)
|
||||||
|
self.__filter.addFailRegex("Failed .* from <HOST>")
|
||||||
|
self.__filter.addFailRegex("Accepted .* from <HOST>")
|
||||||
|
|
||||||
|
self.__filter.getFailures(GetFailures.FILENAME_02)
|
||||||
|
|
||||||
|
ticket = self.__filter.failManager.toBan()
|
||||||
|
|
||||||
|
attempts = ticket.getAttempt()
|
||||||
|
date = ticket.getTime()
|
||||||
|
ip = ticket.getIP()
|
||||||
|
found = (ip, attempts, date)
|
||||||
|
|
||||||
|
self.assertEqual(found, output)
|
||||||
|
|
||||||
|
def testGetFailuresIgnoreRegex(self):
|
||||||
|
output = ('141.3.81.106', 8, 1124013541.0)
|
||||||
|
|
||||||
|
self.__filter.addLogPath(GetFailures.FILENAME_02)
|
||||||
|
self.__filter.addFailRegex("Failed .* from <HOST>")
|
||||||
|
self.__filter.addFailRegex("Accepted .* from <HOST>")
|
||||||
|
self.__filter.addIgnoreRegex("for roehl")
|
||||||
|
|
||||||
|
self.__filter.getFailures(GetFailures.FILENAME_02)
|
||||||
|
|
||||||
|
self.assertRaises(FailManagerEmpty, self.__filter.failManager.toBan)
|
||||||
|
|
Loading…
Reference in New Issue