lunes, 6 de julio de 2015

Script para enviar reportes de acceso de SQUID con SARG



En este artículo voy a compartir mi estrategia en general y un script en particular para enviar por correo a los usuarios de un servidor proxy SQUID sus trazas de navegación a través de la herramienta SARG.

Como siempre hago, no voy a dedicar la entrada a mostrar una guía de instalación de SARG ya que en la red hay en abundancia; siempre prefiero publicar y compartir concretamente las soluciones que he encontrado a los problemas que se me presentan en el día a día en la administración de una red que cuenta con servidores Linux y Windows.
SARG es una aplicación web que permite generar reportes periódicos del log de SQUID, la misma está disponible en los repositorios de DEBIAN y UBUNTU.

apt-get install sarg

Su archivo de configuración se crea en /etc/sarg/sarg.conf 


Como comente más arriba para instalar la aplicación me guie fundamentalmente por el siguiente tutorial 

http://gutl.jovenclub.cu/wiki/doku.php?id=/tutoriales/sarg 


Esta muy buena aplicación también tiene comandos de consola para generar reportes concretos para un periodo y/o para un usuario en particular.

Estrategia General


Mi escenario es el siguiente, tengo un proxy squid corriendo sobre Debian 6.0, los usuarios y contraseña del proxy están almacenados localmente en un archivo de texto generado por la herramienta htpasswd. Se desea que todos los lunes se envié un correo a cada usuario con su traza de navegación de la semana anterior.




Adicionalmente se ha configurado el log de squid para que rote mensualmente 13 veces, o sea que conserve las trazas durante un año de modo que  cada fichero de log comprimido contendrá las trazas de un mes. A continuación mi archivo /etc/logrotate.d/squid

/var/log/squid/access.log {
   compress
   dateext
   rotate 13
   missingok
   postrotate
   test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate

   endscript

    monthly

  olddir /var/log_squid
  sharedscripts}


Como se puede apreciar los log rotados se almacenaran en la carpeta /var/log_squid que previamente debe ser creada.

Envío de las trazas de navegación a los usuarios

A pesar de que SARG tiene la posibilidad de enviar correo electrónico a través de la interface mail o mailx preferí implementar mi propia solución utilizando los paquetes ssmtp y mpack. A grandes rasgos y quizás no este empleando el lenguaje correcto en el mundo Linux (naci en Windows) ssmtp es un paquete que va instalar una interface mail o mailx en Linux y mpack permite enviar correos con adjuntos desde la línea de comandos.


Debo aclarar que el comando sarg va a generar un reporte de utilización del proxy para un usuario dado, para un intervalo de fecha dado; esto genera una estructura de carpetas con varios archivos html, en mi caso solo me intereso el archivo topsites.html que contiene todos los sitios visitados para el rango de fecha dada.


El script que veremos más adelante en esencia hará lo siguiente:
  
  1. Leer cada usuario de un archivo de texto que contiene la dirección de correo del usuario en cuyo caso el id (parte delante del @) coincide con el id de usuario del proxy.
  2. Generar el reporte para cada usuario.
  3. Enviar por correo al usuario el archivo topsites.html correspondiente

Viendo esto vamos a la esencia.


- Instalamos ssmtp y mpack

apt-get install ssmtp mpack 

Aclarar que ssmtp eliminara postfix o sendmail si estuvieran instalados en el server.

- Configuramos ssmtp

nano /ect/ssmtp/ssmtp.conf  

# Usuario a instancia de quien se enviaran los correos.
root=admin@midominio.cu

# Servidor SMTP de la red
mailhub=192.168.14.3:25


# The full hostname

hostname= midominio.cu



FromLineOverride=YES
#AuthUser=
#AuthPass=


Si tenemos configurada la autentificacion SMTP en el server mail entonces configuramos convenientemente los 2 ultimos parametros del ssmtp.conf

-       Creamos en la carpeta de squid el fichero que contendrá las direcciones de correos de los usuarios, recordar que los id coinciden con los id de usuarios de squid
 
nano /etc/squid/usuarios-proxy-mail.txt  

Contendra algo asi



Como se podrá apreciar más adelante en el script usamos el @ convenientemente como separador de campos; delante de la primera @ está el id de usuario squid y luego con esta y el segundo campo quedaría formada la dirección de correos, el tercer campo es el nombre descriptivo del usuario.

 
El script

-      Creamos un archivo de texto /etc/squid/send_email_nav.sh en la carpeta de squid con el siguiente contenido; recordar que debemos darle derechos de ejecución con la orden:
chmod +x /etc/squid/send_email_nav.sh
 

#!/bin/sh

# Variable directorio padre
dir_padre=/home/rpt-usr-sarg/

# Variables del intervalo de fechas
week=$(date --date "7 days ago" +%d/%m/%Y)
hoy=$(date --date "1 days ago" +%d/%m/%Y)

# Borrar directorios y subdirectorios con datos del anterior reporte
rm -rf $dir_padre

# Crear directorio padre
mkdir $dir_padre

# Tomar usuarios del fichero
users=$(cat /etc/squid/usuarios-proxy-mail.txt)

for u in $users
do

# Tomando usuarios y correos del fichero
id=`echo $u|cut -d@ -f1`
mail=`echo $u|cut -d@ -f2`
nombre=`echo $u|cut -d@ -f3`

# Creando directorios de usuarios
echo "Creando directorio /home/$id -> usuario=$id mail=$id@$mail"
mkdir $dir_padre$id

# Generando reportes
sarg -u $id -o $dir_padre$id -d $week-$hoy

#Moverse a la carpeta del usuaro
cd $dir_padre$id

# Buscar el fichero topsites.html desde la carpeta del usuario
find -type f -name "topsites.html" -exec cp {} $dir_padre$id \;

# Enviar el correo
mpack -s "$nombre le enviamos su traza de navegación del $week-$hoy" $dir_padre$id/topsites.html $id@$mail


# Moverse a la carpeta padre
cd ..

done

# fin del script

-      Finalmente programamos la ejecución del script para todos los lunes a las 7:30 AM (el script contendra las trazas de lunes a domingo de la semana anterior)


Ejecutamos crontab –e

Y escribimos el siguiente contenido

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/



30 7 * * 1 /etc/squid/send_email_nav.sh