Estadísticas de correo: MailWatch

Vamos a utilizar MailWatch para realizar estadísticas de virus en el correo, y otras labores de gestión. MailWatch necesita MySQL para guardar los logs de MailScanner, Apache para servir las páginas y PHP. Vamos a instalarlos.

    apt-get install apache2 libapache2-mod-php5 php5php5-common php-pear php5-gd php5-cli php5-mysql
    apt-get install
mysql-server-5.0 mysql-client-5.0

Asignamos una clave de acceso al usuario root en MySQL.

    mysqladmin -u root password 'MIPASSWORD'

Nos descargamos MailWatch de internet y lo descomprimimos.

    mkdir -p/root/download/mailwatch
    wget -P /root/download/mailwatch http://heanet.dl.sourceforge.net/sourceforge/mailwatch/mailwatch-1.0.4.tar.gz
    cd /root/download/mailwatch
    tar -zxf mailwatch*

Creamos la base de datos mailscanner.

    cd mailscanner
    mysql -u root -p < create.sql

Damos permisos al usuario de la base de datos mailscanner (mailwatch).

    mysql -u root -p
    mysql>GRANT ALL ON mailscanner.* TO mailwatch@localhost IDENTIFIED BY 'MAILWATCHPASAHITZA';
    mysql>GRANT FILE ON *.* TO mailwatch@localhost IDENTIFIED BY 'MAILWATCHPASAHITZA';
    mysql>FLUSH PRIVILEGES;
    mysql>quit

Copiar el fichero MailWatch.pm al directorio /etc/MailScanner/CustomFunctions.

    mv MailWatch.pm /etc/MailScanner/CustomFunctions/

Ahora editamos /etc/MailScanner/CustomFunctions/MailWatch.pm y cambiamos las siguinetes líneas con nuestros valores (aprox: lineas 43 y 44).

my($db_user) = 'mailwatch';
my($db_pass) = 'MAILWATCHPASAHITZA';

Creamos un usuario Web para gestionar MailWatch.

    mysql mailscanner -u mailwatch -p
    mysql>INSERT INTO users VALUES ('mwadmin', MD5('PASSWORDUSUARIOWEBMAILWATCH'), 'MailWatch administraria', 'A', 0, 0, 0, 0, '');
    mysql>quit

Ahora copiamos el directorio mailscanner al directorio raiz del servidor web.

    mv /root/download/mailwatch/mailwatch/mailscanner /var/www/

Modificamos los permisos de los subdirectorios images e images/cache del directorio mailscanner. Debemos hacer que sean legibles y escribibles por el servidor web.

    chown root:www-data /var/www/mailscanner/images
    chown root:www-data /var/www/mailscanner/images/cache
    chmod ug+rwx /var/www/mailscanner/images
    chmod ug+rwx /var/www/mailscanner/images/cache

Ahora creamos el fichero conf.php en /var/www/mailscanner/. Para ello copiamos el fichero conf.php.example.

    cp /var/www/mailscanner/conf.php.example /var/www/mailscanner/conf.php

Modificamos /var/www/mailscanner/conf.php para adaptarlo a nuestra instalación. Las siguientes líneas deben quedar como sigue:

define (DB_USER, 'mailwatch');
define (DB_PASS, 'MAILWATCHPASAHITZA');
define (MAILWATCH_HOME, '/var/www/mailscanner');
define (MS_CONFIG_DIR, '/etc/MailScanner');
define (MS_LIB_DIR, '/var/lib/MailScanner');
define (SA_DIR, '/usr/bin');
define (SA_RULES_DIR, '/usr/share/spamassassin');
define (SA_PREFS, MS_CONFIG_DIR.'spam.assassin.prefs.conf');

Ahora vamos a configurar MailScanner para enviar el registro de logs a la base de datos de MySQL. Primero paramos el servicio MailScanner

    /etc/init.d/mailscanner stop

Nos aseguramos que en el fichero de configuración /etc/MailScanner/MailScanner.conf aparezcan los siguientes parámetros.

Always Looked Up Last = &MailWatchLogging
Detailed Spam Report = yes
Quarantine Whole Message = yes
Quarantine Whole Messages As Queue Files = no
Include Scores In SpamAssassin Report = yes
Quarantine User = root
Quarantine Group = www-data
Quarantine Permissions = 0660

Copiar el fichero SQLBlacklistWhitelist.pm, de  /root/download/mailwatch/mailwatch a /etc/MailScanner/CustomFunctions.

    cp /root/download/mailwatch/mailwatch/SQLBlacklistWhitelist.pm  /etc/MailScanner/CustomFunctions/

