Antivirus/antispam para sendmail en FreeBSD

Autor: Emilio Florido
Fecha: 17/4/2004


Algo sobre sendmail

Aunque sendmail se pueda considerar un buen programa para gestionar el correo electrónico de una red, también es verdad que tal y como se instala por defecto, es mejorable. Entre las mejoras que se le pueden incluir, podemos considerar la de aprovechar su facilidad para interaccionar con otros programas y hacer que todos los mensajes que él procese se revisen por si llevan algo "incluido" (por llamar de alguna forma a un virus que venga "de regalo" con algún mensaje), o que si el mensaje que acaba de llegar nadie lo ha solicitado (por llamar de alguna forma a los mensajes basura o "spam") se eliminen sin más.

La situación de partida

El caso que aquí voy a comentar consiste en una red en la que una de las máquinas -con sistema operativo FreeBSD- hará de servidor de correos para el resto de las máquinas de esa red... entre las cuales hay un buen motón de máquinas con sistema operativo Windows.

Lo que pretendo conseguir es que tanto los mensajes de correo que lleguen como los que se envíen, al pasar "a través" de la máquina FreeBSD se revisen para que ni contengan virus ni sean correo basura.

Y ya que el tema de los virus afecta más (bueno, MUCHÍSIMO MÁS) a las máquinas Windows, intentaremos que el filtrado sea lo más acorde posible a las necesidades de las máquinas que tienen ese sistema operativo.

Antes de comenzar

El proceso que voy a contar aquí está basado en como lo he realizado yo en una máquina con FreeBSD 4.8-stable. Este proceso requerirá conectarse como administrador e instalar unos cuantos programas, retocar en algunos ficheros básicos de configuración y arrancar algunos "demonios" en la máquina FreeBSD.

Con esto quiero hacer ver que siempre hay un riesgo de equivocarse y estropearlo todo (incluidas partes del sistema que no tengan en principio relación con la gestión de los mensajes de correo). Claro está que esto tampoco tiene porqué ocurrir y de hecho, a mi no me ha ocurrido siguiendo los pasos que a continuación voy a exponer... pero no está de más que desde el comienzo estés avisado de que podría ocurrir... dicho de otra forma, tu decides si seguir o no adelante.

Qué programas necesitaremos

Para detectar virus usaremos ClamAV. Este programa es un detector de ficheros con virus (incluso aunque los ficheros estén comprimidos) con licencia GPL y que se puede actualizar automáticamente cuantas veces se quiera de forma gratuita.

Para detectar el correo basura usaremos SpamAssassin. Este programa consiste en una serie de reglas (o filtros si lo prefieres) que aplicados a un mensaje de correo permiten determinar si este es o no un mensaje basura.

Para hacer que sendmail se comunique con estos dos programas recurriremos a MIMEDefang. Esto nos permitirá inspeccionar, modificar y filtrar cualquier mensaje de correos que "atraviese" sendmail.

Lógicamente, y ya que estamos usando FreeBSD, desde los "ports" será desde donde obtendremos e instalaremos todo esto. De todas formas, vamos a ir por partes y a seguir un orden concreto. Por cierto, si lo de los "ports" no te suena, tal vez sería aconsejable que dieses un vistazo a algunos de los artículos de " el demonio" o que leyeses esto antes de seguir.

Instalando ClamAV

Vamos a comenzar por instalar el programa antivirus y por actualizar su base de datos de virus conocidos. Además, comprobaremos que funciona correctamente antes de seguir con otros pasos. Para esto, y dando por sentado que te has conectado como administrador, teclea lo siguiente:

# cd /usr/ports/security/clamav
# make install

Una vez que termine el proceso, entre otras cosas, este "port" instalará clamscan que es una forma de poder usar el antivirus desde la línea de comandos y contra los ficheros o directorios que queramos (dentro de un momento lo probaremos), un "demonio" llamado clamd que permitirá que otros programas le envíen ficheros y el comprobará si esos ficheros están o no infectados por alguno de los virus que ClamAV reconoce, y también freshclam que permite actualizar de forma automática la base de datos de virus conocidos.

Comenzaremos por actualizar de forma manual la base de datos de virus, pues la que incluye ClamAV por defecto, no es más que de pruebas. Para esto, nada más fácil que teclear:

