Guía de Exim4+Usuarios virtuales(con MySQL)+ClamAV+Squirrelmail+Courier IMAP y POP3+Spamassassin+Restricción de dominios

En esta guía se hace mención a herramientas complementarias como: editores de texto las cuales se supone el usuario domina. Además se recomienda leer toda la documentación disponible del Exim ya sea a través de los sitios oficiales u otros que contribuyan a la comprensión del funcionamiento seguro del mismo y su interacción con otras aplicaciones.

Comenzamos…

Abrimos una consola o terminal, como usuario root y tecleamos:

#aptitude install exim4-daemon-heavy

como en Debian por defecto viene instalado el paquete, exim4-daemon-light, al ejecutar este comando el sistema te dirá que es necesario desinstalarlo pues entra en conflicto con el paquete exim4-daemon-heavy, oprimimos la tecla Enter que es la opción implícita para aceptar dicha sugerencia del sistema,

al finalizar ejecutamos:

#dpkg-reconfigure -plow exim4-config

A continuación el instalador nos hará una serie de preguntas que iremos respondiendo de la siguiente forma:

Tipo de configuración general del correo: Internet site; el correo se envía y recibe directamente usando SMTP.

Nombre del sistema de correo: nombre-de.tu-host

Direcciones IP en las que recibir conexiones SMTP entrantes: lo dejamos en blanco

Otros destinos para los que se acepta el correo: nombre-de.tu-host

Dominios para los que se reenvía correo: lo dejamos en blanco

Maquinas para las cuales reenviar el correo: lo dejamos en blanco

¿Limitar el número de consultas de DNS (marcación bajo demanda)?: no

Mecanismo de entrega para el correo local: formato mbox en <</var/mail>>

¿Dividir la configuración en pequeños ficheros?: no

si después por algún motivo queremos cambiar algo en estos pasos, lo podemos hacer ejecutando nuevamente:

#dpkg-reconfigure -plow exim4-config

Una vez terminado este paso, vamos a ir editando de forma manual con nuestro editor de textos preferido los ficheros del Exim.

Para la configuración TLS/SSL

Editamos el archivo: /etc/exim4/exim4.conf donde las siguientes líneas deben quedar como se muestra a continuación:

hide mysql_servers = 127.0.0.1/nombrebasededatos/usuariodelabasededatos/passwd

smtp_enforce_sync = false

tls_advertise_hosts = *

ejecutamos en consola:

#/usr/share/doc/exim4-base/examples/exim-gencert

#addgroup Debian-exim sasl

#/etc/init.d/exim4 restart

Ahora, para comprobar que Exim esta ejecutándose:

#telnet localhost 25

debería salir algo como esto:

Trying 127.0.0.1…

Connected to localhost.

Escape character is ‘^]’.

220 localhost.localdomain ESMTP Exim 4.72 Fri, 28 Oct 2011 14:17:29 +0200

ahi mismo tecleamos:

EHLO localhost

y debería salir:

250-localhost.localdomain Hello localhost [127.0.0.1]

250-SIZE 52428800

250-PIPELINING

250 HELP

hasta aquí todo va en orden, ahora pasamos a instalar el ClamAV.

Instalando ClamAV

#aptitude install clamav-freshclam clamav-daemon

Editamos el fichero /etc/exim4/exim4.conf donde la siguiente línea debe quedar como se muestra a continuación:

av_scanner = clamd:/var/run/clamav/clamd.ctl

Editamos el fichero /etc/exim4/exim4.conf y en la seccion ACL CONFIGURATION agrega(o descomenta si aparecen comentadas) las siguientes lineas casi al final, justo antes de accept:

# Reject messages that have serious MIME errors.
# This calls the demime condition again, but it
# will return cached results.
deny message = Serious MIME defect detected ($demime_reason)
demime = *
condition = ${if >{$demime_errorlevel}{2}{1}{0}}

