Update to proftpd-messages filter

"Jamie" <[email protected]>
Newsgroups gmane.comp.log.logwatch.devel
Message-ID <000201c767fb$ae6d7650$010aa8c0@LENOVO2>
Apologies if this is duplicated; I sent to the mailing list before
subscribing first and suspect it was never delivered.

 

I couldn't find any revision to the proftp filter after 1.20, which doesn't
work at all with any recent release of ProFTPD. I made some changes to fix
the basic issue with the log format that was breaking it, and addressed some
message structures that had changed to the extent that they appeared in my
logs so I could deal with them. I also added a feature to summarize
unmatched entries (rather than list each of them). It's not extensively
tested, but I figured I should send it along since it works a lot better
than the most current version in the CVS.

 

http://www.trewtech.com/var/proftpd-messages

 

-Jamie

 

# proftpd-messages,v 1.20 2005/12/30 18:40:30 bjorn Exp $
##########################################################################
# $Log: proftpd-messages,v $
#
# Revision 2007/03/16 NOT AN OFFICIAL RELEASE! NOT APPROVED OR REVIEWED BY
ANYONE INVOLVED IN THE LOGWATCH PROJECT!
# USE AT YOUR OWN RISK
# Corrected to work with current release of ProFTPD (1.3.1rc2) james
treworgy [email protected]
#   NOTE this is a beta, it works for most common log entries as I have
personally received and corrections
#   to the general format were made but many entries have not been tested.
# Added support for "summarizing unmatched entries" by setting
$ftpd_ignore_unmatched = 2 in proftpd-messages.conf
#
# Revision 1.20  2005/12/30 18:40:30  bjorn
# Filtering "masquerading" statements, and corrected bug submission string,
# per B Wooster.
#
# Revision 1.19  2005/02/24 17:08:05  kirk
# Applying consolidated patches from Mike Tremaine
#
# Revision 1.6  2005/02/13 22:50:46  mgt
# patches from Pawel -mgt
#
# Revision 1.5  2005/02/13 20:28:42  mgt
# More init corrections -mgt
#
# Revision 1.4  2004/07/29 19:33:29  mgt
# Chmod and removed perl call -mgt
#
# Revision 1.3  2004/07/10 01:54:35  mgt
# sync with kirk -mgt
#
# Revision 1.16  2004/02/03 02:45:26  kirk
# Tons of patches, and new 'oidentd' and 'shaperd' filters from
# Pawe? Go?aszewski" <[email protected]>
#
########################################################
# This was written by Simon Liddington for use with Logwatch
#
# Please send all comments, suggestions, bug reports,
#    etc, to [email protected]
########################################################
 
 
$Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
$IgnoreUnmatched = $ENV{'ftpd_ignore_unmatched'};
 
$NoEndpoints = 0;
$UnmatchedEntries = 0;
 