# freshclam

con lo que veremos algo similar a:

ClamAV update process started at Sat Apr 17 16:07:54 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 265, sigs: 846, f-level: 1, builder: tkojm)
Database updated (21075 signatures) from database.clamav.net (195.70.36.141).

es decir, que se realiza una conexión a la base de datos de ClamAV y que se nos actualiza automáticamente nuestra base de datos de virus conocidos.

Ahora es el momento de comprobar que tal funciona nuestro nuevo antivirus. Para esto ya no hace falta ser administrador, así que conéctate como usuario "normal", sitúate en tu directorio personal y teclea:

$ clamscan

de esta forma verás que se testean todos los ficheros de tu directorio /home. Si quieres, puedes añadirle a clamscan parámetros como -r ó -l que pueden ser interesantes (usa man clamscan para conocer las demás opciones).

Por cierto, si aún no has hecho make clean en /usr/ports/security/clamav puedes situarte ahí y teclear clamscan -r. Verás que al menos te encuentra 5 ficheros infectados... pero no te asustes, estos ficheros vienen a modo de ejemplo para comprobar el correcto funcionamiento de ClamAV y no son realmente virus.

Bueno, ahora que ya está instalado y sabemos que funciona, vamos a retocar algunos ficheros para que luego se pueda integrar con sendmail. En primer lugar, en el fichero /usr/local/etc/clamav.conf hay que cambiar la línea que pone User clamav por esta otra User mailnull ya que sendmail suele usar este "usuario" para funcionar (si quieres comprobar este punto, bastará con que ojees /etc/passwd para verificarlo tu mismo). Y otro tanto habrá que hacer en el fichero /usr/local/etc/freshclam.conf donde deberás cambiar la línea que pone DatabaseOwner clamv por una como esta DatabaseOwner mailnull.

Por otra parte, para que estos cambios luego no den problemas al arrancar los "demonios", haz también lo siguiente:

# chown -R mailnull:mailnull /var/run/clamav/
# chown -R mailnull:mailnull /var/log/clamav/
# chown -R mailnull:mailnull /usr/local/share/clamav

También es conveniente hacer que tanto el arranque del "demonio" clamd como el proceso de actualización de la base de datos de ClamAV sea automático. Para esto, añade las siguiente líneas al fichero /etc/rc.conf:

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamav_freshclam_flags="--checks=1 --datadir=/usr/local/share/clamav \
                        --daemon-notify=/usr/local/etc/clamav.conf"

Para probar que tal funcionan los cambios que hemos hecho teclea:

# /usr/local/etc/rc.d/clamav-freshclam.sh start

ahora puedes ojear el fichero /var/log/clamav/freshclam.log y deberías ver algo como:

