**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: [[http://www.ahristov.com/tutoriales/trucos-linux/comandos-vi.html|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 <>
¿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:__
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:
#chmod 744 /home/tu_nombre_de_usuario/eximreports.sh
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 ‘’
Congelar un correo:
#exim4 -Mf ‘’
Procesar un correo:
#exim4 -M ‘’
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 ‘’
Ver las cabeceras de un correo:
#exim4 -Mvh ‘’
Ver el cuerpo de un correo:
#exim4 -Mvb ‘’
Ver los logs de un correo:
#exim4 -Mvl ‘’
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.