**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.