while (defined($ThisLine = <STDIN>)) {
   if (
         ( $ThisLine =~ /FTP session closed./ ) or
         ( $ThisLine =~ /FTP session opened./ ) or
         ( $ThisLine =~ /^(ANONYMOUS )?FTP login as \'.*\' from [^ ]+ \[.*\]
to .*/ ) or
         ( $ThisLine =~ /PAM\(.*\): Authentication failure/ ) or
         ( $ThisLine =~ /^data_sendfile/ ) or
         ( $ThisLine =~ / - FTP session opened/ ) or
         ( $ThisLine =~ / - FTP session closed/ ) or
         ( $ThisLine =~ / - No certificate files found/ ) or
         ( $ThisLine =~ /FTP (no transfer|session idle) timeout,
disconnected/ ) or
         ( $ThisLine =~ / masquerading as / ) or
         ( $ThisLine =~ /FTP login timed out, disconnected/ ) or
         ( $ThisLine =~ /no such user \'.*\'/ )
      ) {
         #We don't care about these
   } elsif ( ($Host,$IP,$Email,) = ( $ThisLine =~ /^FTP session opened:
ftp\/ftp (.*)\[(.*)\] (.*)$/ ) ) {
      $Temp = "   " . $Host . " (" . $IP . "): " . $Email . " - ";
      $AnonLogins{$Temp}++;
   } elsif ( ($Host, $IP) = ( $ThisLine =~ /\((.*)\[(.*)\]\): ANON .+: Login
successful\./ ) ) {
      $Temp = "   " . $Host . " (" . $IP . ")";
      $AnonLogins{$Temp}++;
   } elsif ( ($User,$Host,$IP) = ( $ThisLine =~ /^FTP session opened:
(.*\/.*) (.*)\[(.*)\] (.*)$/ ) ) {
      $Temp = "   $Host : $User - ";
      $UserLogins{$Temp}++;
   } elsif ( ($Host,$IP,$User) = ( $ThisLine =~ /\((.*)\[(.*)\]\): USER
(.+): Login successful/ ) ) {
      $Temp = "   " . $Host . ": " . $User . " - ";
      $UserLogins{$Temp}++;
   } elsif ( ($User) = ( $ThisLine =~ /^failed login, can\'t find user
\'(.*)\' $/ ) ) {
      $Temp = "   " . "Unknown" . " (" . "Unknown.IP" . "): " . $User . " -
";
      $BadUsers{$Temp}++;
   } elsif ( ($User,$Host,$IP) = ( $ThisLine =~ /USER (.*): no such user
found from (.*) \[(.*)\] to/ ) ) {
      $Temp = "   $Host \[$IP\] : $User - ";
      $BadUsers{$Temp}++;
   } elsif ( ($Host,$IP,$User) = ( $ThisLine =~ /\((.*)\[(.*)\]\): no such
user '(.*)'.$/ ) ) {
      $Temp = "   $Host \[$IP\] : $User - ";
      #$BadUsers{$User}{$Host}++;
      $BadUsers{$Temp}++;
   } elsif ( ($Host,$User) = ( $ThisLine =~ /\[(.*)\]\): USER (.*) \(Login
failed\): Incorrect password/ ) ) {
     $Temp = "   $Host : $User - ";
      $BadPasswds{$Temp}++;
   } elsif ( ($Host,$User) = ( $ThisLine =~ /\[(.*)\]\): USER (.*) \(Login
failed\): Invalid shell/ ) ) {
      $Temp = "   $Host : $User - ";
      $BadShell{$Temp}++;
   } elsif ( ($Host,$Ip) = ( $ThisLine =~ /\((.*)\[(.*)\]\): SECURITY
VIOLATION: root login attempted./ ) ) {
      $RootLoginAttempt{$Host}++;
   } elsif ( ($Host,$IP) = ( $ThisLine =~ /\((.*)\[(.*)\]\): Maximum login
attempts \((.*)\) exceeded/ ) ) {
      $Temp = "   $Host \[$IP\] : ";
      $MaxLoginAttempts{$Temp}++;
   } elsif ( ($Host,$Reason) = ( $ThisLine =~ /\[(.*)\]\): Refused PORT
[\d,]+ \((.*)\)/ ) ) {
      $Temp = "   " . $Host . ": " . $Reason . " - ";
      $RefusedPorts{$Temp}++;
   } elsif ( ($Host,$Reason) = ( $ThisLine =~ /\(((.*)\[(.*)\])\):
Connection refused \((.*)\)./ ) ) {
      $ConnectionRefused{$Reason}{$Host}++;
   } elsif ( ($Host) = ( $ThisLine =~ /\(((.*)\[(.*)\])\): Data transfer
stall timeout/ ) ) {
      $TransferTimeout{$Host}++;
   } elsif ( $ThisLine =~ m/[^ ]*: Fatal: Transport endpoint is not
connected/ ) {
      $NoEndpoints++;
   } elsif ( ($Option) = ( $ThisLine =~ /warning: (.*) is deprecated/ ) ) {
      $DeprecatedOptions{$Option}++;
   } else {
      # Report any unmatched entries...
      $UnmatchedEntries++;
      if ($IgnoreUnmatched == 2) {
          ($Host,$IP,$Message) = ($ThisLine =~ /\((.*)\[(.*)\]\): (.*)$/);
          $Temp = "   $Host \[$IP\] : $Message - ";
          $UnmatchedList{$Temp}++;    
      } elsif ($IgnoreUnmatched == 0) {
          push @OtherList,$ThisLine . "\n";
      } 
   }
}
 
##############################################
 
if (keys %DeprecatedOptions) {
   print "\nDeprecated options in config:\n";
   foreach $Option (sort {$a cmp $b} keys %DeprecatedOptions) {
      print "   $Option\n";
   }
}
 