freshclam daemon started (pid=21264)
ClamAV update process started at Sat Apr 17 17:23:14 2004
main.cvd is up to date (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
daily.cvd is up to date (version: 266, sigs: 847, f-level: 1, builder: tomek)

confirmándonos que todo está correcto.

De todas formas, para terminar la configuración de ClamAV aún nos queda otro pequeño cambio en el fichero /usr/local/etc/clamav.conf. Busca la línea LocalSocket /var/run/clamav/clamd y cámbiala por esta otraLocalSocket /var/spool/MIMEDefang/clamd.sock

Una vez hecho esto, si intentas arrancar clamd con:

# /usr/local/etc/rc.d/clamav-clamd.sh start

verás que no lo consigue (si no te imaginas el porqué, puedes ojear /var/log/clamav/clamd.log y seguro que así lo ves más claro), pero por lo pronto no le haremos mucho caso, ya que cuando instalemos los programas que nos faltan, todo se arreglará.

Instalando SpamAssassin

Afortunadamente, en esta ocasión todo será más sencillo y bastará con hacer:

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make install

ya que SpamAssassin está preparado para ser integrado con MIMEDefang, por ahora lo dejaremos aquí. Fíjate que NO tendremos que configurar ni arrancar el "demonio" spamd que se incluye con SpamAssassin, pues será MIMEDefang quien luego lo haga.

Por cierto, quizás te interese saber que SpamAssassin lo que en realidad hace es "puntuar" en cierta forma cada mensaje de correo que procesa y asignarle un valor tanto más alto cuanto más cree él que es un mensaje basura o "spam", de forma que luego nosotros podremos establecer que si esa puntuación ha sobrepasado tal o cual valor se considere o no el mensaje como "spam".

Instalando MIMEDefang

Tampoco será complicado instalar este programa. Bastará con hacer:

# cd /usr/ports/mail/mimedefang
# make install

Eso sí, necesitarás tener una versión de Perl instalada en tu máquina que sea al menos la 5.6.1. Si no es tu caso (puedes comprobarlo tecleando perl -v), haz:

# cd /usr/ports/lang/perl5
# make install

Por cierto, en el caso concreto de mi máquina después de instalar Perl también he hecho lo siguiente

# cd /usr/bin/
# mv perl perl.ant
# mv perl5 perl5.ant
# ln -s /usr/local/bin/perl perl
# ln -s /usr/local/bin/perl perl5
# ln -s /usr/local/bin/perl perl5.6.1

además de añadir en /etc/make.conf estas líneas:

PERL_VER=5.6.1
PERL_VERSION=5.6.1
PERL_ARCH=mach
NOPERL=yo
NO_PERL=yo
NO_PERL_WRAPPER=yo

Respecto a la configuración de MIMEDefang, afortunadamente, el script que viene incluido en el "port" detectará la presencia previa -como es nuestro caso- de ClamAV y de SpamAssassin y se configurará en consecuencia. De todas formas, si te quieres quedar más tranquilo y comprobar que todo ha ido bien, puedes teclear mimedefang.pl -features | grep SpamAssassin y deberías ver algo como:

# mimedefang.pl -features | grep SpamAssassin 
SpamAssassin                  : yes
Mail::SpamAssassin            : Version 2.63

o bien, teclear mimedefang.pl -features | grep CLAM con lo que verás:

#  mimedefang.pl -features | grep CLAM        
Virus:CLAMAV                  : yes (/usr/local/bin/clamscan)
Virus:CLAMD                   : yes (/usr/local/sbin/clamd)

Bueno, vamos a lo que interesa; tendrás que hacer lo siguiente:

# cd /usr/local/etc/rc.d/
# mv mimedefang.sh-dist mimedefang.sh

para que el arranque sea automático. También tendrás que retocar algunas cosas en el fichero /usr/local/etc/mimedefang/mimedefang-filter. Creo que al menos deberías cambiar:

$AdminAddress = 'postmaster@tudominio.org';
$AdminName = "Administrador de correo";
$DaemonAddress = 'postmaster@tudominio.org';
$NotifySenderSubject = 'Notificación del antivirus';
$NotifyAdministratorSubject = 'Notificación del antivirus';

(es muy probable que las dos últimas variables las tengas que incluir tu mismo en lugar de cambiarles los valores por defecto como puedes hacer con las tres primeras)

Por defecto, MIMEDefang viene configurado para eliminar sin más los mensajes con virus y muy enfocado al mundo de las máquinas con sistema operativo Windows (justo lo que comentaba al principio; si no lo crees, no tienes más que ojear las extensiones de ficheros adjuntos que rechaza por defecto). Personalmente prefiero, ya que soy el administrador de la red, que además de eliminar los mensajes con virus me comunique que lo ha hecho, por si acaso alguna de las máquinas que debo administrar está "implicada" en el asunto. Para esto, basta con que en el mismo fichero /usr/local/etc/mimedefang/mimedefang-filter busques:

if ($FoundVirus) {
   md_graphdefang_log('virus', $VirusName, $RelayAddr);
   md_syslog('warning', "Discarding because of virus $VirusName");
 action_notify_administrator("Virus: $VirusName\nEnviado por:
$Sender\nDetectado en: $RelayAddr\nDestinado a: @Recipients\n");
return action_discard();

todo debería estar tal cual lo muestro excepto la línea en rojo que es la que debes añadir. Por cierto, si te preguntas que variables están disponibles y si hay más posibilidades, nada mejor que man mimedefang-filter para que te sorprendas con la gran cantidad de acciones que se pueden llevar a cabo. Eso si, un poquito de conocimiento de programación en Perl siempre ayuda... pero tampoco es imprescindible si únicamente quieres afinar las opciones por defecto.

Quizás también te interese el fichero /usr/local/etc/mimedefang/spamassassin/sa-mimedefang.cf ya que es ahí donde se puede "afinar" algo más el comportamiento de Spamassassin. Yo únicamente destacaría la variable required_hits 5 que es con la que puedes hacer que este programa sea más o menos "sensible" al correo basura. También podrías añadir algo al fichero /usr/local/etc/mail/spamassassin/local.cf, tal vez algunas líneas como estas:

clear_report_template
report El programa de detección de Spam del sistema "_HOSTNAME_", ha
report identificado este mensaje como "correo basura".  Aún así, el
report mensaje original no se ha borrado por si no lo fuese, pero si lo
report era, podría bloquearlo en su programa de correo (cree un "filtro"
report a partir de la etiqueta "X-Spam-Score"). Si tiene alguna duda, 
report contacte con el administrador para más detalles.
report
report Contenido:  _PREVIEW_
report
report Detalles del análisis:   (_HITS_ puntos, _REQD_ requeridos)
report
report " pts regla aplicada         descripción"
report  ---- ---------------------- ---------------------------------------
report _SUMMARY_

para que los avisos de Spamassassin no aparezcan en inglés como hace por defecto.

Configurar sendmail

Ya solo queda el último paso. Debemos hacer que sendmail aproveche todo lo que hemos instalado y configurado. Si no te sientes a gusto con sendmail, quizás te interese dar un vistazo previamente a este documento, a este o incluso a este otro en "el demonio".

Consideraré que ya dispones de tu fichero .mc personalizado. Si no es así, al menos dispondrás de /etc/mail/freebsd.mc que se incluye con FreeBSD, aunque esto será porque no has querido leer los documentos que antes te he indicado ;-) . Tanto en un caso con en el otro, bastará con que lo edites y le añadas esto al final:

MAIL_FILTER(`mimedefang',`S=local:/var/spool/MIMEDefang/mimedefang.sock,F=T,T=C:
15m;S:4m;R:4m;E:10m')dnl
define(`confINPUT_MAIL_FILTERS', `mimedefang')dnl

ten mucho cuidado con las comas, puntos y comas, y comillas, pues sendmail es muy "quisquilloso" con estos temas. Si ya lo has añadido teclea:

# cd /etc/mail
# make all
# make install

Si todo ha ido bien, es el momento de teclear:

# /usr/local/etc/rc.d/mimedefang.sh restart
# /usr/local/etc/rc.d/clamav-clamd.sh restart
# make restart

es decir, poner a funcionar MIMEDefang (que ya arrancará con las modificaciones que hemos hecho en/usr/local/etc/mimedefang/mimedefang-filter), poner a funcionar a ClamAV, y finalmente poner a funcionar a sendmail con la nueva configuración.

Pruebas y ejemplos

Bueno, para hacer pruebas necesitarás algún fichero "infectado". Si, ya se que esto no es muy difícil de obtener hoy en día, pero por si acaso, puedes usar por ejemplo los que encontrarás en /usr/ports/security/clamav/work/clamav-0.70-rc/test (siempre que aún no hayas hecho make clean en /usr/ports/security/clamav/).

Bastará con que te envíes un mensaje con a ti mismo con un fichero adjunto que esté "infectado" y que observes lo que "te cuenta" tu máquina FreeBSD en el fichero /var/log/maillog. Fíjate en un extracto de lo que dice la mía:

 Apr 18 19:41:18 iesmajuelo sm-mta[195]: i3IHf2cb000195: from=<kylexdark@comcast.
net>, size=41087, class=0, nrcpts=1, msgid=<200404181741.i3IHf2cb000195@iesmajue
lo.com>, proto=ESMTP, daemon=IPv4, relay=[213.37.224.106]
Apr 18 19:41:18 iesmajuelo mimedefang.pl[99982]: MDLOG,i3IHf2cb000195,virus,Worm
.SomeFool.P,213.37.224.106,<kylexdark@comcast.net>,<eflorido@iesmajuelo.com>,
Protected Mail System 
Apr 18 19:41:18 iesmajuelo mimedefang.pl[99982]: Discarding because of virus Wor
m.SomeFool.P 
Apr 18 19:41:18 iesmajuelo sendmail[197]: i3IHfIbZ000197: Authentication-Warning
: iesmajuelo.com: mailnull set sender to postmaster@iesmajuelo.com using -f
Apr 18 19:41:18 iesmajuelo sendmail[197]: i3IHfIbZ000197: from=postmaster@iesmaj
uelo.com, size=380, class=0, nrcpts=1, msgid=<200404181941.i3IHf2cb000195@iesmaj
uelo.com>, bodytype=8BITMIME, relay=mailnull@localhost
Apr 18 19:41:18 iesmajuelo sendmail[197]: i3IHfIbZ000197: to=postmaster@iesmajue
lo.com, delay=00:00:00, mailer=local, pri=30380, dsn=4.4.3, stat=queued
Apr 18 19:41:18 iesmajuelo sm-mta[195]: i3IHf2cb000195: Milter: data, discard
Apr 18 19:41:18 iesmajuelo sm-mta[195]: i3IHf2cb000195: discarded

Además, y como eres el administrador, te deberá llegar un mensaje del "usuario" postmaster poco mas o menos como el siguiente:

From: IES El Majuelo postmaster@iesmajuelo.com
To: "Administrador de correo" postmaster@iesmajuelo.com
Date: Sun, 18 Apr 2004 19:41:18 +0200 (CEST)
Message-ID: <200404181941.i3IHf2cb000195@iesmajuelo.com>
MIME-Version: 1.0
Content-Type: text/plain
Subject: Notificación del antivirus
X-Scanned-By: MIMEDefang 2.42
X-UIDL: N3G"!L
Status: R
X-Status: N
X-KMail-EncryptionState:  
X-KMail-SignatureState:  
X-KMail-MDN-Sent: 

Virus: Worm.SomeFool.P 
Enviado por: <kylexdark@comcast.net> 
Detectado en: 213.37.224.106
Destinado a: <eflorido@iesmajuelo.com>

por cierto, esos datos son tan reales como la vida misma,..., quiero decir que los he copiado y pegado desde /var/log/maillog y de Kmail tal cual... mientras escribía estas líneas; suerte que mi máquina es FreeBSD y por tanto, poco me hubiera afectado ese mensaje de haberlo recibido :-).

Si lo que quieres es comprobar si la base de datos de virus se actualiza correctamente, o bien esperas el tiempo de actualización fijado por defecto (da un vistazo a la variable Checks del fichero /usr/local/etc/freshclam.conf) o bien, envíale una señal 14 al número de proceso que tenga freshclam... a ver, más fácil, teclea /usr/local/etc/rc.d/clamav-freshclam.sh status y si te contesta por ejemplo clamav_freshclam is running as pid 68036 teclea kill -14 68036 y observa que ocurre en /var/log/clamav/freshclam.log.

Más información

Si algo de lo que he contado no te ha quedado claro, prueba a pasarte por aquí y, aunque en inglés, quizás consigas aclararte. Es más, si no te da miedo ese idioma, del mismo autor de ese artículo (Michael Lucas), hay otros cuantos más que te pueden resultar muy interesantes.

También puedes pasarte por aquí en donde tienes un filtro para MIMEDefang "a lo grande".

Por otra parte, en esta página tienes algunos ejemplos sobre como hacer que "OutLook" sepa tratar con los datos que añade SpamAssassin a las cabeceras de los mensajes.

Conclusiones

Aunque justo tras instalar sendmail este no aporte muchos "extras", si que gracias a su diseño es posible incluirle algunas opciones que pueden por una parte simplificar la tarea del administrador de una red (al evitar la propagación de virus) y por otra mejorar la impresión que de ella tienen los usuarios (al librarles de buena parte del correo basura).

Si has leído este artículo habrás visto que únicamente con software libre y con FreeBSD como sistema operativo hemos conseguido el doble objetivo que antes comentaba.

Agradecimientos

Finalmente, y como otras veces, no estará de más desde aquí mostrar mi agradecimiento a toda la gente que hace posible FreeBSD. Por supuesto acepto cualquier sugerencia al respecto y si tengo que aclarar algo o corregir cualquier error estoy dispuesto a hacerlo.


Emilio Florido (eflorido@iesmajuelo.com)