# Reject file extensions used by worms.
# Note that the extension list may be incomplete.

deny message = This domain has a policy of not accepting certain \
types of attachments in mail as they may contain a \
virus. This mail has a file with a .$found_extension \
attachment and is not accepted. If you have a \
legitimate need to send this particular attachment, \
send it in a compressed archive, and it will then be \
forwarded to the recipient.
demime = exe:com:vbs:bat:pif:scr

# Reject messages containing malware.
deny message = This message contains a virus ($malware_name) and \
has been rejected.
malware = *

# accept otherwise
accept

nota: cuando estamos editando ficheros en modo texto todas las lineas que comienzan con el caracter # quiere decir que están comentadas.

con esto estamos rechazando los correos con adjuntos potencialmente peligrosos como pueden ser los .exe .com .vbs .bat .pif .scr estamos en libertad de agregar o quitar las extensiones que deseemos según nuestras circunstancias y necesidades, y también estamos rechazando los correos donde se detecten virus.

nota: Asegurarnos que en el fichero /etc/exim4/exim4.conf tengamos descomentada la linea referente a esta ACL que sería:

acl_smtp_data = acl_check_data

y normalmente se encuentra entre las primeras lineas.

Creamos el directorio /var/spool/exim4/scan con atributos de escritura:

#mkdir -p -m 777 /var/spool/exim4/scan

Agregamos el usuario clamav al grupo Debian-exim:

#addgroup clamav Debian-exim

Reiniciamos exim4:

#/etc/init.d/exim4 restart

Reiniciamos clamav-daemon:

#/etc/init.d/clamav-daemon restart

Instalando Courier:

#aptitude install courier-pop-ssl
no–>ficheros web

nota:Decimos no en la primera pregunta y en la segunda seleccionamos ficheros web

#aptitude install courier-authlib-mysql

#aptitude install php5 phpmyadmin

Creamos el directorio para los correos:

#sudo mkdir -m 600 /usr/local/vdomains
#sudo chown mail:mail /usr/local/vdomains

Creamos un dominio:

#mkdir -m 600 /var/mail/vdomains/tudominio.com
#mkdir -m 600 /var/mail/vdomains/tudominio.com/usuarios

Creamos los directorios para los buzones de cada usuario (este paso lo debes repetir cada vez que vayas a agregar un nuevo usuario de correo)

#maildirmake /var/mail/vdomains/tudominio.com/usuarios/nombre_de_usuario

Le damos permisos recursivos a mail sobre los directorios bajo /var/mail/vdomains/tudominio.com/users/nombre_de_usuario

Para que se puedan descargar y enviar los correos en esos directorios.

#chown -R mail:mail /var/mail/vdomains/tudominio.com/usuarios/nombre_de_usuario

Instalando los paquetes necesarios para las bases de datos

#aptitude install mysql-server mysql-client libmysqlclient16 libmysqlclient-dev

después de terminar de instalar ejecutamos en consola:

#mysql -u root -p

Enter password:(aquí entramos la contraseña que pusimos al momento de instalar)

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 2552

Server version: 5.1.49-3 (Debian)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

This software comes with ABSOLUTELY NO WARRANTY. This is free software,

and you are welcome to modify and redistribute it under the GPL v2 license

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

aquí ejecutamos las órdenes siguientes :

insert into domains (userid) values (tudominio.com);

insert into users (id, crypt, name, uid, gid, home, maildir) values (‘usuario@tudominio.com’, encrypt(‘password’), ‘Nombre’, ’8′, ’8′, ‘/var/mail/vdomains/tudominio.com/usuarios/nombre_de_usuario’, ‘/var/mail/vdomains/tudominio.com/users/usuario/’);

con eso ya tenemos listas las bases de datos para los usuarios virtuales.

Configurando Courier

Editamos el archivo: /etc/courier/authdaemonrc donde las siguientes líneas deben quedar como se muestra a continuación:

