Filtrador de LOGS

Actualmente: EN DESARROLLO

Fecha de inicio 5 de Enero de 2009

Monitor de LOGS

STATUS: Desarrollo

Script en perl para leer archivos de log y en caso de encontrar coincidencias con una expresión regular enviar por mail las lineas filtradas con los mensajes de log.

A su vez guarda el estado de lectura de los logs, o sea cuantas lineas de el log leyo para no tener que releer todo el log de nuevo cada vez que quiere acceder a los datos y no mostrar mensajes repetidos.

Aquí se detallan algunas de las características:

Totalmente escrito en perl, debería funcionar en win, lin y aix.

Envío por correo conectándose a un smtp (perl)

Log con todas las operaciones realizadas (falta definir formato)

Íntegramente configurable desde un archivo de conf.

TODO

Cuando encuentra lineas de log repetidas que deben ser enviadas por correo, debería reemplazar las repetidas por una leyenda parecida a “La ultima linea se repitió N veces.”

Dependencias

Al momento de desarrollar la aplicacion se utilizaron las siguientes versiones.

Perl 5.8.8

Debian Etch 4.0

Modulos de Perl

Config::IniFiles

File::Basename

Net::SMTP

Configuracion

La configuracion del paquete se realiza por medio de un archivo de configuracion general, donde se establecen diferentes directivas.

[general]
; directorio con los archivos de configuracion para cada servidor
servidores_dir = servidores
; directorio con los archivos de logs del monitor
registros_dir = registros
; registros de lectura de los logs, cuanto se proceso, para saber cuanto falta
offsets_dir = offsets
; directorio donde encontrar los plugins
plugins_dir = plugins
; servidor smtp ip y puerto
smtp_server = 10.1.1.76:25
; prefijo para el asunto de los mails
mail_prefix = [LogMonitor]

Archivo individual de configuracion de cada servidor

[configuracion]
; yes | no
activo = yes
; registros activos que se revisan
;registros = messages,apache,daemon,auth,oracle
registros = auth-ssh
[messages]
mail = cayu@cayu.com.ar
archivo = /var/log/messages
patron = sergio
etiqueta= MESSAGES
[auth-ssh]
mail = cayu@cayu.com.ar
archivo = /var/log/auth.log
procesador = ssh.pl
etiqueta= AUTH
; formato del email
formato_mail = html
[oracle-alert-t24]
mail = cayu@cayu.com.ar
archivo = /var/log/alert_OT2P1N1.log
procesador = oracle_alert.pl
patron = ALTER DATABASE
etiqueta= ORACLE
[oradriver]
mail = cayu@cayu.com.ar
archivo = /var/log/ORAdriver.log.1
etiqueta= ORADRIVER
[apache]
mail = cayu@cayu.com.ar
archivo = /var/log/apache2/access.log.1
patron = ico
etiqueta= APACHE
[daemon]
mail = cayu@cayu.com.ar
archivo = /var/log/daemon.log
patron = failed
etiqueta= DAEMON

La idea es configurar uno por servidor para su ejecucion local por medio de CRON, y que esta configuracion este desplegada por RSYNC para una mas rapida configuracion, con los cual modificamos los archivos en el servidor central y se repliegan por todos los servidores de la red.

Ademas se desarrollo la posibilidad de agregar plugins para el procesamiento individual de los archivos de logs combinandolo con la logica de logtail.

Notas

Actualmente en desarrollo, proximamente documentacion final del proyecto.

Para el desarrollo del plugin para chequear los archivos logs de auth de ssh use como referencia http://www.governmentsecurity.org/forum/index.php?showtopic=17795

#!/usr/bin/perl # /var/log/messages parser coded by tgo # http://www.anomalous-security.org use warnings; open(F,"/var/log/messages") or die($!); my %ips; while(<F>) { if ($_ =~ /(\d+\.\d+\.\d+\.\d+)/) { $ip = $1; if ($_ =~ /Accepted/) { $action = "accepted"; } elsif($_ =~ /Failed password/) { $action = "failed"; } else { next; } if (defined($ips{$ip}{$action})) { $ips{$ip}{$action} = $ips{$ip}{$action} + 1; } else { $ips{$ip}{$action} = 1; } } } close(F); for my $ip ( keys %ips ) { $ips{$ip}{'accepted'} = 0 unless (defined($ips{$ip}{'accepted'})); $ips{$ip}{'failed'} = 0 unless (defined($ips{$ip}{'failed'})); $total = $ips{$ip}{'accepted'} + $ips{$ip}{'failed'}; print "------- Report for $ip -----------\n"; print "Total Entries: " . $total . "\n"; print "Accepted Logins: " . $ips{$ip}{'accepted'} . "\n"; print "Failed Logins: " . $ips{$ip}{'failed'} . "\n"; }

Ejemplo de salida de ejecución

------- Report for 60.28.27.14 -----------
Total Entries: 41
Accepted Logins: 0
Failed Logins: 41
------- Report for 210.56.192.70 -----------
Total Entries: 1261
Accepted Logins: 0
Failed Logins: 1261
------- Report for 202.201.5.139 -----------
Total Entries: 19
Accepted Logins: 0
Failed Logins: 19

Archivos :

logtail0.1.tgz

logtail0.2.tgz