if ( (keys %AnonLogins) and ($Detail >= 5) ) {
   print "\nAnonymous FTP Logins:\n";
   foreach $ThisOne (sort {$a cmp $b} keys %AnonLogins) {
      print $ThisOne . $AnonLogins{$ThisOne} . " Time(s)\n";
   }
}
 
if ( (keys %DeletedFiles) and ($Detail >= 10) ) {
   print "\nFiles deleted through FTP:\n";
   foreach $ThisOne (sort {$a cmp $b} keys %DeletedFiles) {
      print $ThisOne;
      print @{$DeletedFiles{$ThisOne}};
   }
}
 
if (keys %UserLogins) {
   print "\nUser FTP Logins:\n";
   foreach $ThisOne (sort {$a cmp $b} keys %UserLogins) {
      print $ThisOne . $UserLogins{$ThisOne} . " Time(s)\n";
   }
}
 
if (keys %RootLoginAttempt) {
   print "\nSECURITY VIOLATION!!!!\n";
   print "Root login attempt from:\n";
   foreach $Host (sort {$a cmp $b} keys %RootLoginAttempt) {
      print "  $Host : $RootLoginAttempt{$Host} Time(s)\n";
   }
}
 
if (keys %MaxLoginAttempts) {
   print "\nMaximum login attempts exceeded from hosts:\n";
   foreach $Host (sort {$a cmp $b} keys %MaxLoginAttempts) {
      print "  $Host : $MaxLoginAttempts{$Host} Time(s)\n";
   }
}
 
if (keys %ConnectionRefused) {
   print "\nConnection refused with reason:\n";
   foreach $Reason (sort {$a cmp $b} keys %ConnectionRefused) {
      print "  $Reason :\n";
      foreach $Host (sort {$a cmp $b} keys %{$ConnectionRefused{$Reason}}) {
         print "      $Host : $ConnectionRefused{$Reason}{$Host} Time(s)\n";
      }
   }
}
if ((keys %BadUsers) or (keys %BadPasswds)) {
  print "\nFailed FTP Logins:\n"; 
  if (keys %BadUsers) {
       print "\n  Invalid Username:\n";
       foreach $ThisOne (sort {$a cmp $b} keys %BadUsers) {
       print $ThisOne . $BadUsers{$ThisOne} . " Time(s)\n";
       }  
    }
   if (keys %BadPasswds) {
       print "\n  Invalid Password:\n";
       foreach $ThisOne (sort {$a cmp $b} keys %BadPasswds) {
       print $ThisOne . $BadPasswds{$ThisOne} . " Time(s)\n";
       }
    }
   if (keys %BadShell) {
      print "\n  Invalid Shell:\n";
      foreach $ThisOne (sort {$a cmp $b} keys %BadShell) {
         print $ThisOne . $BadShell{$ThisOne} . " Time(s)\n";
      }
   }
}
 
 
if ( (keys %RefusedPorts) and ($Detail >= 5) ) {
   print "\nRefused PORTs:\n";
   foreach $ThisOne (sort {$a cmp $b} keys %RefusedPorts) {
      print $ThisOne . $RefusedPorts{$ThisOne} . " Time(s)\n";
   }
}
 
if ( (keys %TransferTimeout) and ($Detail >= 5) ) {
   print "\nData transfer stall timeout:\n";
   foreach $Host (sort {$a cmp $b} keys %TransferTimeout) {
      print "   $Host : $TransferTimeout{$Host} Time(s)\n";
   }
}
if ($NoEndpoints > 0) {
   print "\nTransport endpoint is not connected error $NoEndpoints
Time(s)\n";
}
 
if ($UnmatchedEntries >= 0) {
    print "\n**Unmatched Entries** ($UnmatchedEntries)\n\n";
    if ($IgnoreUnmatched == 0 ) {
        print @OtherList;
    } elsif ($IgnoreUnmatched == 2) {
        if (keys %UnmatchedList) {
           foreach $ThisOne (sort {$a cmp $b} keys %UnmatchedList) {
             print $ThisOne . $UnmatchedList{$ThisOne} . " Time(s)\n";
           } 
        } 
    }
}
 
exit(0);
 
# vi: shiftwidth=3 tabstop=3 syntax=perl et

_______________________________________________
Logwatch-Devel mailing list
[email protected]
http://www2.list.logwatch.org:81/mailman/listinfo/logwatch-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.