authmodulelist=”authmysql”

Editamos el archivo: /etc/courier/authmysqlrc donde las siguientes líneas deben quedar como se muestra a continuación:

MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD secret
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD id
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name

para la autenticación en el envío vía IMAP Editamos el archivo: /etc/courier/pop3d donde la siguiente línea debe quedar como se muestra a continuación:

DEFDOMAIN=”@dominio.com”

Editamos el archivo: /etc/exim4/exim4.conf donde las siguientes líneas deben quedar como se muestra a continuación:

domainlist local_domains = localhost:january.randomsequence.com:mysql;SELECT userid FROM domains WHERE userid=’$domain’;

Editamos el archivo: /etc/exim4/exim4.conf y en la sección Router agregar las siguientes líneas:

virtual_user:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{ SELECT maildir FROM users WHERE id=’${local_part}@${domain}’ }}
directory_transport = address_directory

virtual_catchall_user:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{ SELECT maildir FROM users WHERE id=’*@${domain}’ }}
directory_transport = address_directory

Editamos el archivo: /etc/exim4/exim4.conf y en la sección Transport agregar las siguientes líneas:

address_directory:
debug_print = “T: address_directory for $local_part@$domain”
driver = appendfile
envelope_to_add = true
return_path_add = true
check_string = “”
escape_string = “”
maildir_format = true
mode = 0600
user = mail
group = mail

Permitir a Exim usar el demonio de autenticación Courier.

#usermod -G daemon Debian-exim

Editamos el archivo: /etc/exim4/exim4.conf y en la sección Auth descomentar:

plain_courier_authdaemon: & login_courier_authdaemon:, comment out cram_md5:, plain: & login: sections.

Activamos los logs extendidos (para acceder a ellos ver el archivo /var/log/exim4/mainlog):

Editamos el archivo: /etc/exim4/exim4.conf donde la siguiente línea debe quedar como se muestra a continuación:

log_selector = +all

Como Courier espera tu certificado y llave en un archivo simple(y no como lo genera el comando que ejecutamos con antelación).Ejecutamos lo siguiente en una consola de root para crear un archivo simple el cual contiene a ambos(certificado y llave), sustituimos hostname por el nombre común que dimos cuando creamos el certificado SSL:

#cat /etc/exim4/exim.crt /etc/exim4/exim.key > /etc/courier/hostname.pem

Ahora, editamos ambos archivos /etc/courier/imapd-ssl y /etc/courier/pop3d-ssl y buscamos la línea TLS_CERTFILE y la cambiamos en cada uno a:

TLS_CERTFILE=/etc/courier/hostname.pem

Salvamos los archivos y reiniciamos a ambos demonios(courier-imap-ssl y courier-pop3d-ssl):

#/etc/init.d/courier-imap-ssl restart
#/etc/init.d/courier-pop-ssl restart

Debemos mantener los ojos puestos en cualquier error o falla en los demonios al reiniciar, si hay algún problema chequeamos en el archivo: /var/log/mail.err.

Nuestro demonio Courier SSL debería ahora estar usando el certificado por lo que necesitamos abrir el puerto TCP 993 y 995 para IMAPS y POP3S respectivamente. Agregamos las siguientes reglas a iptables, y nos debemos asegurar que queden guardadas si el cortafuegos es reiniciado:

#iptables -A INPUT -p tcp -d ip_de_tu_servidor_de_correos –dport 993 -j ACCEPT
#iptables -A INPUT -p tcp -d ip_de_tu_servidor_de_correos –dport 995 -j ACCEPT

Filtro para generar copia de todos los mensajes salientes y enviarlos a la dirección de correo: usuario@tudominio.cu

Creamos el fichero /etc/exim4/systemfilter.txt :

#touch /etc/exim4/systemfilter.txt

Editamos el fichero /etc/exim4/systemfilter.txt y agregar las siguientes líneas :