En el fichero de configuración /etc/MailScanner/MailScanner.conf poner:

Is Definitely Not Spam = &SQLWhitelist
Is Definitely Spam = &SQLBlacklist

Modificar /etc/MailScanner/CustomFunctions/SQLBlacklistWhitelist.pm. En la función CreateList,  poner los parámetros de acceso a la base de datos iguales que en el fichero /etc/MailScanner/CustomFunctions/MailWatch.pm. En la línea 105 (aprox.) y siquiente se debe tener:

my($db_user) = 'mailwatch';
my($db_pass) = 'MAILWATCHPASAHITZA';

Movemos las base de datos bayesianas, y ponemos los permisos. En /etc/MailScanner/spam.assassin.prefs.conf ponemos:

bayes_path /etc/MailScanner/bayes/bayes
bayes_file_mode 0660

Creamos el nuevo directorio, le damos la propiedad al servidor web, y le ponemos el setgid.

    mkdir /etc/MailScanner/bayes
    chown root:www-data /etc/MailScanner/bayes
    chmod g+rws /etc/MailScanner/bayes

Copiamos las bases de datos bayesianas existentes y cambiamos los permisos.

    cp /var/lib/MailScanner/* /etc/MailScanner/bayes/
    chown root:www-data /etc/MailScanner/bayes/bayes_*
    chmod g+rw /etc/MailScanner/bayes/bayes_*

Verificamos que SpamAssassin funciona correctamente con las nuevas bases de datos bayesianas.

    spamassassin -p /etc/MailScanner/spam.assassin.prefs.conf --lint

Y debe aparecer algo así como:

debug: using "/etc/MailScanner/spam.assassin.prefs.conf" for user prefs file
debug: bayes: 28821 tie-ing to DB file R/O /etc/MailScanner/bayes/bayes_toks
debug: bayes: 28821 tie-ing to DB file R/O /etc/MailScanner/bayes/bayes_seen
debug: bayes: found bayes db version 2
debug: Score set 3 chosen.

Pero... aparecen dos errores.

Parece ser que hay un bug en esta versión de SpamAssassin. Debemos comentar tres líneas en el fichero /usr/share/spamassassin/20_dnsbl_tests.cf, para que no realice cierto test de listas negras a través de dns. Quedarían de la siguiente manera (aprox: línea 190 y siguientes):

# header DNS_FROM_AHBL_RHSBL ................
# describe DNS_FROM_AHBL_RHSBL .............
# tflags DNS_FROM_AHBL_RHSBL .............

Además, en el fichero /usr/share/spamassassin/50_scores.cf debemos comentar otra línea que quedaría:

# score DNS_FROM_AHBL_RHSBL .............

Otro bug. En el fichero /usr/share/spamassassin/25_body_tests_es.cf hay una cadena demasiado larga. Tiene más de 50 caracteres, por lo que hay que acortar la última palabra. Debe quedar así:

describe EXCUSE_ES_03    Someone requested a spammer to spam you in Sp

Al verificar de nuevo SpamAssassin, no indica error alguno.

Reiniciamos MailScanner.

    /etc/init.d/mailscanner start

En el fichero de registro /var/log/mail.log debemos ver algo parecido a:

Jun 13 12:18:23 pagasarri MailScanner[26388]: MailScanner E-Mail Virus Scanner version 4.41.3 starting...
Jun 13 12:18:23 pagasarri MailScanner[26388]: Read 120 hostnames from the phising whitelist
Jun 13 12:18:24 pagasarri MailScanner[26388]: Config: calling custom init function SQLBlacklist
Jun 13 12:18:24 pagasarri MailScanner[26388]: Starting up SQL Blacklist
Jun 13 12:18:24 pagasarri MailScanner[26388]: Read 0 blacklist entries
Jun 13 12:18:24 pagasarri MailScanner[26388]: Config: calling custom init function MailWatchLogging
Jun 13 12:18:24 pagasarri MailScanner[26388]: Started SQL Logging child
Jun 13 12:18:24 pagasarri MailScanner[26388]: Config: calling custom init function SQLWhitelist
Jun 13 12:18:24 pagasarri MailScanner[26388]: Starting up SQL Whitelist
Jun 13 12:18:24 pagasarri MailScanner[26388]: Read 0 whitelist entries
Jun 13 12:18:24 pagasarri MailScanner[26388]: Using locktype = flock

Ya tenemos todo funcionando. Ahora necesitamos acceder a la máquina desde un navegador. Como la máquina está, en una DMZ, tenemos que habilitar en el cortafuegos el acceso HTTP desde el interior.

Source

Destination

Service

Action

Zerbitzariak
Administraritza
Irakasleak

antivirus perimetral

HTTP (80)

Accept

Ahora habilitamos las extensiones de php para usar MySQL y los gráficos. En el fichero /etc/php4/apache2/php.ini, las líneas que corresponden a las extensiones han de ser descomentadas. Quedarían de la siguiente forma:

extension=mysql.so
extension=gd.so

Vamos a configurar Apache para que solo responda a peticiones realizadas desde nuestras subredes, y para que siga los enlaces simbólicos. Esto último lo realizamos porque el programa mailwatch utiliza dichos enlaces.  En el directorio /etc/apache2/conf.d/, y suponiendo que las cuatro subredes de nuestra escuela son 172.16.0.0/24, 172.16.1.0/24, 172.16.2.0/24, 172.16.3.0/24, creamos el fichero mailwatch con el siguiente contenido:

ServerAdmin webadmin@nire-eskola.net

<Directory /var/www/mailscanner>
    Option Indexes FollowSymLinks
    AllowOverride None
    Order deny.allow
    Deny from all
    Allow from 172.16.0 172.16.1 162.16.2 172.16.3
</Directory>

Vamos a hacer que el usuario en que se ejecuta Apache en Debian (www-data) sea del grupo postfix para que se pueda acceder al directorio de cuarentena. Ejecutamos el siguiente comando:

    usermod -a -G postfix www-data

En el fichero /etc/group, debe aparecer (en Sarge):

postfix:x:104:www-data

Hay dos líneas en el fichero de configuración de apache /etc/apache2/apache2.conf, que conviene descomentar. Quedarían así:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

MailScanner permite sistemas complejos, donde las reglas de spam, etc, están jerarquizadas. Esto hace qye las reglas por defecto se pongan en un sitio, las del site en otro, las locales en otro, etc. MailWatch las busca en esos lugares, y las "suma", para mostrarlas en la página web, y para actualizarlas. Además también busca el fichero de configuración en dos sitios. Si no tenemos definida esa jerarquía, no pasa nada, pero los errores en la búsqueda de ficheros quedan en el registro de errores de apache. Podemos subsanarlo creando unos enlaces simbíolicos al directorio que utilizemos. En nuestro caso:

    ln -s /usr/share/spamassassin /usr/local/share/spamassassin
    mkdir -p /usr/local/etc/mail
    ln -s /usr/share/spamassassin /usr/local/etc/mail/spamassassin
    nkdir -p /opt/MailScanner
    ln -s /etc/MailScanner /opt/MailScanner/etc

En realidad, esto es un bug de MailWatch, pues debería de ser configurable en lugar de suponer su existencia.

Si tenemos el típico iconillo que aparece en la barra de los navegadore (favicon.ico), lo ponemos en el directorio /var/www/mailscanner.

Parece que hay un problemilla con el directorio temp, cuando descarga el fichero de información geográfica de las IPs. Vamos a darle la propiedad al servidor web.

    chown www-data:www-data /var/www/mailscanner/temp

Reiniciamos el servidor web:

    /etc/init.d/apache2 restart

Hay otro BUG? en el código PHP del fichero clamav_status.php que hace que no aparezca la fecha de actualización y el número de versión de los ficheros de firmas de ClamAV. Desde la versión 0.92.1 de ClamAV, no funciona. Esto es debido a un cambio en las APIs de ClamAV. Para corregirlo, la línea siguiente:

<?passthru(get_virus_conf('clamav')." -V | awk -f ./clamav.awk");?>

debe poner:

<?passthru('/usr/sbin/clamd -V | awk -f ./clamav.awk');?>

Ahora apuntamos el navegador al antivirus (http://antibirusa.nire-eskola.net/mailscanner). Nos aparece la página de MailWatch con menús para acceder a las estadísticas, actualización de SpamAssassin, etc. Cuidado con esto. index.php es un enlace simbólico al fichero status.php. Si en la barra del navegador ponemos el nombre del servidor, funcionará. Si ponemos la IP no sigue al enlace simbólico. En este último caso deberemos de poner p.ej: http://172.16.0.5/mailscanner/status.php. En  caso de querer también que lo haga al poner la IP, debemos definir un ServerAlias en el VirtualHost, por ejemplo.

Visualización de las colas de postfix (inbound / outbound)

MailWatch no visualiza correctamente las colas de postfix. Siempre aparecen en cero. Para subsanarlo, debemos aplicar un parche al código PHP de la aplicación.

Descargamos el código y lo descomprimimos.

    wget -P /var/www/lhpaiak http://www.gbnetwork.co.uk/mailscanner/files/postfixmail.tar.gz
    tar zxf postfixmail.tar.gz

Copiamos los ficheros en el directorio de la aplicación y parcheamos el fichero functions.php.

    cp postfixmail
    cp postfix* /var/www/mailscanner/
    patch /var/www/mailscanner/functions.php functions.php.diff

Cambiamos los permisos al directorio /var/spool/postfix/hold.

    chgrp www-data /var/spool/postfix/hold
    chmod g+rw /var/spool/postfix/hold

Listo!

Liberando de cuarentena, correo con contenido peligroso

MailScanner pone en cuarentena los tipos de ficheros que le indicamos como peligrosos.

Para liberar de cuarentena el SPAM, MailWatch tiene una opción en la que podemos poner 127.0.0.1 en la WhiteList, y al liberar los mensajes de cuarentena, no los vuelve a analizar, y por ende, no los vuelve a poner en cuarentena.

No es el caso con los mensajes con contenido peligroso. Al liberarlos de cuarentena, vuelven a ser capturados por MailScanner. Para solucionarlo, vamos a crear un fichero con las reglas a seguir en el caso de mensajes de correo con ficheros considerados como contenido peligroso. Le diremos, que cuando provienen de la misma máquina, los deje pasar, y al resto, les haga el tratamiento habitual. Peara ello, en el fichero /etc/MailScanner/MailScanner.conf, la siguiente línea deberá estar de esta forma:

Dangerous Content Scanning = %rules-dir%/content.scanning.rules

Luego creamos el fichero /etc/MailScanner/rules/content.scanning.rules con el siguiente contenido:

From:        127.0.0.1    no
FromOrTo:    default        yes

Volvemos a reiniciar MailScanner:

    /etc/init.d/mailscanner force-reload

Ahora podemos liberar los mensajes de cuarentena, sin hacer cambios en la configuración de MailScanner.

MSRE (MailScannet Ruleset Editor)

MSRE es un editor de reglas para MailScanner. Utiliza para ello un interface Web. Se integra visualmente con MailWatch, utilizando hojas de estilo similares. Vamos a descargarlo al directorio /var/www/lhpaiaki y descomprimirlo.

    wget -P /var/www/lhpaiaki http://heanet.dl.sourceforge.net/sourceforge/msre/
    tar -zxf msre-0.2.2.tar.gz

Lo instalamos dentro del directorio /var/www/mailscanner.

    mkdir /var/www/mailscanner/msre
    cp msre-0.2.2/*.php /var/www/mailscanner/msre/
    cp msre-0.2.2/*.css /var/www/mailscanner/msre/

El fichero de configuración y el script de actiualización los situamos en /etc/msre.

    mkdir /etc/msre
    cp msre-0.2.2/msre_reload.sh /etc/msre/
    cp msre-0.2.2/msre.conf.sample /etc/msre/msre.conf

Ponemos el fichero de tarea de cron en /etc/cron.d/.

    cp msre-0.2.2/msre_reload.crond /etc/cron.d/

Modificamos los permisos del directorio /etc/MailScanner/rules para que MSRE pueda escribir en los ficheros que hay en su interior.

    chown -R root:www-data /etc/MailScanner/rules
    chmod g+rwxs /etc/MailScanner/rules
    chmod g+rw /etc/MailScanner/rules/*

Si deseamos podemos modificar la hoja de estilos /var/www/mailscanner/msre/style.css. Se recomienda aumentar el tamaño de las tipografías.

La configuración no la vamos a tocar.

Finalmente lo integramos con MailWatch. Deseamos que se acceda al editor desde el menú de herramientas de MailWatch. Este menú está en el fichero /var/www/mailwatch/other.php. En dicho fichero, al final de la sección de herramientas añadimos las siguientes líneas:

....
<? if($GLOBALS['user_type'] == 'A'): ?>
    <LI><A HREF="msre/">Ruleset Editor</A>
<? endif; ?>
....

Si deseamos crear un enlace desde esta misma página a PHPsysinfo, añadiremos también las siguientes líneas:

<? if($GLOBALS['user_type'] == 'A'): ?>
    <LI><A HREF="../phpsysinfo/">System information</A>
<? endif; ?>