mirror of https://github.com/fail2ban/fail2ban
Yaroslav Halchenko
10 years ago
1 changed files with 181 additions and 0 deletions
@ -0,0 +1,181 @@ |
|||||||
|
#!/usr/bin/perl |
||||||
|
########################################################################## |
||||||
|
# $Id: fail2ban 150 2013-06-18 22:19:38Z mtremaine $ |
||||||
|
########################################################################## |
||||||
|
# $Log: fail2ban,v $ |
||||||
|
# Revision 1.5 2008/08/18 16:07:46 mike |
||||||
|
# Patches from Paul Gear <paul at libertysys.com> -mgt |
||||||
|
# |
||||||
|
# Revision 1.4 2008/06/30 23:07:51 kirk |
||||||
|
# fixed copyright holders for files where I know who they should be |
||||||
|
# |
||||||
|
# Revision 1.3 2008/03/24 23:31:26 kirk |
||||||
|
# added copyright/license notice to each script |
||||||
|
# |
||||||
|
# Revision 1.2 2006/12/15 04:53:59 bjorn |
||||||
|
# Additional filtering, by Willi Mann. |
||||||
|
# |
||||||
|
# Revision 1.1 2006/05/30 19:04:26 bjorn |
||||||
|
# Added fail2ban service, written by Yaroslav Halchenko. |
||||||
|
# |
||||||
|
# Written by Yaroslav Halchenko <debian@onerussian.com> for fail2ban |
||||||
|
# |
||||||
|
########################################################################## |
||||||
|
|
||||||
|
######################################################## |
||||||
|
## Copyright (c) 2008 Yaroslav Halchenko |
||||||
|
## Covered under the included MIT/X-Consortium License: |
||||||
|
## http://www.opensource.org/licenses/mit-license.php |
||||||
|
## All modifications and contributions by other persons to |
||||||
|
## this script are assumed to have been donated to the |
||||||
|
## Logwatch project and thus assume the above copyright |
||||||
|
## and licensing terms. If you want to make contributions |
||||||
|
## under your own copyright or a different license this |
||||||
|
## must be explicitly stated in the contribution an the |
||||||
|
## Logwatch project reserves the right to not accept such |
||||||
|
## contributions. If you have made significant |
||||||
|
## contributions to this script and want to claim |
||||||
|
## copyright please contact logwatch-devel@lists.sourceforge.net. |
||||||
|
######################################################### |
||||||
|
|
||||||
|
use strict; |
||||||
|
use Logwatch ':all'; |
||||||
|
|
||||||
|
my $Debug = $ENV{'LOGWATCH_DEBUG'} || 0; |
||||||
|
my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0; |
||||||
|
my $IgnoreHost = $ENV{'sshd_ignore_host'} || ""; |
||||||
|
my $DebugCounter = 0; |
||||||
|
my $ReInitializations = 0; |
||||||
|
my @IptablesErrors = (); |
||||||
|
my @ActionErrors = (); |
||||||
|
my $NotValidIP = 0; # reported invalid IPs number |
||||||
|
my @OtherList = (); |
||||||
|
|
||||||
|
my %ServicesBans = (); |
||||||
|
|
||||||
|
if ( $Debug >= 5 ) { |
||||||
|
print STDERR "\n\nDEBUG: Inside Fail2Ban Filter \n\n"; |
||||||
|
$DebugCounter = 1; |
||||||
|
} |
||||||
|
|
||||||
|
while (defined(my $ThisLine = <STDIN>)) { |
||||||
|
if ( $Debug >= 5 ) { |
||||||
|
print STDERR "DEBUG($DebugCounter): $ThisLine"; |
||||||
|
$DebugCounter++; |
||||||
|
} |
||||||
|
chomp($ThisLine); |
||||||
|
if ( ($ThisLine =~ /..,... DEBUG: /) or |
||||||
|
($ThisLine =~ /..,... \S*\s*: DEBUG /) or # syntax of 0.7.? fail2ban |
||||||
|
($ThisLine =~ /..,... INFO: (Fail2Ban v.* is running|Exiting|Enabled sections:)/) or |
||||||
|
($ThisLine =~ /INFO\s+Log rotation detected for/) or |
||||||
|
($ThisLine =~ /INFO\s+Jail.+(?:stopped|started|uses poller)/) or |
||||||
|
($ThisLine =~ /INFO\s+Changed logging target to/) or |
||||||
|
($ThisLine =~ /INFO\s+Creating new jail/) or |
||||||
|
($ThisLine =~ /..,... \S+\s*: INFO\s+(Set |Socket|Exiting|Gamin|Created|Added|Using)/) or # syntax of 0.7.? fail2ban |
||||||
|
($ThisLine =~ /..,... WARNING: Verbose level is /) or |
||||||
|
($ThisLine =~ /..,... WARNING: Restoring firewall rules/) |
||||||
|
) |
||||||
|
{ |
||||||
|
if ( $Debug >= 6 ) { |
||||||
|
print STDERR "DEBUG($DebugCounter): line ignored\n"; |
||||||
|
} |
||||||
|
} elsif ( my ($Service,$Action,$Host) = ($ThisLine =~ m/WARNING:?\s\[?(.*?)[]:]?\s(Ban|Unban)[^\.]* (\S+)/)) { |
||||||
|
if ( $Debug >= 6 ) { |
||||||
|
print STDERR "DEBUG($DebugCounter): Found $Action for $Service from $Host\n"; |
||||||
|
} |
||||||
|
$ServicesBans{$Service}{$Host}{$Action}++; |
||||||
|
$ServicesBans{$Service}{"(all)"}{$Action}++; |
||||||
|
} elsif ( my ($Service,$Host,$NumFailures) = ($ThisLine =~ m/INFO: (\S+): (.+) has (\d+) login failure\(s\). Banned./)) { |
||||||
|
if ($Debug >= 4) { |
||||||
|
print STDERR "DEBUG: Found host $Host trying to access $Service - failed $NumFailures times\n"; |
||||||
|
} |
||||||
|
push @{$ServicesBans{$Service}{$Host}{'Failures'}}, $NumFailures; |
||||||
|
} elsif ( my ($Service,$Host) = ($ThisLine =~ m/ ERROR:\s(.*):\s(\S+)\salready in ban list/)) { |
||||||
|
$ServicesBans{$Service}{$Host}{'AlreadyInTheList'}++; |
||||||
|
} elsif ( my ($Service,$Host) = ($ThisLine =~ m/WARNING\s*\[(.*)\]\s*(\S+)\s*already banned/)) { |
||||||
|
$ServicesBans{$Service}{$Host}{'AlreadyInTheList'}++; |
||||||
|
} elsif ( my ($Service,$Host) = ($ThisLine =~ m/ WARNING:\s(.*):\sReBan (\S+)/)) { |
||||||
|
$ServicesBans{$Service}{$Host}{'ReBan'}++; |
||||||
|
} elsif ($ThisLine =~ / ERROR:?\s*(Execution of command )?\'?iptables/) { |
||||||
|
push @IptablesErrors, "$ThisLine\n"; |
||||||
|
} elsif ($ThisLine =~ /ERROR.*returned \d+$/) { |
||||||
|
push @ActionErrors, "$ThisLine\n"; |
||||||
|
} elsif (($ThisLine =~ /..,... WARNING: \#\S+ reinitialization of firewalls/) or |
||||||
|
($ThisLine =~ / ERROR\s*Invariant check failed. Trying to restore a sane environment/)) { |
||||||
|
$ReInitializations++; |
||||||
|
} elsif ($ThisLine =~ /..,... WARNING: is not a valid IP address/) { |
||||||
|
# just ignore - this will be fixed within fail2ban and is harmless warning |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
# Report any unmatched entries... |
||||||
|
push @OtherList, "$ThisLine\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
########################################################### |
||||||
|
|
||||||
|
|
||||||
|
if (keys %ServicesBans) { |
||||||
|
printf("\nBanned services with Fail2Ban: Bans:Unbans\n"); |
||||||
|
foreach my $service (sort {$a cmp $b} keys %ServicesBans) { |
||||||
|
printf(" %-55s [%3d:%-3d]\n", "$service:", |
||||||
|
$ServicesBans{$service}{'(all)'}{'Ban'}, |
||||||
|
$ServicesBans{$service}{'(all)'}{'Unban'}); |
||||||
|
delete $ServicesBans{$service}{'(all)'}; |
||||||
|
my $totalSort = TotalCountOrder(%{$ServicesBans{$service}}, \&SortIP); |
||||||
|
if ($Detail >= 5) { |
||||||
|
foreach my $ip (sort $totalSort keys %{$ServicesBans{$service}}) { |
||||||
|
my $name = LookupIP($ip); |
||||||
|
printf(" %-53s %3d:%-3d\n", |
||||||
|
$name, |
||||||
|
$ServicesBans{$service}{$ip}{'Ban'}, |
||||||
|
$ServicesBans{$service}{$ip}{'Unban'}); |
||||||
|
if (($Detail >= 10) and ($ServicesBans{$service}{$ip}{'Failures'}>0)) { |
||||||
|
print " Failed "; |
||||||
|
foreach my $fails (@{$ServicesBans{$service}{$ip}{'Failures'}}) { |
||||||
|
print " $fails"; |
||||||
|
} |
||||||
|
print " times"; |
||||||
|
printf("\n %d Duplicate Ban attempts", $ServicesBans{$service}{$ip}{'AlreadyInTheList'}) ; |
||||||
|
printf("\n %d ReBans due to rules reinitilizations", $ServicesBans{$service}{$ip}{'ReBan'}) ; |
||||||
|
print "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
if ($Detail>0) { |
||||||
|
if ($#IptablesErrors > 0) { |
||||||
|
printf("\n%d faulty iptables invocation(s)", $#IptablesErrors); |
||||||
|
if ($Detail > 5) { |
||||||
|
print ":\n"; |
||||||
|
print @IptablesErrors ; |
||||||
|
} |
||||||
|
} |
||||||
|
if ($#ActionErrors > 0) { |
||||||
|
printf("\n%d error(s) returned from actions", $#ActionErrors); |
||||||
|
if ($Detail > 5) { |
||||||
|
print ":\n"; |
||||||
|
print @ActionErrors ; |
||||||
|
} |
||||||
|
} |
||||||
|
if ($ReInitializations > 0) { |
||||||
|
printf("\n%d fail2ban rules reinitialization(s)", $ReInitializations); |
||||||
|
} |
||||||
|
if ($#OtherList >= 0) { |
||||||
|
print "\n**Unmatched Entries**\n"; |
||||||
|
print @OtherList; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
exit(0); |
||||||
|
|
||||||
|
# vi: shiftwidth=3 tabstop=3 syntax=perl et |
||||||
|
# Local Variables: |
||||||
|
# mode: perl |
||||||
|
# perl-indent-level: 3 |
||||||
|
# indent-tabs-mode: nil |
||||||
|
# End: |
Loading…
Reference in new issue