if $sender_address_domain is tudominio.com
then
unseen deliver usuario@tudominio.com
endif

Editamos el fichero /etc/exim4/exim4.conf y en la sección MAIN CONFIGURATION SETTINGS agregamos las líneas :

system_filter = /etc/exim4/systemfilter.txt

system_filter_directory_transport = local_copy_outgoing

Editamos el fichero /etc/exim4/exim4.conf y en la sección TRANSPORT agregamos las líneas:

local_copy_outgoing:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
group = Debian-exim
user = Debian-exim
mode = 0660
maildir_format = true
create_directory = true

nota:Clamav, agregar el usuario clamav a la carpeta /var/spool/exim4/scan/

Filtro para generar copia de todos los mensajes entrantes:

Editamos el fichero /etc/exim4/exim4.conf y en la sección TRANSPORT agregamos las líneas:

address_directory:
driver = appendfile
create_directory
delivery_date_add
directory_mode = 770
envelope_to_add
maildir_format
return_path_add
shadow_transport = local_copy_incoming
shadow_condition = ${if eq {$domain}{tudominio.cu}{yes}{no}}

esto hará un llamado al transporte nombrado:

local_copy_incoming

para entregar las copias de los mensajes, por tanto agrega estas líneas en la misma sección TRANSPORT del Exim:

local_copy_incoming:
driver = appendfile
directory = /var/mail/domain.com/mailarchive/.${tr {$local_part}{.}{_}}@${tr {$domain}{.}{_}}.incoming/
delivery_date_add
envelope_to_add
return_path_add
group = exim
user = exim
mode = 0660
maildir_format = true
create_directory = true

Restricción de envío/recibo de correos fuera del dominio .cu

Creamos un fichero con el nombre que deseemos en este caso le quise poner salida.cu (le puedes poner el nombre que desees)

#touch /etc/exim4/filters/cu/salida.cu

como verán este fichero esta en la ruta /etc/exim4/filters/cu/ pero le pueden cambiar la ruta y ponerlo donde deseen.

Dentro de este fichero agregamos todas la direcciones(una por linea) a las que queremos denegar el envío/recibo de correos fuera del dominio .cu

una vez hecho esto, vamos a /etc/exim4/exim4.conf y en la sección de las ACL es decir en ACL CONFIGURATION en la parte correspondiente a la acl_check_rcpt agregamos las siguientes lineas:

deny	message	= Su cuenta no tiene permiso para enviar correo fuera del dominio .cu
	senders	= /etc/exim4/filters/cu/salida.cu
	domains	= !*.cu

con esto estamos declarando que, todas las direcciones que estén en el archivo salida.cu si tratan de enviar correo fuera del dominio .cu les de error mostrando el mensaje Su cuenta no tiene permiso para enviar correo fuera del dominio .cu

luego a continuación agregamos las siguientes lineas:

deny	message	= El destinatario de su mensaje no tiene permiso para recibir correo fuera del dominio .cu                   
	senders	= !*.cu
     recipients = /etc/exim4/filters/cu/salida.cu

con esto estamos declarando que, si desde fuera del dominio .cu se envía un correo a alguna de las direcciones que estén en el archivo salida.cu les sea devuelto un correo de error con el mensaje El destinatario de su mensaje no tiene permiso para recibir correo fuera del dominio .cu

Instalando Squirrelmail

en consola ejecutamos:

#aptitude install squirrelmail

Una vez terminado este paso, nos posesionamos en el directorio donde está instalado el squirrelmail, en la mayoría de los casos es /etc/squirrelmail:

#cd /etc/squirrelmail/

y ejecutamos:

#./conf.pl

Luego: conf.pl → d → courier → save configuration.

nota: esto no lo hace por defecto pero debemos hacerlo para solucionar el error de crear bandeja de entrada una vez que vayamos a acceder vía web.

Deshabilitar ipv6(solo si no vamos a brindar servicios ipv6)

editar /etc/exim4/exim4.conf y agregar:

disable_ipv6 = true

Para que los usuarios puedan enviar correo vía web debemos editar el fichero /var/passwd (o el que hayamos puesto en la configuración del exim4(/etc/exim4/exim4.conf) en la sección AUTHENTICATION CONFIGURATION en la línea correspondiente, en este ejemplo es /var/passwd como se puede observar en este corte de dicha sección:

login_saslauthd_server:
driver = plaintext
public_name = LOGIN
server_prompts = “Username:: : Password::”
server_condition = “${if crypteq{$2}{${extract{1}{:}{${lookup{$1}lsearch{/var/passwd}{$value}{*:*}}}}}{1}{0}}”
server_set_id = $1

agregamos la dirección de correo (completa ej: usuario@tudominio.com) seguido de : y la contraseña encriptada ej:

usuario@tudominio.com:xcM#12arW

y para que puedan enviar vía POP3 lo mismo excepto que en lugar de poner la dirección completa se debe poner solo el nombre de usuario y a continuación la contraseña encriptada ej:

usuario:xcM#12arW

y listo…!

Instalando SPAMASSASSIN

ejecutamos en consola:

#aptitude install spamassassin

editamos /etc/spamassassin/local.cf y agregamos las líneas:

rewrite_header Subject ****SPAM****

required_score 6.0 (o el valor que deseemos)

editar /etc/default/spamassassin y cambiamos la línea:

ENABLED=0

por

ENABLED=1

editamos /etc/exim4/exim4.conf la sección TRANSPORT agregamos las líneas:

spamcheck:
debug_print = “T: spamassassin_pipe for $local_part@$domain”
driver = pipe
command = /usr/sbin/exim4 -oMr spam-scanned -bS
use_bsmtp
transport_filter = /usr/bin/spamc
home_directory = “/tmp”
current_directory = “/tmp”
user = Debian-exim
group = Debian-exim
return_fail_output
message_prefix =
message_suffix =

editamos /etc/exim4/exim4.conf la sección ROUTER agregamos las líneas:

spamcheck_router:
no_verify
check_local_user
# When to scan a message :
# – it isn’t already flagged as spam
# – it isn’t already scanned
condition = “${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}}} {1}{0}}”
driver = accept
transport = spamcheck

Para probar si está funcionando enviamos un mensaje con la siguiente línea en el asunto

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Si lo detecta como SPAM ..funciona!!, sino… a debugear el Exim.

Crear reportes diarios de forma automatizada

Una de las herramientas esenciales para cualquier Administrador de Redes es el cron, y por supuesto, en esta guía no podía quedar fuera. A través del cron llamaremos a un script, hecho previamente por nosotros, para tener un reporte diario con las estadísticas de uso del Exim.

Primero creamos un archivo con extensión .sh :

#touch /home/tu_nombre_de_usuario/eximreports.sh

hasta aquí solo hemos creado el archivo eximreports.sh en el directorio /home/tu_nombre_de_usuario/ el siguiente paso sería, darle las instrucciones, para esto abrimos dicho archivo(/home/tu_nombre_de_usuario/eximreports.sh) con el editor de texto y dentro agregamos las siguientes líneas:

#!/bin/bash

DATE=`date +%Y%m%d`

[ -d /home/tu_nombre_de_usuario/eximreports/$DATE ] || mkdir -p /home/tu_nombre_de_usuario/eximreports/$DATE

eximstats -html /var/log/exim4/mainlog > /home/tu_nombre_usuario/eximreports/ \ $DATE/eximrep.html

Cerramos nuestro editor y listo ya tenemos nuestro script para los reportes!

Explicación:

Este script creará en la carpeta /home/tu_nombre_de_usuario/eximreports/ una subcarpeta con la fecha de cada día a partir del día en que lo ejecutes por vez primera.

Como lo hace?

Sencillo, el comando:

eximstats -html /var/log/exim4/mainlog > /home/tu_nombre_usuario/eximreports/ \ $DATE/eximrep.html

extrae del archivo /var/log/exim4/mainlog (que es donde por defecto el Exim guarda sus logs) todas las estadísticas, luego convierte la salida a html y la guarda en /home/tu_nombre_de_usuario/eximreports/ en una subcarpeta con la fecha(en formato html)

El próximo paso es agregarlo al cron para que se ejecute diariamente, para esto haremos lo siguiente, editamos el fichero /etc/crontab y agregamos la línea siguiente:

00 22 * * * root /home/tu_nombre_de_usuario/eximreports.sh

guardamos los cambios y cerramos nuestro editor.

nota: 00 22 es la hora(10pm).

Le damos permisos de ejecución, para esto ejecutamos en consola el comando:

</code> #chmod 744 /home/tu_nombre_de_usuario/eximreports.sh </code>

y listo…! ahora cada día en la carpeta /home/tu_nombre_usuario/eximreports/ se creara una subcarpeta en formato /año+mes+dia/ y dentro de estas un fichero nombrado eximrep.html donde podrás ver las estadísticas del Exim4.

Misceláneas

A continuación una serie de comandos que nos pueden resultar de gran utilidad cuando necesitamos de forma rápida testear, debugear, monitorear el Exim, desde la consola como root:

Listar por pantalla los correos en cola:

#exim4 -bp

Sacar por pantalla el numero de correos en cola:

#exim4 -bpc

Muestra un resumen de los correos en cola (dominio, numero de correos, tiempo en cola y peso):

#exim4 -bp | exiqsumm

Eliminar un correo en concreto:

#exim4 -Mrm ‘<id correo>’

Congelar un correo:

#exim4 -Mf ‘<id correo>’

Procesar un correo:

#exim4 -M ‘<id correo>’

Eliminar todos los correos congelados:

#exiqgrep -z -i | xargs exim -Mrm

Sacar por pantalla que está haciendo exim:

#exiwhat

Hacer un traceroute a una dirección de correo:

#exim4 -bt ‘<id correo>’

Ver las cabeceras de un correo:

#exim4 -Mvh ‘<id correo>’

Ver el cuerpo de un correo:

#exim4 -Mvb ‘<id correo>’

Ver los logs de un correo:

#exim4 -Mvl ‘<id correo>’

Forzar cola de correo:

#exim4 -qff

Buscar correos en cola de un determinado emisor:

#exiqgrep -f [usuario]@dominio

Buscar correos en cola de un determinado receptor:

#exiqgrep -r [usuario]@dominio

Respecto a estos dos últimos comandos, exigrep es un comando extremadamente útil, dispone de muchas otras opciones que pueden ser revisadas en su respectiva ayuda.

Eliminar la cola de correo completa (dos formas):

1- #exim4 -bp | awk ‘/^ *[0-9]+[mhd]/{print “exim -Mrm ” $3}’ | sh
2- #rm /var/spool/exim4/input/*

Borrar mensajes con remitentes nulos/mensajes_de_rebote

#exim4 -bpru | grep ‘<>’ | awk {‘print $3′} | xargs exim4 -Mrm

Bibliografía:

http://www.exim.org/exim-html-4.10/doc/html/spec_toc.html
http://www.sput.nl/software/exim.html
http://www.tty1.net/virtual_domains_en.html
http://koivi.com/exim4-config/
http://bradthemad.org/tech/notes/exim_cheatsheet.php?FOO
http://swik.net/Exim
http://www.adamsinfo.com/exim-mysql-courier-imap-courier-pop3-spamassassin-vdomain-and-vuser-set-up

nota:Quien escribe este artículo no se considera un experto en este tema, por lo que si algún lector detecta o cree haber encontrado un error o bug, por favor no dude en comentar, lejos de generar molestia, todo lo contrario, será bienvenido.