HowTo:Servidor:Correo
De Luispa
Servicios de Correo Electrónico
Introducción
En la mayoría de los casos, en un equipo Linux nos basta con tener un sencillo cliente de correo como Mutt, KMail o algo más sofisticado como Thunderbird. Ahora bien, en mi caso no sólo quiero tener un cliente de correo, sino que también quiero "servir" correos. Este equipo va a alojar más de un dominio con correo electrónico (además de ser estación de trabajo).
| Mi objetivo es configurar el sistema de manera que sea capaz de manejar correo para varios dominios, se soporten múltiples usuarios de correo (virtuales, que no necesiten cuentas con shell), que sus nombres sean específicos de cada dominio, que los clientes remotos de correo puedan autenticar via WEB, IMAP, SMTP y POP3 contra la base de datos SQL, que utilice SSL como capa de transporte segura, que ofrezca un INTERFAZ WEB, que se puedan crear y manejar listas de correo para cualquiera de los dominios y que todo este integrado con la base de datos MYSQL y el servidor web APACHE. Además, en la segunda fase de la instalación voy a añadir lo necesario para que el Servidor de Correo sea capaz de escanear los mails en busca de virus y que además bloquee el odioso Spam, no te pierdas la Sección del Chatarrero, al final de este artículo. |
Para conseguir este objetivo necesito montar un MTA (Mail Transfer Agent), un servidor IMAP, seguridad, integración con el servidor Web (Apache2), con el servidor de bases de datos MySQl, un scanner de mails, un antivirus y un antispam. En este artículo describo cómo he instalado y configurado mi sistema con:
- Servidor SMTP(MTA): Postfix
- Servidor Autenticación: Cyrus-SASL
- Servidor POP3/IMAP: Courier-IMAP
- Antivirus ClamAV
- Scanner de Mails: Primero usé "amavisd-new" y finalmente he pasado a "MailScanner" (ambos han quedado documentados)
- Anti Spam: Spamassassin
- Sistema Virtual: Soporte de un entorno virtual.
- Backend usuarios: Base de datos MySQL
- Otros: PHP, Apache2, Postfix.admin, phpmyadmin, squirrelmail
Preparar el sistema
Lo primero que tenemos que hacer es tener instalado, configurado y "funcionando" algunos componentes básicos con los que se va a interactuar, como son PHP, Apache2, MySQL, servicio DNS, para así poder focalizarme en el correo...
USE
- Preparar flags USE: Antes de empezar la instalación es importante que revises tus flags USE. Puedes encontrar aquí una copia de mi fichero package.use.
Otros
- Instalar PHP: * Servicios de PHP
- Instalar Apache2: * Servidor Web (Apache)
- Instalar MySQL: * Servidor de Bases de Datos (MySQL)
- Tener DNS/MX: * * Servicio de DNS . Es MUY IMPORTANTE que tu configuración de DNS este perfectamente operativa. Si estás sirviendo tus propios dominios entonces tienes que tener los registros MX bien configurados. Si tus dominios se están sirviendo desde otro sitio, asegurate que los registros MX apuntan correctamente.
- Nombre hostname: También es importante que el nombre del host este perfectamente configurado (/etc/conf.d/hostname)
Preparar LOGs de Metalog
Es importante tener bien configurado el sistema de LOG, de modo que todo lo relacionado con el Correo acabe en un fichero de Log especial (/var/log/mail/current), además del principal del sistema (/var/log/everything/current)
- Modifico el fichero /etc/metalog.conf . En negrita están resaltadas las líneas que he cambiado respecto al original. Tras su modificación hay que rearrancar el daemon (/etc/init.d/metalog restart)
- En mi caso he decidido tener un único fichero que crecerá indefinidamente para el Correo (no se va a ir rotando). De momento lo tengo así y en el futuro veré como mejorarlo.
- La razón por la que empleo esta técnica es porque utilizo AWStats para monitorizar el correo y todavía tengo pendiente ver cómo gestionar la rotación de los logs.
PostFix
El paquete postfix es el servidor SMTP, rápido y seguro, que se planteó hace años como una alternativa a sendmail (servidor smtp por excelencia). En mi caso siempre he usado sendmail sin más problemas que la creación del fichero de configuración por primera vez :-), sin embargo reconozco que hacer modificaciones o añadir funcionalidades (antispam por ejemplo) es complejo, por lo que he decidido cambiar a postfix.
Instalación de Postfix
- ¿Con qué variable USE lo he instalado?. Esta es una copia de mi fichero package.use
# emerge -pv postfix [ebuild N ] mail-mta/postfix-2.5.5 USE="ipv6 mysql pam sasl ssl vda -cdb -dovecot-sasl -hardened -ldap -mailwrapper -mbox -nis -postgres (-selinux)" 0 kB
- Instalación de Postfix
# emerge -C mail-mta/ssmtp # emerge -v postfix : (mensajes que aparecen al terminar) : * Checking for postfix group ... * Checking for postdrop group ... * Checking for postfix user ... * Generating OpenSSL configuration ... OK * Generating 1024 bit RSA key for CA ... OK * Generating Certificate Signing Request for CA ... OK * Generating self-signed X.509 Certificate for CA ... OK * Generating 1024 bit RSA key ... OK * Generating Certificate Signing Request ... OK * Generating authority-signed X.509 Certificate ... OK * Generating PEM Certificate ... OK * Fixing queue directories and permissions ... * Read "ftp://ftp.porcupine.org/mirrors/postfix-release/official/postfix-2.5.5.RELEASE_NOTES" * for incompatible changes before continueing. * Bugs should be filed at "http://bugs.gentoo.org/" and * assigned to "net-mail@gentoo.org". * You have "ssl" in your USE flags, TLS will be enabled. * This service is incompatible with the previous TLS patch. * Visit http://www.postfix.org/TLS_README.html for more info. * You have "ipv6" in your USE flags, IPV6 will be enabled. * Visit http://www.postfix.org/IPV6_README.html for more info. * Postfix 2.3 and newer supports two SASL implementations. * Cyrus SASL and Dovecot protocol version 1 (server only) * Visit http://www.postfix.org/SASL_README.html for more info. * If you upgraded from Postfix-1.x, you must revisit * your configuration files. See * /usr/share/doc/postfix-2.5.5/RELEASE_NOTES * for a list of changes. * You must edit /etc/mail/aliases to suit your needs * and then run /usr/bin/newaliases. Postfix will not * work correctly without it.
Configuración de Postfix
/etc/postfix/main.cf
Estos son los datos que necesito ahora. Más adelante volveré a modificar el fichero.
- Reemplazo las $variables con mis propios datos
/etc/postfix/main.cf myhostname = bolica.parchis.org mydomain = parchis.org inet_interfaces = all mydestination = $myhostname, localhost.$mydomain mynetworks = my.ip.net.work/24, 127.0.0.0/8 home_mailbox = .maildir/ local_destination_concurrency_limit = 2 default_destination_concurrency_limit = 10
/etc/postfix/master.cf
- Modificar lo siguiente en master.cf para activar el debugging
Aviso: QUITAR "-v" CUANDO FUNCIONE TODO !!!!
/etc/postfix/master.cf # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (50) # ========================================================================== smtp inet n - n - - smtpd -v <=== Simplemente añadir "-v"
Aviso: QUITAR "-v" CUANDO FUNCIONE TODO !!!!
/etc/mail/aliases
- Añadir tus propios alias, al menos el del root
/etc/mail/aliases root: luis@parchis.org <=== !!!
# ls -al total 12 drwxr-xr-x 2 root root 4096 Feb 24 21:22 . drwxr-xr-x 78 root root 4096 Feb 24 18:58 .. -rw-r--r-- 1 root root 859 Feb 24 21:15 aliases
- Ejecutar el comando "newaliases" (se debe hacer cada vez que se modifica el fichero anterior)
# /usr/bin/newaliases # ls -al total 24 drwxr-xr-x 2 root root 4096 Feb 24 21:22 . drwxr-xr-x 78 root root 4096 Feb 24 18:58 .. -rw-r--r-- 1 root root 859 Feb 24 21:15 aliases -rw-r--r-- 1 root root 12288 Feb 24 21:22 aliases.db
Nota: Más adelante, cuando configuremos MySQL, se usará una tabla específica para los alias donde tendremos que añadir de nuevo a root
Arrancar y probar Postfix (localmente)
Hasta este punto ya deberíamos tener lo suficiente como para poder enviar y recibir correos entre los usuarios "reales" del equipo, es decir, usuarios que existen en el sistema y tienen asignada una shell.
- Arranco Postfix
# /etc/init.d/postfix start
- Programo el arranque automático en cada boot
# rc-update add postfix default
- Compruebo con un cliente de mail que puedo enviar y recibir correos entre usuario LOCALES.
Ten en cuenta que se debe usar el directorio local $HOME/.maildir como base para los correos Yo he probado con "KMail" que ya estaba instalado, le he dicho que configure una cuenta local. Esto es temoporal, sólo para probar que puedes mandarte un mail a ti mismo por ejemplo.
ES IMPORTANTE QUE ESTO TE FUNCIONE !!!
- Te recomiendo "ver" el fichero de log desde otro terminal mientras haces las pruebas
- En mi caso he enviado un mail desde Desde: el usuario "luis" a Para: los usuarios "root" y "luis".
- Dado que todo lo que se envía a root se pasa a "luis" (acuerdate del fichero aliases) al final me han llegado 2 mails.
# tail -f /var/log/mail/current Feb 24 21:24:27 [postfix/postfix-script] starting the Postfix mail system Feb 24 21:24:27 [postfix/master] daemon started -- version 2.5.5, configuration /etc/postfix : Feb 24 21:30:49 [postfix/pickup] 15E466D4B2: uid=1500 from=<luis@parchis.org> Feb 24 21:30:49 [postfix/cleanup] 15E466D4B2: message-id=<200902242130.48854.luis@parchis.org> Feb 24 21:30:49 [postfix/qmgr] 15E466D4B2: from=<luis@parchis.org>, size=550, nrcpt=2 (queue active) Feb 24 21:30:49 [postfix/local] 15E466D4B2: to=<luis@bolica.parchis.org>, orig_to=<luis@bolica>, relay=local, delay=0.39, delays=0.28/0/0/0.1, dsn=2.0.0, status=sent (delivered to maildir) Feb 24 21:30:49 [postfix/local] 15E466D4B2: to=<luis@parchis.org>, orig_to=<root@bolica>, relay=local, delay=0.39, delays=0.28/0.01/0/0.09, dsn=2.0.0, status=sent (delivered to maildir) Feb 24 21:30:49 [postfix/qmgr] 15E466D4B2: removed
Añadirle SSL a Postfix
Creación de Certificados SSL para Postfix
Hemos compilado Postfix con soporte para SSL/TLS, de modo que todo lo que hay que hacer es crear el Certificado del Servidor y copiar la clave de servidor y el certificado de servidor al directorio /etc/postfix, y después cambiar los permisos de dichos ficheros.
- Modifico el fichero openssl.cnf
# cd /etc/ssl # e openssl.cnf (MODIFICO LOS SIGUIENTES CAMPOS) countryName_default = ES stateOrProvinceName_default = Madrid localityName_default = Villanueva del Pardillo 0.organizationName_default = Parchis organizationalUnitName_default = bolica commonName_default = smtp.parchis.org emailAddress_default = luis@parchis.org
- Creo mi propia CA (Autoridad certificadora). No olvidad las nuevas contraseñas que vamos a utilizar. También es muy importante que el campo "Organization Name" coincida con el que se crea en el certificado "server". Pongo unos ejemplos en negrita para ver cómo coinciden con el resto de comandos.
# ./CA.pl -newca
CA certificate filename (or enter to create) <Enter>
Making CA certificate ...
Generating a 1024 bit RSA private key
.....................................................................++++++
........................................................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase: password1234
Verifying - Enter PEM pass phrase: password1234
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [Madrid]:
Locality Name (eg, city) [Villanueva del Pardillo]:
Organization Name (eg, company) [Parchis]:
Organizational Unit Name (eg, section) [bolica]:
Common Name (eg, Your name) [smtp.parchis.org]:
Email Addres [luis@parchis.org]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem: password1234
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
bf:2b:43:45:a3:aa:ac:0e
Validity
Not Before: Feb 25 19:47:54 2009 GMT
Not After : Feb 25 19:47:54 2012 GMT
Subject:
countryName = ES
stateOrProvinceName = Madrid
organizationName = Parchis
organizationalUnitName = bolica
commonName = smtp.parchis.org
emailAddress = luis@parchis.org
X509v3 extensions:
X509v3 Subject Key Identifier:
7C:1A:DD:4B:34:45:41:6B:C0:76:F7:8E:0C:C4:4A:40:69:F0:92:BB
X509v3 Authority Key Identifier:
keyid:7C:1A:DD:45:34:60:12:0B:C0:86:F7:9E:0C:C4:4A:40:69:F0:92:BB
DirName:/C=ES/ST=Madrid/O=Parchis/OU=bolica/CN=smtp.parchis.org/emailAddress=luis@parchis.org
serial:BF:2B:43:45:A3:AA:AC:0E
X509v3 Basic Constraints:
CA:TRUE
Certificate is to be certified until Feb 25 19:47:54 2012 GMT (1095 days)
Write out database with 1 new entries
Data Base Updated
- Creo una "Petición " de firma de un "Certificado de Servidor". Uso la opción "-nodes" para que el certificado no pida contraseña cada vez que se arranque el demonio.
# cd /etc/ssl/misc # ./CA.pl -newreq-nodes Generating a 1024 bit RSA private key .........++++++ .....................................++++++ writing new private key to 'newkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [ES]: State or Province Name (full name) [Madrid]: Locality Name (eg, city) [Villanueva del Pardillo]: Organization Name (eg, company) [Parchis]: Organizational Unit Name (eg, section) [bolica]: Common Name (eg, Your name) [smtp.parchis.org]: Email Addres [luis@parchis.org]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request is in newreq.pem, private key is in newkey.pem # ls -l /etc/ssl/misc/new* total 40 -rw-r--r-- 1 root root 887 Feb 25 20:42 newkey.pem -rw-r--r-- 1 root root 729 Feb 25 20:42 newreq.pem
- Pido a la CA que he creado antes que "firme" el nuevo certificado de servidor
# ./CA.pl -sign
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem: password1234
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
:
:
Certificate is to be certified until Feb 25 20:01:49 2010 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
- Verifico los directorios y ficheros creados
# ls -al /etc/ssl/misc : drwxr-xr-x 6 root root 4096 Feb 25 21:01 demoCA <== Mi propia Entidad Certificadora -rw-r--r-- 1 root root 887 Feb 25 21:01 newkey.pem <== La clave de la petición del certificado de servidor -rw-r--r-- 1 root root 729 Feb 25 21:01 newreq.pem <== La petición de un certificado de Servidor -rw-r--r-- 1 root root 3334 Feb 25 21:01 newcert.pem <== El Certificado de Servidor "firmado" por mi CA
Copia de los certificados a Postfix
- Copio los ficheros antes creados a su directorio destino
# cd /etc/ssl/misc # cp newcert.pem /etc/postfix # cp newkey.pem /etc/postfix # cp demoCA/cacert.pem /etc/postfix
Modificar master.cf y rearrancar postfix
- Quito el comentario de las siguientes líneas
/etc/postfix/master.cf smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- Recordar que para re-leer el fichero master.cf hay que recargar postfix
# postfix reload
Queue
- Comandos útiles
# postsuper # postqueue # mailq # qshape.pl
- Ver mails en la cola de mensajes
# mailq
- Flush de la cola de mensajes
# postfix flush o # postfix -f
- Borrar todos los mails en la cola
# postsuper -d ALL
- Borrar mails de la cola "deferred"
# postsuper -d ALL deferred
Cyrus-SASL
Cyrus-SASL hace la labor de pasar las variables de autenticación hacia PAM, que a su vez pasará está información a MySQL, de modo que sea posible autenticar a los usuarios de SMTP. De momento vamos a configurar Cyrus-SASL pero no voy a probarlo hasta que tenga MySQL configurado del todo, con un usuario de prueba dado de alta en la base de datos.
Instalación de Cysrus-SASL
- ¿Con qué variable USE lo he instalado?. Copia de mi fichero package.use
# emerge -pv cyrus-sasl [ebuild R ] dev-libs/cyrus-sasl-2.1.22-r2 USE="authdaemond crypt gdbm java mysql pam ssl urandom -berkdb -kerberos -ldap -ntlm_unsupported_patch -postgres -sample -srp" 0 kB
- Instalación
# emerge -v cyrus-sasl : * You need to add a user running a service using Courier's * authdaemon to the 'mail' group. For example, do: * gpasswd -a postfix mail * to add the 'postfix' user to the 'mail' group.
NOTA: Al terminar me indica que añada el usuario "postfix" al grupo "mail", sin embargo compruebo que ya está añadido por lo que no realizo ninguna acción.
Configuración de Cyrus-SASL
- Fichero /etc/sasl2/smtpd.conf
mech_list: PLAIN LOGIN pwcheck_method: saslauthd
- Fichero /etc/conf.d/saslauthd
SASLAUTHD_OPTS="${SASLAUTH_MECH} -a rimap -r"
SASLAUTHD_OPTS="${SASLAUTHD_OPTS} -O localhost"
Arranque de Cyrus-SASL
- Arranco el programa
# /etc/init.d/saslauthd start
- Pido que se arranque en cada boot
# rc-update add saslauthd default
- Verifico el log
Feb 25 19:17:47 [saslauthd] detach_tty : master pid is: 32483 Feb 25 19:17:47 [saslauthd] ipc_init : listening on socket: /var/lib/sasl2/mux
Postfix: Añadir SSL y SASL
El siguiente paso es configurar Postfix para que utilice tanto SSL como SASL,
- Edito el fichero de configuración /etc/postfix/main.cf de Postfix y añado los siguiente al final del mismo:
# A partir de aqui he puesto lineas para SSL y SASL smtpd_sasl_auth_enable = yes smtpd_sasl2_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_local_domain = smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination smtp_use_tls = yes smtp_tls_note_starttls_offer = yes smtpd_use_tls = yes # Comento la siguiente linea para poder hacer pruebas. En produccion hay que descomentarla #smtpd_tls_auth_only = yes smtpd_tls_key_file = /etc/postfix/newkey.pem smtpd_tls_cert_file = /etc/postfix/newcert.pem smtpd_tls_CAfile = /etc/postfix/cacert.pem smtpd_tls_loglevel = 3 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom
- Rearranco el programa Postfix
# postfix reload
- Compruebo que todo es correcto.
# telnet localhost 25 Trying 127.0.0.1... Connected to bolica.parchis.org. Escape character is '^]'. 220 bolica.parchis.org ESMTP Postfix EHLO parchis.org 250-bolica.parchis.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye Connection closed by foreign host.
- Compruebo que aparecen las líneas AUTH y STARTTLS. De momento la autenticación todavía no funciona, nos falta configurar MySQL para que guarde la información sobre autenticación y la información de los dominios virtuales.
Courier IMAP
Courier-IMAP es un servidor IMAP rápido y muy escalable que utiliza como repositorio para los mails, la famosa estructura de directorios/ficheros llamada "Maildir". Este paquete soporta tanto IMAP como POP3 y soporta varias funcionalidades como utilizar la libreria "Courier Authentication Library" para autenticar a los usuarios, permite realizar restricciones en los logins, IPs, prevenir ataques, soporta carpetas compatidas, trabajar sobre SSL, IPv6, extensiones IMAP, incluso el protocolo de accesso experimental SMAP.
Instalación de Courier-IMAP
- ¿Con qué variable USE lo he instalado?. Copia de mi fichero package.use
# emerge -pv courier-imap courier-authlib
[ebuild N ] dev-libs/libgamin-0.1.10-r1 USE="python -debug" 639 kB
[ebuild N ] net-libs/courier-authlib-0.60.6 USE="berkdb crypt gdbm mysql pam -debug -ldap -postgres -vpopmail" 0 kB
[ebuild N ] app-admin/gam-server-0.1.10 USE="-debug" 0 kB
[ebuild N ] app-admin/gamin-0.1.10 0 kB
[ebuild N ] net-mail/courier-imap-4.0.6-r3 USE="berkdb fam* gdbm -ipv6 nls -debug (-selinux)" 0 kB
NOTA: Debido a que couriertcpd sólo escucha en las direcciones IPv6 y no he sabido cómo arreglarlo satisfactoriamente,
al final he decidido usar USE=-ipv6 para courier-imap
- Instalación de Courier-imap y de courier-authlib
# emerge courier-imap courier-authlib : * Both gdbm and berkdb selected. Using gdbm.
Configuración de Courier-IMAP
Ficheros de configuración
En el directorio /etc/courier-imap se encuentran los ficheros de configuración. No he tenido que modificarlos, dejo aquí una copia a modo de referencia.
- /etc/courier-imap/pop3d para la configuración de pop3d
- /etc/courier-imap/imapd para la configuración de imapd
Creación de Certificados SSL
- Creo los certificados para utilizar SSL
- Cambio los valores de: C, ST, L, CN, y de email en los ficheros:
# cd /etc/courier-imap # nano -w pop3d.cnf # nano -w imapd.cnf
- Ejecuto los programas siguientes para crear los certificados (ficheros .pem en el mismo directorio)
# mkpop3dcert # mkimapdcert
Arrancar y probar Courier-IMAP
- Arranco todos los servicios
# /etc/init.d/courier-imapd start # /etc/init.d/courier-imapd-ssl start # /etc/init.d/courier-pop3d start # /etc/init.d/courier-pop3d-ssl start
- Programo el arranque automático en cada boot
# rc-update add courier-imapd default # rc-update add courier-imapd-ssl default # rc-update add courier-pop3d default # rc-update add courier-pop3d-ssl default
- Comprueba la salida del log
# tail -f /var/log/mail/current Feb 25 17:20:48 [authdaemond] modules="authmysql ", daemons=5 Feb 25 17:20:48 [authdaemond] Installing libauthmysql Feb 25 17:20:48 [authdaemond] Installation complete: authmysql
- Verificamos que el programa está escuchando en los puertos y las IPs (he dejado que sea en todas) correctas:
bolica courier-imap # netstat -nap | grep -i couriertcpd tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 27378/couriertcpd tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 27459/couriertcpd tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 27536/couriertcpd tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 27072/couriertcpd
- Puedo verificar con el comando "telnet localhost <puerto>" si realmente están funcionando. Todavía no puedo probar un cliente de correo con usuario porque todavía no los he dado de alta.
Usuario virtual: vmail
Para poder crear la estructura de directorios donde van a residir todos los correos de todos los usuarios de correo (no usuarios de sistema con shell), es necesario crear al menos un usuario normal, que contendrá la estructura de directorios con los buzones virtuales. A este usuario lo voy a llamar obviamente "vmail".
- Creamos el usuario virtual
# adduser -d /data/vmail -s /bin/false -m vmail
- En mi caso ha creado este usuario con uid 3001 y gid 3008. Estos datos se van a usar más adelante.
Unir Courier-IMAP/Postfix con MySQL
En esta sección voy a crear una base de datos en el servidor MySQL. Esta base de datos va a ser utilizada tanto por Postfix como por Courier-IMAP. Se guardarán datos de los dominios virtuales y los usuarios (cuentas de correo) que serán usados tanto por courier-imap como por postfix para autenticar a los usuarios. Además se guardarán otra serie de tablas que serán empleadas por postfix.
Antes de empezar es necesario tener instalado y operativo mi servidor MySQL
Base de datos principal
Para crear la base de datos principal que voy a dedicar al correo, voy a usar el programa postfix.admin, una herramienta Web para administrar usuarios, dominios, etc. El ppropio proceso de instalación de postfx.admin crea la base de datos, por lo tanto voy a aprovechar el proceso de instalación y configuración de postfix.admin para crear la base de datos principal, que llamaré "mailsql" y que voy a enlazar con Postfix y con Courier-IMAP.
postfix.admin
PostfixAdmin es un administrador Web que permite gestionar de forma sencilla las cuentas de correo, dominios virtuales. He decidido emplear esta aplicación desarrollada en PHP por su sencillez de uso.
- Realizo la instalación.
- Realizo la instalación del virtual Host. Le pido a webapp-config que copie dicho software al directorio raiz del nuevo virtual host. En el fichero /etc/vhosts/webapp-config se define la raiz a partir de la cual se instalan los virtual hosts, en mi caso en "/data/www"
- Instalo debajo de /data/www
# webapp-config -I -h postfixadmin -d . postfixadmin 2.2.1.1
Configuración de postfix.admin
- Creo una base de datos dedicada para PostfixAdmin
# mysql -u root -p mysql> create database mailsql; Query OK, 1 row affected (0.00 sec) : mysql> grant all on mailsql.* to mailsql@'localhost' identified by '$password'; Query OK, 0 rows affected (0.00 sec)
- Modifico el fichero /data/www/postfixadmin/htdocs/config.inc.php
$CONF['configured'] = true; $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'mailsql'; $CONF['database_password'] = '$password'; $CONF['database_name'] = 'mailsql'; $CONF['database_prefix'] = ; $CONF['domain_path'] = 'YES';
$CONF['admin_email'] = 'postmaster@parchis.org'; $CONF['default_aliases'] = array ( 'abuse' => 'abuse@parchis.org', 'hostmaster' => 'hostmaster@parchis.org', 'postmaster' => 'postmaster@parchis.org', 'webmaster' => 'webmaster@parchis.org' ); $CONF['vacation_domain'] = 'autoreply.parchis.org'; $CONF['user_footer_link'] = "http://wiki.luispa.com"; $CONF['footer_text'] = 'Volver a wiki.luispa.com'; $CONF['footer_link'] = 'http://wiki.luispa.com';
- Terminar el Setup de Postfix.Admin desde la Web
- https://postfixadmin.luispa.com/setup.php - Creo un superadmin: luis@parchis.org Se crean las tablas.
- Explicación de qué tablas se crean con postfix.admin
* PENDIENTE LUIS
- Por seguridad borro el fichero setup.php
Crear dominios y usuarios
- Utilizo postfix.admin para crear dominios y cuentas de correo. Luego configuro ambos, Postfix y Courier, para que usen la base de datos en MySQL para comprobar los usuarios y contraseñas.
https://postfixadmin.luispa.com (Login con superusuario)
- Crear primer dominio y un usuario de pruebas
Domain List->New Domain Domain: luispa.com Description: Dominio de LuisPa Aliases: 10 (-1 = disable | 0 = unlimited) Mailboxes: 10 (-1 = disable | 0 = unlimited) Add default mail aliases: (x) Lo marco para que se creen abuse, hostmaster, postmaster, webmaster Mail server is backup MX: ( ) No lo marco.
- Creo un usuario de pruebas
Virtual List->Add mailbox Username: pepe @luispa.com Password: password123 Contraseña tanto para autenticación SMTP(Postfix) para envío como para Courier(POP3/IMAP) para leer Password (again): Name: Pepe Pruebas Full name Active: (x) Send Welcome mail: (x) NOTA: postfix.admin crea automáticamente el directorio /data/vmail/luispa.com/pepe@luispa.com y la estructura Maildir debajo # ls -al /data/vmail/luispa.com/pepe\@luispa.com/ total 20 drwx------ 5 vmail vmail 4096 Feb 28 09:51 . drwxr-xr-x 4 vmail vmail 4096 Feb 28 09:51 .. drwx------ 2 vmail vmail 4096 Feb 28 09:51 cur drwx------ 2 vmail vmail 4096 Feb 28 09:51 new drwx------ 2 vmail vmail 4096 Feb 28 09:51 tmp
- URL's de postfix.admin
1. Adminsitrador: http://postfixadmin.<tudominio.com>
phpMyAdmin
También recomiendo tener instalado phpMyAdmin, una aplicación desarrollada en PHP y que se ejecuta a través del servidor Web (lo instalé como un servidor virtual más) y que presenta un interfaz hacia tus bases de datos de tu servidor MySQL. Se trabaja muy en "bruto", pero está fenomenal para ir enterandose de qué hay en las DB, etc. En el artículo sobre phpMyAdmin he documentado cómo instalar esta herramienta tan útil.
Configuración de Courier-IMAP para usar MySQL
Aquí configuro Courier-IMAP para que emplee MySQL para Autenticar. En los ejemplos hay que cambiar la variable $password por la que estes empleando en tu caso.
- Autenticación
authmodulelist="authmysql " authmodulelistorig="authuserdb authpam authshadow authmysql authcustom authpipe" daemons=5 authdaemonvar=/var/lib/courier/authdaemon DEBUG_LOGIN=1 DEFAULTOPTIONS="" LOGGEROPTS=""
Aviso: Poner DEBUG_LOGIN=0 cuando termines las pruebas
MYSQL_SERVER localhost MYSQL_USERNAME mailsql MYSQL_PASSWORD $password MYSQL_PORT 0 MYSQL_OPT 0 MYSQL_DATABASE mailsql MYSQL_USER_TABLE mailbox MYSQL_CRYPT_PWFIELD password MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD '3001' MYSQL_GID_FIELD '3008' MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD '/data/vmail' MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD maildir
- Rearrancamos la Librería de autenticación Courier
# /etc/init.d/courier-authlib restart * Stopping courier-imapd ... [ ok ] * Stopping courier-imapd over SSL ... [ ok ] * Stopping courier-pop3d ... [ ok ] * Stopping courier-pop3d over SSL ... [ ok ] * Stopping courier-authlib: authdaemond ... [ ok ] * Starting courier-authlib: authdaemond ... [ ok ] * Starting courier-imapd ... [ ok ] * Starting courier-imapd over SSL ... [ ok ] * Starting courier-pop3d ... [ ok ] * Starting courier-pop3d over SSL ... [ ok ] # /etc/init.d/saslauthd restart * Stopping saslauthd ... [ ok ] * Starting saslauthd ... [ ok ] #
- Añadimos a boot
# rc-update add courier-authlib default
Configuración de Postfix para usar MySQL
Configuro Postfix de modo que usará MySQL para Autenticar y para el resto de sus necesidades, como los dominios, alias, etc.
hosts = localhost user = mailsql password = $password dbname = mailsql query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
Nota: No olvides añadir el alias de "root" en esta tabla
hosts = localhost user = mailsql password = $password dbname = mailsql query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
hosts = localhost user = mailsql password = luis0nnet4ever dbname = mailsql query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
- AÑADO lo siguiente al final del fichero main.cf
# Usuario vmail:vmail virtual_minimum_uid = 1000 virtual_gid_maps = static:3008 virtual_uid_maps = static:3001 # A partir de que directorio se crean la estructura Maildir virtual_mailbox_base = /data/vmail/ virtual_mailbox_limit = 112400000 # Lista de dominios que soporto virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf # ??? virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf # Usuario y su mailbox virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_transport = virtual
- Por razones de seguridad es necesario cambiar los permisos de todos los ficheros /etc/mail/mysql-*.cf:
# chmod 640 /etc/postfix/mysql_*.cf # chgrp postfix /etc/postfix/mysql_*.cf
Nota: Se recomienda la lectura de VIRTUAL_README incluido en la documentación de postfix para más información.
# more /usr/share/doc/postfix-2.5.5/readme/VIRTUAL_README
- Recargo postfix
# postfix reload
Ahora, si todo ha ido bien, se debería tener el sistema funcionando. Los usuarios serán capaces de autenticarse contra la base de datos sql, usando su dirección de email completa, para pop3, imap, y smtp. Se recomienda comprobar que todo funciona correctamente en este momento. Si se tienen problemas, siempre puede comprobarse la sección de problemas frecuentes en esta guía.
Pruebas conexión MySQL - Courier-IMAP/Postfix
En la sección de postfix.admin había creado un usuario de pruebas pepe@parchis.org, ahora voy a comprobar que tanto Postfix como Courier-IMAP acceden a lo que necesitan sin problemas:
Courier-IMAP
- Pruebo la autenticación del usuario "pepe@parchis.org", primero con una contraseña incorrecta y luego con la correcta para ver que funciona perfectamente:
# authtest pepe@luispa.com passwordmal Authentication FAILED: Operation not permitted
# authtest pepe@luispa.com password123
Authentication succeeded.
Authenticated: pepe@luispa.com (uid 3001, gid 3008)
Home Directory: /data/vmail
Maildir: luispa.com/pepe@luispa.com/
Quota: (none)
Encrypted Password: $1$6cf94d74$Fzd3XSdQPXS3.tCXFtoyi0
Cleartext Password: password123
Options: (none)
Postfix
- Verifico que es posible acceder a las tres tablas usadas por Postfix
# postmap -q pepe@luispa.com mysql:/etc/postfix/mysql_virtual_alias_maps.cf pepe@luispa.com
# postmap -q luispa.com mysql:/etc/postfix/mysql_virtual_domains_maps.cf luispa.com
# postmap -q pepe@luispa.com mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf luispa.com/pepe@luispa.com/
Mantenimiento Cuentas
El proceso para crear cuentas de correo es muy sencillo. Una vez que se ha terminado todo lo anterior, simplemente usaré postfix.admin para gestionar la creación y mantenimiento de las cuentas de correo.
- Recuerda crear un alias para root. Una forma fácil de hacerlo es usar postfix.admin, creando una nueva entrada:
root@cualquierdominio.com luis@parchis.org Después puedes usar phpadmin, ir a la tabla concreta, lista de alias y modificarlo eliminando "cualquierdominio.com", de modo que quedaría: root luis@parchis.org
- Una vez que lo tengas puedes comprobarlo con el siguiente comando:
# postmap -q root mysql:/etc/postfix/mysql_virtual_alias_maps.cf luis@parchis.org
Acceso al correo: Squirrelmail
SquirrelMail es una aplicación WebMail escrita en PHP que permite interactuar con los buzones de los usuarios, una vez que se ha configurado cual es el servidor IMAP y el servidor SMTP, está basado en HTML 4.0 por lo que es muy compatible con los navegadores.
Instalación del software
- Importante verificar que tienes "vhosts" en tu variable USE
# emerge -pv squirrelmail These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] perl-core/DB_File-1.815 86 kB [ebuild N ] dev-php/PEAR-PEAR-1.6.2-r1 374 kB [ebuild N ] dev-php/PEAR-DB-1.7.12 129 kB [ebuild N ] virtual/perl-DB_File-1.815 0 kB [ebuild N ] mail-client/squirrelmail-1.4.17 USE="mysql nls ssl vhosts -filter -ldap -postgres -spell" 3,847 kB :
- Realizamos la instalación como de costumbre:
Instalación de un virtual Host
El siguiente paso es pedirle a webapp-config que copie dicho software al directorio raiz del nuevo virtual host. Recuerda que el fichero /etc/vhosts/webapp-config define la raiz a partir de la cual se instalan los virtual hosts, en mi caso en "/data/www"
- Instalo debajo de /data/www. Recordemos que modifiqué el fichero /etc/vhosts/webapp-config y la variable vhost_root es igual a "/data/www/${vhost_hostname}"
# webapp-config -I -h squirrelmail -d . squirrelmail 1.4.17 * You must edit the following configuration files to setup your server. * Note that not all of them may be present depending on USE flags. * * config/config.php * plugins/retrieveuserdata/config.php * plugins/virus_scan/config.php * plugins/gpg/gpg_local_prefs.txt * plugins/ldapuserdata/config.php * plugins/show_ssl_link/config.php * plugins/secure_login/config.php * * You should also create the file 'config/admins' * containing the users who should have access to administrative options. * Put each login on its own line, and be sure to leave a newline at the * end of the file. * * You can use the console based configuration tool by executing: * cd config; perl conf.pl
Configuración de Squirrelmail
- Modifico los ficheros de configuración bajo /data/www/squirrelmail/htdocs
Actualización de Squirrelmail
- Durante un update rutinario de Portage (emerge --sync y emerge -DuvNp world) observo que se ha descargado y preparado la nueva versión de squirrelmail (1.4.18 antes tenía la 1.4.17), por lo tanto es necesario realizar la actualización. Muestro aquí los pasos seguidos que serán similares en el futuro, cuando aparezcan nuevas versiones:
# emerge -DuvNp world : [ebuild NS ] mail-client/squirrelmail-1.4.18 [1.4.17] USE="mysql nls ssl vhosts -filter -ldap -postgres -spell" 498 kB : # emerge -DuvN world :
- Hago el upgrade a la nueva versión 1.4.18
# webapp-config -U -h squirrelmail -d . squirrelmail 1.4.18
- Ejecuto "etc-update's" tal como me pide al terminar, usando los correspondientes CONFIG_PROTECT. El número de líneas a ejecutar depende de la instalación, pero el comando anterior te dice qué tienes que hacer. La siguiente es la primera de la lista:
CONFIG_PROTECT="/data/www/squirrelmail/htdocs/.//config" etc-update
- Verifico que el fichero /data/www/squirrelmail/htdocs/config/config.php mantiene los valores originales, que en cada caso puede ser diferente...
$domain = $imapServerAddress = $imapPort = $smtpServerAddress = $smtpPort = $imap_server_type = 'courier';
Acceso al correo: RoundCube
RoundCube es una aplicación WebMail cliente IMAP multi-lenguaje. Ofrece funcionalidad completa, incluyendo soporte de MIME, agenda de direcciones, manipulación de directorios, mensajes, corrector ortográfico. Está escrito en PHP y necesita MySQL o Postgres. El interfaz de usuario puede maquillarse con diferentes pieles usando XHTML y CSS.
Instalación del software
- Modifico el fichero /etc/portage/package.keywords
# Webmail =mail-client/roundcube-0.2.1 ~amd64
- Modifico el fichero /etc/portage/package.use
# Webmail roundcube mail-client/roundcube mysql ssl vhosts spell
- Importante verificar que tienes "vhosts" en tu variable USE
# emerge -pv roundcube These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild R ] mail-client/roundcube-0.2.1 USE="mysql spell* ssl vhosts -ldap -postgres -sqlite" 0 kB Total: 1 package (1 reinstall), Size of downloads: 0 kB
- Realizamos la instalación como de costumbre:
Instalación de un virtual Host
El siguiente paso es pedirle a webapp-config que copie dicho software al directorio raiz del nuevo virtual host. Recuerda que el fichero /etc/vhosts/webapp-config define la raiz a partir de la cual se instalan los virtual hosts, en mi caso en "/data/www"
- Instalo debajo de /data/www. Recordemos que modifiqué el fichero /etc/vhosts/webapp-config y la variable vhost_root es igual a "/data/www/${vhost_hostname}"
# webapp-config -I -h roundcube -d . roundcube 0.2.1
Creación de la Base de Datos
- Se recomienda crear la base de datos con soporte de utf-8. Sigo los siguientes pasos:
# mysql -u root -p mysql> create database roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> use roundcubemail; mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password'; mysql> quit # mysql -u root -p roundcubemail < /data/www/roundcube/htdocs/SQL/mysql.initial.sql Enter password:
Configuración de RoundCube
1. ROUNDCUBE CONFIGURATION
- Modifico los ficheros de /data/www/roundcube/htdocs/config/* para adaptarlos a mi entorno. Se pueden encontrar detalles y documentación en http://trac.roundcube.net/wiki/Howto_Install
db.inc.php $rcmail_config['db_dsnw'] = 'mysql://roundcube:<CONTRASEÑA>@localhost/roundcubemail'; main.inc.php $rcmail_config['default_host'] = 'localhost'; $rcmail_config['imap_auth_type'] = check; $rcmail_config['smtp_server'] = 'localhost';
Configuración de PHP
- Verifico que tengo configurado lo siguiente en el fichero php.ini (/etc/php/apache2-php5/php.ini)
- error_reporting E_ALL & ~E_NOTICE (o más bajo) - file_uploads On (para permitir enviar anexos) - session.auto_start Off - magic_quotes_gpc Off - memory_limit (incrementar para soportar grandes anexos)
Configuración de Apache
No es necesario configurar apache porque ya trae el fichero .htaccess. Básicamente se trata de asegurar que hay un fichero .htaccess en los tres siguientes subdirectorios de modo que se proteja el que no se pueda acceder a ellos:
* /config * /temp * /logs
Conecto
- Conecto con http://url-a-mi-roundcube/
Update a roundcube 0.3
- Consulto la guía de upgrade.
- Modifico el fichero /etc/portage/package.keywords.
# Webmail =mail-client/roundcube-0.3 ~amd64
- Modifico el fichero /etc/portage/package.use
# PHP: añado +sqlit para roundcube 0.3 dev-lang/php apache2 spell berkdb bzip2 cli crypt ctype curl exif filter ftp gd gdbm iconv ima\ p ipv6 json mysql ncurses nls pcre posix readline reflection session snmp spl ssl threads truetype unicode xml \ xsl zlib mysqli sockets tokenizer xmlrpc sqlite # Webmail roundcube mail-client/roundcube mysql ssl vhosts spell
- Siempre importante, hacer Backup
# mysqldump -uroot -p --opt roundcubemail > /mi/sitio/de/backups/20090919-roundcubemail.sql # cd /data/www # tar cvfz /mi/sitio/de/backups/20090919-roundcube-0.2.1.tgz roundcube/ # cd /data/www/roundcube # cp -R config /mi/sitio/de/backups/20090919-roundcube.config
- Realizamos el upgrade
- Actualizo sobre la 0.2.1 que está en /data/www. Recordemos que modifiqué el fichero /etc/vhosts/webapp-config y la variable vhost_root es igual a "/data/www/${vhost_hostname}"
# webapp-config -U -h roundcube -d . roundcube 0.3
- Ficheros de configuración. Ejecuto el siguiente comando y readapto con mi configuración
# CONFIG_PROTECT="/data/www/roundcube/htdocs/.//config" etc-update db.inc.php $rcmail_config['db_dsnw'] = 'mysql://roundcube:<CONTRASEÑA>@localhost/roundcubemail'; main.inc.php $rcmail_config['default_host'] = 'localhost'; $rcmail_config['imap_auth_type'] = check; $rcmail_config['smtp_server'] = 'localhost';
- Temporalmente modifico lo siguiente
main.inc.php 'enable_installer' lo pongo en true
- Conecto con http://url-a-mi-roundcube/installer/
Sigo instrucciones y verifico que todo está bien, incluso el envío de un email (smtp) y login a buzón (imap)
- Ejecuto el script de update de la base de datos
# cd SQL # mysql roundcubemail -uroot -p < mysql.update.sql ERROR 1091 (42000) at line 6: Can't DROP 'idx'; check that column/key exists <== se puede ignorar
- Desactivo enable_installer
main.inc.php 'enable_installer' lo pongo en false
- Verifico el .htaccess
# cat config/.htaccess Order allow,deny Deny from all
- Elimino el directorio installer
# rm -fr installer
Conecto
- Conecto con http://url-a-mi-roundcube/
El Chatarrero (filtrado de correos)
Aviso: Esta última sección está todavía en estudio. La voy a dedicar a documentar el software que voy a usar contra SPAM/VIrus, etc...)
- links bajo estudio:
Introducción
El objetivo de esta sección es documentar qué debo instalar para que mi Servidor de Correo sea capaz de escanear los mails en busca de virus y que además bloquee el odioso Spam, de ahí que haya llamado a esta sección "El Chatarrero". Tras investigar en la red he llegado a la conclusión que los paquetes que voy a usar son los siguientes, dado que son los más recomendados, actualizados y seguros; de hecho hay una guía sobre mailfiltering de Gentoo que recomiendo y de la que he sacado gran parte de la munición para este artículo.
- Escaneadores de correos:
- Primero trabajé con amavisd-new: (citando su web) "amavisd-new es un conector de alto rendimiento entre el MTA y analizadores de contenidos como scanners de virus y spamassassin. Está desarrollado en Perl. Dialoga con el MTA usando (E)SMTP o LMTP, o mediante el uso de programas "helper". Está muy optimizado para trabjar con Postfix."
- Después he migrado a MailScanner: Un fantástico Mail Scanner al que he actualizado en enero de 2010 (he dejado de usar amavisd-new).
- Antivirus:
- ClamAV: (citando su web) "Clam AntiVirus es un conjunto de herramientas GPL anti-virus para UNIX. El principal objetivo de este software es la integración con servidores de correo (analisis de anexos). El paquete dispone de un demonio multi-hilo flexible y escalable, un escaner de línea de comando, y una herramienta para actualización automática a través de Internet. Los programas se basan en una librería compartida distribuida con el paquete de Clam AntiVirus, que puede utilizar con su software. Aun más importante, la base de datos de virus se mantiene actualizada."
- AntiSpam:
- SpamAssassin: (citando su web) "SpamAssassin es un filtro de correo dedicado a identificar Spam. Emplea un sistema de reglas, pruebas heurísticas y aprendizaje sobre las capeceras de los correos para ser capaz de detectar el Spam, también conocido como correo comercial no solicitado. SpamAssassin no se dedica a borrar, enrutar o separar los mails con Spam, eso son funciones de mail routing. SpamAssassin es un filtrador y clasificador de los correos. Examinará cada mensaje, le asignará una puntuación que indicará la probabilidad de que se trata de Spam y luego algún programa externo será el encargado de examinar esta puntuación y decidir cómo enruta dicho correo."
- Foto con amavis-d
Se configura el sistema de filtrado de correos como complemento al servidor de correo SMTP e IMAP. Cuando el MTA (Postfix) recibe un correo (escucha por puerto 25) se lo envía a Amavisd-new (escucha por puerto 10024). Amavisd-new se encarga de "filtrar" el mensaje pasándolo por varios filtradores (antivirus, antispam) y luego se lo devuelve a Postfix (escucha por puerto 10025) para que siga su camino.
- Foto con MailScanner
Se configurar el sistema de filtrado de correos como complemento al servidor de correo SMTP e IMAP que actualmente tengo ya funcionando. Cuando el MTA (Postfix) recibe un correo (escucha por puerto 25) lo retiene en un directorio y se invoca a MailScanner que analiza dicho directorio e instruye a Postfix la acción final a realizar, dejarlo pasar o lo bloquea.
Ambos (amavisd y MailScanner) usan dos aplicaciones externas especializadas en antivirus (ClamAV) y antispam (Spamassassin). De hecho, el propio Spamassassin funciona como otro nivel de filtrado de contenidos, dado que utiliza a su vez aplicaciones que le ayudan como Vipul's Razor2 y DCC. La tecnología antispam no está basada en pruebas sencillas, sino que se usan un montón de pruebas internas y externas para calcular la famosa "puntuación" que se le da a los correos: filtros Bayesian, reglas estáticas con expresiones regualres, redes distribuidas y colaborativas antispam como RBLs, Razor2, Pyzor y DCC.
Configuración básica
Esta primera parte cubre la configuración básica del filtrado de correos, más adelante describo como: - Crear carpetas IMAP especiales para el aprendizaje del filtro Bayesian y para entregar falsos positivos. - Configuración de listas grises con Postfix - Configuración de Amavisd-new junto con MySQL para las preferencias de los usuarios - Configuración de Spamassassin junto con MySQL para los datos de AWL y Bayes.
Aviso: La configuración de un sistema antispam no es ciencia exacta y hay varios temas a tener en cuenta. Por ejemplo, el uso de RBLs (Realtime Blackhole Lists) a nivel de MTA tiene sus riesgos dado que se podrán experimentar falsos positivos. Hay un par de artículos interesantes al respecto en Realtime Blackhole Lists Are Bad y The Spam Problem: Moving Beyond RBLs
Instalación
Un último aviso: obviamente no empieces por esta sección si no tienes perfectamente operativo todo tu Servicio de Correo, es decir, todas las secciones anteriores de este artículo deberías tenerlas funcionando. Avisado quedas! :-)
- USE: Flags añadidos a /etc/portage/package.use
# Filtrado de Correos app-antivirus/clamav bzip2 crypt iconv ipv6 nls mail-filter/spamassassin berkdb ipv6 mysql ssl tools mail-filter/amavisd-new mysql razor spamassassin mail-filter/MailScanner clamav postfix spamassassin
- KEYWORDS: Modifico /etc/portage/package.keywords
# MailScanner, sustituo de amavis-new =mail-filter/MailScanner-4.78.17.1 ~amd64 =net-mail/tnef-1.4.6 ~amd64 =dev-perl/Filesys-Df-0.92 ~amd64
- Creo un ebuild para MailScanner
Utilizo el último MailScanner-4.78.17.1.ebuild y lo creo en mi overlay /usr/local/portage/mail-filter/MailScanner Copio los ficheros de apoyo cp -R /usr/portage/mail-filter/MailScanner/files /usr/local/portage/mail-filter/MailScanner/ ebuild MailScanner-4.78.17.1.ebuild digest
- Ejecuto la instalación (en este comando instalo ambos, amavisd y MailScanner)
# emerge -v amavisd-new spamassassin clamav MailScanner
- Instalo perl-IO (necesario para MailScanner)
# emerge -v perl-IO
Configuración DNS
Si tienes el mail gateway en un equipo diferente al mail server, entonces tendrías que usar una configuración especial en tu DNS. Mira la documentación de la guía de filtrado de mails de Gentoo donde describen un ejemplo.
En mi el mail server es el mail gateway, así que la configuración en la red casera es la siguiente:
# cat /var/bind/pri/privado/parchis.org : MX 10 smtp.parchis.org. ; Servidor de correo. : smtp A 192.168.1.1 :
Configuración de Posftfix
Como ya he dicho antes, primero usé amavisd, pero luego lo cambié todo a MailScanner, dejo aquí ambas opciones, tendrás que elegir una de ellas (en mi caso MailScanner)
Conf. de Postfix para Amavisd
Primero le decimos a la instancia principal de Postfix que envíe cada mensaje hacia amavisd-new a través del puerto 10024. Además tenemos que indicarle a Postfix que está filtrando todo el mail a través de un filtrado externo de contenidos y habilitar el routing explícito para que Postfix sepa a dónde mandar el correo.
- Modifico el fichero /etc/postfix/main.cf
# Conectar con amavisd-new # biff = no empty_address_recipient = MAILER-DAEMON queue_minfree = 120000000 content_filter = smtp-amavis:[127.0.0.1]:10024
- Modifico el fichero /etc/postfix/master.cf. El siguiente paso es decirle a postfix que escuche en el puerto 10025 (sólo conexiones locales), añadimos lo siguiente al fichero. Recuerda que el fichero master.cf especifica cómo debe ejecutarse cada proceso individual de postfix ("man 8 master").
# Conectar con amavisd-new smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000
La linea de "smtp-amavis" especifica un máximo de 2 procesos concurrentes, ha de estar de acuerdo con el valor de $max_servers en /etc/amavisd.conf. Este proceso consume bastante memoria así que cuidado al subir el número.
Conf. de Postfix para MailScanner
- Modifico Postfix: Fichero main.cf para que deje de usar amavisd-new y use header_checks (para MailScanner)
: header_checks = regexp:/etc/postfix/header_checks : # Conectar con amavisd-new (LO COMENTO, YA NO LO VOY A USAR, paso a usar MailScanner) # # biff = no # empty_address_recipient = MAILER-DAEMON # queue_minfree = 120000000 # content_filter = smtp-amavis:[127.0.0.1]:10024
- Modifico Postfix: Fichero header_checks (para MailScanner)
/^Received:/ HOLD
- Modifico Postfix: Comento en fichero master.cf para que no se use amavisd.
#ByLuispa- dejo de usar amavisd #2525 inet n - n - - smtpd #ByLuispa- dejo de usar amavisd ## Conectar con amavisd-new #smtp-amavis unix - - n - 2 smtp # -o smtp_data_done_timeout=1200 # -o smtp_send_xforward_command=yes # #127.0.0.1:10025 inet n - n - - smtpd # -o content_filter= # -o local_recipient_maps= # -o relay_recipient_maps= # -o smtpd_restriction_classes= # -o smtpd_client_restrictions= # -o smtpd_helo_restrictions= # -o smtpd_sender_restrictions= # -o smtpd_recipient_restrictions=permit_mynetworks,reject # -o mynetworks=127.0.0.0/8 # -o strict_rfc821_envelopes=yes # -o smtpd_error_sleep_time=0 # -o smtpd_soft_error_limit=1001 # -o smtpd_hard_error_limit=1000 #submission inet n - n - - smtpd # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
Configuración de amavisd-new
Nota: En enero 2010 cambio a MailScanner, dejo aquí la documentación sobre cómo lo configuré inicialmente con amavisd-new
Amavisd-new se usa de pegamento entre Postfix y los anti-X. Una vez que recibe un mensaje lo filtra a través de filtros propios, listas blancas,negras,... y después a través del scanner de virus y finalmente a través de SpamAssassin.
El propio Amavisd-new puede además identificar anexos peligrosos y aplicarle políticas por usuario, dominio y por el sistema completo, listas blancas, negras, umbrales de "puntuación" de spam, políticas para virus y spam.
- Edito la configuración del fichero /etc/amavisd.conf
# Insertar los dominios a escanear $mydomain = 'parchis.org'; $myhostname = 'bolica.parchis.org'; # fqdn of this host, default by uname(3) # Solo escuchar en la direccion loopback $inet_socket_bind = '127.0.0.1'; # Tras el scan, enviarselo a Postfix al puerto 10025 $forward_method = 'smtp:127.0.0.1:10025'; $notify_method = $forward_method; # A que cuenta enviarle los mails por alertas de virus $virus_admin = "virusalert\@$mydomain"; # Donde enviar los detectados como spam: $spam_quarantine_to = 'spam@tudomino.com'; # local quarantine # Poner siempre cabeceras spam $sa_tag_level_deflt = -100; # Poner cabecera detectado spam, tambien conocido como X-Spam-Status. $sa_tag2_level_deflt = 5; # Desencadenar acciones avasivas al siguiente nivel de spam $sa_kill_level_deflt = $sa_tag2_level_deflt; # No enviar notificaciones de entrega al emisor. $sa_dsn_cutoff_level = 10; # No devolverver mensajes a diestro y siniestro, mejor ponerlos en cuarentena $final_virus_destiny = D_DISCARD; # (defaults to D_DISCARD) $final_banned_destiny = D_DISCARD; # (defaults to D_BOUNCE) $final_spam_destiny = D_DISCARD; # (defaults to D_BOUNCE)
Con la línea $sa_tag2_level_deflt = 5; pongo la puntuación de Spamassassin a 5, que quizá sea un poco bajo (por defecto venía a 6.3), lo que puede provocar falso positivos, si no quieres tratar los falsos positivos pues lo subes a 6.3
- Cambio el directorio de trabajo $MYHOME de amavis por defecto (/var/amavis) a /data/vmail/amavis
1) Cambio la variable $MYHOME en /etc/amavisd.conf $MYHOME = '/data/vmail/amavis'; # (default is '/var/amavis'), -H 2) Muevo el directorio original a /data/vmail # cd /var # cp -Ruvfp amavis/ /data/vmail/ # rm -fr amavis/
- Modifico el HOME directory del usuario amavis, edito el /etc/password
amavis:x:113:3012:added by portage for amavisd-new:/data/vmail/amavis:/bin/bash
Configuración de MailScanner
Nota: En enero 2010 cambio a MailScanner
MailScanner es un analizador de correos, que usa para unir Postfix y los anti-X. Una vez que recibe un mensaje lo filtra a través de filtros propios, listas blancas,negras,... y después a través del scanner de virus y finalmente a través de SpamAssassin.
Al principio era necesario ejecutar dos instancias de Postfix, pero desde la versión 2.4 el mta postfix soporta dejar mensajes en HOLD para luego reinyectarlos.
El directorio "Inbound path" es /var/spool/postfix/hold Hay información adicional en: http://mailscanner.info/postfix.html Y también en: gentoo-wiki.com
- Modifico Postfix: Fichero main.cf para que deje de usar amavisd-new y use header_checks (para MailScanner)
: header_checks = regexp:/etc/postfix/header_checks : # Conectar con amavisd-new (LO COMENTO, YA NO LO VOY A USAR, paso a usar MailScanner) # # biff = no # empty_address_recipient = MAILER-DAEMON # queue_minfree = 120000000 # content_filter = smtp-amavis:[127.0.0.1]:10024
- Modifico Postfix: Fichero header_checks (para MailScanner)
/^Received:/ HOLD
- Modifico Postfix: Comento en fichero master.cf para que no se use amavisd.
#ByLuispa- dejo de usar amavisd #2525 inet n - n - - smtpd #ByLuispa- dejo de usar amavisd ## Conectar con amavisd-new #smtp-amavis unix - - n - 2 smtp # -o smtp_data_done_timeout=1200 # -o smtp_send_xforward_command=yes # #127.0.0.1:10025 inet n - n - - smtpd # -o content_filter= # -o local_recipient_maps= # -o relay_recipient_maps= # -o smtpd_restriction_classes= # -o smtpd_client_restrictions= # -o smtpd_helo_restrictions= # -o smtpd_sender_restrictions= # -o smtpd_recipient_restrictions=permit_mynetworks,reject # -o mynetworks=127.0.0.0/8 # -o strict_rfc821_envelopes=yes # -o smtpd_error_sleep_time=0 # -o smtpd_soft_error_limit=1001 # -o smtpd_hard_error_limit=1000 #submission inet n - n - - smtpd # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
- Elimino amavisd-new de la foto y configuro MailScanner
# rc-update del amavisd-new default # rc-update add MailScanner default
- Tras hacer el cambio, parece que todo funciona bien. En el log veo lo siguiente
Jan 11 21:58:44 [MailScanner] User's home directory /var/spool/postfix is not writable_ Jan 11 21:58:44 [MailScanner] You need to set the "SpamAssassin User State Dir" to a directory that the "Run As User" can write to_
- Pero según he visto en este hilo puede ignorarse. Lo investigaré
You are getting this error because you are running Razor. Razor creates a log file (razor-agent.log) in its user's home directory and in case of postfix the home directory is /var/spool/postfix. Since you are holding all the mails first the log file is created in /var/spool/postfix/hold. MailScanner needs hashed queue structure (where as postfix by default supports hashed queue) but since the log file is not actually a directory the MailScanner is not able to do chdir to it and ends up giving this error. However this doesnt effect the functionality of MailScanner. If you want to fix this error you can safely change the home directory of postfix to /tmp in /etc/passwd, this doesnt hamper's postfix's or MailScanner's performance. It may happen that after changing the home dir of postfix you still get the error for sometime so in tht case just make sure tht you have removed the file /var/spool/postfix/hold/razor-agent.log and restart the MailScanner. That should fix your problem, also make sure that you have done the other MailScanner configurations properly and in cases of MailScanner problems please post on MailScanner discussion forum or ask on mailscanner channel on freenode irc.
- De momento estas son las modificaciones que he realizado al fichero MailScanner.conf. Algunas de estas modificaciones vienen exigidas por la configuración de MailWatch.
%org-long-name% = Parchis %web-site% = www.parchis.org %report-dir% = /etc/MailScanner/reports/es Run As User = postfix Run As Group = postfix Incoming Queue Dir = /var/spool/postfix/hold Incoming Queue Dir = /var/spool/postfix.in/deferred Quarantine User = root Quarantine Group = apache Quarantine Permissions = 0660 Quarantine Whole Message = yes Include Scanner Name In Reports = no Use SpamAssassin = yes Required SpamAssassin Score = 5 High SpamAssassin Score = 10 Spam Actions = forward spam@tudomino.com header "X-Spam-Status: Yes" store High Scoring Spam Actions = delete SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin Always Looked Up Last = &MailWatchLogging Always Include SpamAssassin Report = yes Incoming Work Group = clamv Incoming Work Permissions = 0640 Clamd Port = 3310 Clamd Socket = /var/run/clamav/clamd.sock Clamd Lock File = # Clamd Use Threads = yes
- No marcar los correos locales como spam
From: 127.0.0.1 yes From: 192.168.1. yes FromOrTo: default no
- Añadido al final de spam.assassin.prefs.conf
trusted_networks 192.168.1/24 use_bayes 1 bayes_path /etc/MailScanner/bayes/bayes score BAYES_99 0 0 4.5 4.5 score HTML_30_40 0 score URIBL_JP_SURBL 0 score URIBL_OB_SURBL 0 score HABEAS_SWE 0 score SUBJ_ILLEGAL_CHARS 1 1 2 2 score UPPERCASE_75_100 0 score MSGID_FROM_MTA_ID 2 2 2 2 score UNPARSEABLE_RELAY 2 2 2 2 score FORGED_RCVD_HELO 3 3 3 3 score HTML_SHORT_LENGTH 0 score UPPERCASE_50_75 0 score DOMAIN_4U2 0 score HTML_MIME_NO_HTML_TAG 0 score HTML_TINY_FONT 0 score EXTRA_MPART_TYPE 3.10 score MIME_HTML_ONLY 1 1 1 1 score RCVD_IN_NJABL_DUL 2.5 2.5 2.5 2.5 bayes_auto_learn 0 bayes_auto_learn_threshold_nonspam 0.1 bayes_auto_learn_threshold_spam 3.9 use_razor2 0 use_dcc 0 use_pyzor 0
- Renombro /etc/mail/spamassassin/local.cf ya que esto va a manejar con MailScanner mediante el archivo /etc/MailScanner/spam.assassin.prefs.conf
# cd /etc/spamassassin # mv local.cf local.cf.RENOMBRADO-USOMailScanner
- Crear el directorio bayes y las bases de datos bayesianas
# cd /etc/MailScanner # mkdir bayes # sa-learn --sync –p /etc/MailScanner/spam.assassin.prefs.conf # chmod 755 bayes/ # chmod 764 bayes/*
Configuración de ClamAV
El siguiente paso es la configuración del antivirus, que posee una tasa de detección muy aceptable, es rápido y libre (open source).
- Edito el fichero /etc/clamd.conf.
# Activo verbose logging a través de syslog LogFile /var/log/clamav/clamd.log LogSyslog yes LogFacility LOG_MAIL LogVerbose yes # Ubicación del socket. Valido para Amvisd-new y MailScanner LocalSocket /var/run/clamav/clamd.sock # Parametros TCP. Valido para MailScanner TCPSocket 3310 TCPAddr 127.0.0.1 # No ejecutar clamd como root User clamav AllowSupplementaryGroups yes # Habilito scan de mails internos y dentro de ficheros ScanMail yes ScanArchive yes
- Modifico amavisd.conf para notificar que clamav está disponible:
# ### http://www.clamav.net/ ['ClamAV-clamd', \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"], qr/\bOK$/, qr/\bFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ], # # NOTE: run clamd under the same user as amavisd, or run it under its own # # uid such as clamav, add user clamav to the amavis group, and then add # # AllowSupplementaryGroups to clamd.conf;
- Añado al usuario clamav al grupo amavis
# gpasswd -a clamav amavis
- Configuración de Freshclam. ClamAV trae el programa freshclam, un demonio que se dedica a comprobar periódicamente las firmas de los virus y se las baja desde internet. Modifico el fichero /etc/freshclam.conf
# Logging UpdateLogFile /var/log/clamav/freshclam.log LogTime yes LogVerbose yes LogSyslog yes LogFacility LOG_MAIL # Owner de la base de datos DatabaseOwner clamav # Chequeos cada 12 horas Checks 12 DatabaseMirror db.es.clamav.net
Configuración de Spamassassin
Tanto MailScanner como Amavis usan las librerias Perl de Spamassassin directamente, por lo que no es necesario arrancar el servicio (no es necesario /etc/init.d/spamd start). Ambos programas invocan a SpamAssassin via el API de Perl.
Conf. Spamassassin con MailScanner
No es necesario modificar el fichero /etc/spamassassin/local.cf, de hecho es conveniente renombrarlo para que no nos confunda. En el caso de MailScanner, cuando invoca a spamassassin, lo hace utilizando el fichero /etc/MailScanner/spam.assassin.prefs.conf
Conf. Spamassassin con Amavisd
Algunos parámetros de Spamassassin que encontramos en su fichero de configuración en /etc/mail/spamassassin/local.cf son sobre-escritos por las mismas opciones en /etc/amavisd.conf.
Amavis usa las librerias Perl de Spamassassin directamente, por lo que no es necesario arrancar el servicio (no es necesario /etc/init.d/spamd start). De hecho esto crea confusión ya que algunos parámetros de Spamassassin que encontramos en su fichero de configuración en /etc/mail/spamassassin/local.cf son sobre-escritos por las mismas opciones en /etc/amavisd.conf.
- Creo el fichero /etc/mail/spamassassin/local.cf
# Enable the Bayes system use_bayes 1 # Enable all network checks skip_rbl_checks 0 # Mail using languages used in these country codes will not be marked # as being possibly spam in a foreign language. # - danish english norwegian swedish ok_languages da en no sv es # Mail using locales used in these country codes will not be marked # as being possibly spam in a foreign language. ok_locales en # Use a sensible bayes path bayes_path /data/vmail/amavis/.spamassassin/bayes
Arranque del filtrado y pruebas
Pruebas con amavisd
- Primero ejecuto amavisd a pelo para ver si tengo errores.
# amavisd debug : ... /usr/sbin/amavisd[5480]: (!!)TROUBLE in pre_loop_hook: config: no rules were found! Do you need to run 'sa-update'? ... Suicide () TROUBLE in pre_loop_hook: config: no rules were found! Do you need to run 'sa-update'?
- Ejecuto un sa-update
# sh /usr/bin/sa-update error: GPG validation failed! The update downloaded successfully, but the GPG signature verification failed. channel: GPG validation failed, channel failed
- Según http://wiki.apache.org/spamassassin/SaUpdateKeyNotCrossCertified tengo que ejecutar:
# wget http://spamassassin.apache.org/updates/GPG.KEY # sh /usr/bin/sa-update --import GPG.KEY
- Repito sa-update
# sh /usr/bin/sa-update # # ls -al /etc/mail/spamassassin/sa-update-keys/ : # ls -al /var/lib/spamassassin/ :
- Vuelvo a comprobar
# amavisd debug :
- Funciona ! lo corto con CTRL-C
Arranque
- Antes de arrancar freshclam, compruebo que funciona correctamente y actualizo sus ficheros de firmas.
# freshclam ClamAV update process started at Sun Mar 1 15:17:05 2009 Downloading main-50.cdiff [100%] main.cld updated (version: 50, sigs: 500667, f-level: 38, builder: sven) WARNING: getfile: daily-8684.cdiff not found on remote server (IP: 193.147.168.122) WARNING: getpatch: Can't download daily-8684.cdiff from db.es.clamav.net WARNING: getfile: daily-8684.cdiff not found on remote server (IP: 82.194.71.224) WARNING: getpatch: Can't download daily-8684.cdiff from db.es.clamav.net connect_error: getsockopt(SO_ERROR): fd=5 error=113: No route to host Can't connect to port 80 of host db.es.clamav.net (IP: 82.159.137.16) Trying host db.es.clamav.net (82.194.71.224)... WARNING: getfile: daily-8684.cdiff not found on remote server (IP: 82.194.71.224) WARNING: getpatch: Can't download daily-8684.cdiff from db.es.clamav.net WARNING: Incremental update failed, trying to download daily.cvd Downloading daily.cvd [100%] daily.cvd updated (version: 9059, sigs: 13941, f-level: 38, builder: mcichosz) Database updated (514608 signatures) from db.es.clamav.net (IP: 80.80.88.40) WARNING: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.sock connect(): No such file or directory
# ls -al /var/lib/clamav/ total 43764 drwxrwxr-x 2 clamav clamav 4096 Mar 1 15:17 . drwxr-xr-x 40 root root 4096 Mar 1 11:00 .. -rw-r--r-- 1 clamav clamav 409563 Mar 1 15:17 daily.cvd -rw-r--r-- 1 clamav clamav 44391424 Mar 1 15:17 main.cld -rw------- 1 clamav clamav 104 Mar 1 19:31 mirrors.dat
- Arranco los daemons
# /etc/init.d/clamd start # /etc/init.d/amavisd start # postfix reload
- Compruebo el log (/var/log/everything/current)
Mar 1 15:21:38 [clamd] clamd daemon 0.94.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)_ Mar 1 15:21:38 [clamd] Running as user clamav (UID 112, GID 3011)_ Mar 1 15:21:38 [clamd] Log file size limited to 1048576 bytes._ Mar 1 15:21:38 [clamd] Reading databases from /var/lib/clamav_ Mar 1 15:21:38 [clamd] Not loading PUA signatures._ Mar 1 15:21:38 [clamd] Loaded 514099 signatures._ Mar 1 15:21:38 [clamd] LOCAL: Unix socket file /var/run/clamav/clamd.sock_ Mar 1 15:21:38 [clamd] LOCAL: Setting connection queue length to 15_ Mar 1 15:21:38 [clamd] Limits: Global size limit set to 104857600 bytes._ Mar 1 15:21:38 [clamd] Limits: File size limit set to 26214400 bytes._ Mar 1 15:21:38 [clamd] Limits: Recursion level limit set to 16._ Mar 1 15:21:38 [clamd] Limits: Files limit set to 10000._ Mar 1 15:21:38 [clamd] Archive support enabled._ Mar 1 15:21:38 [clamd] Algorithmic detection enabled._ Mar 1 15:21:38 [clamd] Portable Executable support enabled._ Mar 1 15:21:38 [clamd] ELF support enabled._ Mar 1 15:21:38 [clamd] Mail files support enabled._ Mar 1 15:21:38 [clamd] OLE2 support enabled._ Mar 1 15:21:38 [clamd] PDF support enabled._ Mar 1 15:21:38 [clamd] HTML support enabled._ Mar 1 15:21:38 [clamd] Self checking every 1800 seconds._ Mar 1 15:21:38 [freshclam] freshclam daemon 0.94.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)_ Mar 1 15:21:38 [freshclam] ClamAV update process started at Sun Mar 1 15:21:38 2009_ Mar 1 15:21:38 [freshclam] main.cld is up to date (version: 50, sigs: 500667, f-level: 38, builder: sven)_ Mar 1 15:21:38 [freshclam] daily.cvd is up to date (version: 9059, sigs: 13941, f-level: 38, builder: mcichosz)_
- Verifico que tanto postfix como amavis están escuchando en sus correspondientes puertos. Para salir del telnet escribo "quit"
# telnet localhost 25 (Postfix) # telnet localhost 10024 (amavisd-new) # telnet localhost 10025 (Postfix)
- Recomiendo dejar una ventana monitorizando de forma continuada el log del sistema. Aquí veremos por qué fallan o funciona todo.
# tail -f /var/log/everything/current
Arranque durante el boot
- Añado amavis y clamd para que arranque durante el boot.
# rc-update add amavisd default # rc-update add clamd default # postfix reload
Nota: No añado smapd al runlevel default porque "amavisd" utiliza las librerias Perl de Spamassassin de forma directa.
Pruebas con un virus de verdad
Me aseguro que ClamAV funciona y detectaría un virus de pruebas. Desde EICAR ([European Institute for Computer Anti-Virus Research]) han producido una firma de prueba virus que la mayoría de los programas antivirus detectarán. Dado que realmente no es un virus, sino nada más un fichero con una firma que supone swer un virus, me es perfectamente válido. Aquí están los enlaces a las diferentes formas del virus: Un ejecutable para MSDOS, comprimido en un ZIP y comprimido en un ZIP dentro de un ZIP...
- ftp http://www.eicar.org/download/eicar.com
- ftp http://www.eicar.org/download/eicar_com.zip
- ftp http://www.eicar.org/download/eicarcom2.zip
Me bajo los tres ficheros y envío tres correos a uno de mis usuarios y analizo los logs a ver que pasa
- A continuación un ejemplo donde envío como anexo el fichero eicar.com y cómo es detectado por clamd.
Mar 1 20:08:09 [postfix/smtpd] sql_select option missing
Mar 1 20:08:09 [postfix/smtpd] auxpropfunc error no mechanism available_
Mar 1 20:08:09 [postfix/smtpd] initializing the server-side TLS engine
Mar 1 20:08:09 [postfix/smtpd] connect from asterix.parchis.org[192.168.1.3]
Mar 1 20:08:09 [authdaemond] Authenticated: sysusername=<null>, sysuserid=3001, sysgroupid=3008, homedir=/data/vmail, address=luis@luispa.com, fullname=Luis Palacios, maildir=luispa.com/luis@luispa.com/, quota=<null>, options=<null>
Mar 1 20:08:09 [authdaemond] Authenticated: ...
Mar 1 20:08:09 [imapd] LOGIN, user=luis@luispa.com, ip=[127.0.0.1], protocol=IMAP
Mar 1 20:08:09 [imapd] DISCONNECTED, user=luis@luispa.com, ip=[127.0.0.1], headers=0, body=0, time=0
Mar 1 20:08:09 [postfix/smtpd] C968E6FDC5: client=asterix.parchis.org[192.168.1.3], sasl_method=PLAIN, sasl_username=luis@luispa.com
Mar 1 20:08:09 [postfix/cleanup] C968E6FDC5: message-id=<7277E540-BE3B-476C-ABD2-6EBABDFAA851@luispa.com>
Mar 1 20:08:09 [postfix/qmgr] C968E6FDC5: from=<luis@luispa.com>, size=1038, nrcpt=1 (queue active)
Mar 1 20:08:09 [amavis] (29633-06) ESMTP::10024 /data/vmail/amavis/tmp/amavis-20090301T182513-29633: <luis@luispa.com> -> <luis@luispa.com> SIZE=1038 Received: from bolica.parchis.org ([127.0.0.1]) by localhost (bolica.parchis.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP for <luis@luispa.com>; Sun, 1 Mar 2009 20:08:09 +0100 (CET)
Mar 1 20:08:09 [amavis] (29633-06) smtp connection cache, dt: 413.9, state: 0
Mar 1 20:08:09 [amavis] (29633-06) Checking: OqkDlL44F9Sg [192.168.1.3] <luis@luispa.com> -> <luis@luispa.com>
Mar 1 20:08:09 [amavis] (29633-06) p003 1 Content-Type: multipart/mixed
Mar 1 20:08:09 [amavis] (29633-06) p001 1/1 Content-Type: text/plain, size: 55 B, name:
Mar 1 20:08:09 [amavis] (29633-06) p002 1/2 Content-Type: application/octet-stream, size: 68 B, name: eicar.com
Mar 1 20:08:09 [clamd] /data/vmail/amavis/tmp/amavis-20090301T182513-29633/parts/p002: Eicar-Test-Signature FOUND_
Mar 1 20:08:09 [amavis] (29633-06) run_av (ClamAV-clamd): /data/vmail/amavis/tmp/amavis-20090301T182513-29633/parts INFECTED: Eicar-Test-Signature
Mar 1 20:08:09 [amavis] (29633-06) virus_scan: (Eicar-Test-Signature), detected by 1 scanners: ClamAV-clamd
Mar 1 20:08:09 [amavis] (29633-06) Virus Eicar-Test-Signature matches (?-xism:^), sender addr ignored
Mar 1 20:08:09 [amavis] (29633-06) local delivery: <> -> <virus-quarantine>, mbx=/data/vmail/amavis/quarantine/virus-OqkDlL44F9Sg
Mar 1 20:08:09 [postfix/smtpd] sql_select option missing
Mar 1 20:08:09 [postfix/smtpd] auxpropfunc error no mechanism available_
Mar 1 20:08:09 [postfix/smtpd] initializing the server-side TLS engine
Mar 1 20:08:09 [postfix/smtpd] connect from bolica.parchis.org[127.0.0.1]
Mar 1 20:08:09 [postfix/smtpd] F2ED86FDED: client=bolica.parchis.org[127.0.0.1]
Mar 1 20:08:09 [postfix/cleanup] F2ED86FDED: message-id=<VAOqkDlL44F9Sg@bolica.parchis.org>
Mar 1 20:08:10 [postfix/smtpd] disconnect from bolica.parchis.org[127.0.0.1]
Mar 1 20:08:10 [postfix/qmgr] F2ED86FDED: from=<virusalert@parchis.org>, size=2459, nrcpt=1 (queue active)
Mar 1 20:08:10 [amavis] (29633-06) SEND via SMTP: <virusalert@parchis.org> -> <luis@parchis.org>,ENVID=AM..20090301T190809Z@bolica.parchis.org 250 2.0.0 Ok, id=29633-06, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as F2ED86FDED
Mar 1 20:08:10 [amavis] (29633-06) Blocked INFECTED (Eicar-Test-Signature), LOCAL [192.168.1.3] [192.168.1.3] <luis@luispa.com> -> <luis@luispa.com>, quarantine: virus-OqkDlL44F9Sg, Message-ID: <7277E540-BE3B-476C-ABD2-6EBABDFAA851@luispa.com>, mail_id: OqkDlL44F9Sg, Hits: -, size: 1038, 146 ms
Mar 1 20:08:10 [postfix/smtp] C968E6FDC5: to=<luis@luispa.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.25, delays=0.1/0/0/0.15, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=29633-06 - VIRUS: Eicar-Test-Signature)
Mar 1 20:08:10 [postfix/qmgr] C968E6FDC5: removed
Mar 1 20:08:10 [amavis] (29633-06) TIMING [total 149 ms] - SMTP greeting: 1 (1%)1, SMTP EHLO: 0 (0%)1, SMTP pre-MAIL: 0 (0%)1, SMTP pre-DATA-flush: 1 (1%)2, SMTP DATA: 39 (26%)28, check_init: 0 (0%)28, digest_hdr: 0 (0%)28, digest_body: 0 (0%)28, gen_mail_id: 0 (0%)28, mime_decode: 6 (4%)32, get-file-type2: 4 (3%)35, decompose_part: 0 (0%)35, decompose_part: 0 (0%)35, parts_decode: 0 (0%)35, check_header: 1 (0%)36, AV-scan-1: 2 (1%)37, read_snmp_variables: 0 (0%)37, best_try_originator: 1 (1%)38, update_cache: 0 (0%)38, decide_mail_destiny: 0 (0%)38, open-mbx: 2 (1%)40, write-header: 0 (0%)40, save-to-local-mailbox: 0 (0%)40, fwd-connect: 13 (9%)49, fwd-mail-pip: 1 (1%)50, fwd-rcpt-pip: 0 (0%)50, fwd-data-chkpnt: 0 (0%)50, write-header: 0 (0%)50, fwd-data-contents: 2 (1%)51, fwd-end-chkpnt: 64 (43%)94, prepare-dsn: 1 (0%)94, main_log_entry: 6 (4%)98, update_snmp: 1 (1%)99, SMTP pre-response: 0 (0%)99, SMTP response: 0 (0%)100, unlink-2-files: 0 (0%)100, rundown: 0 (0%)100
Mar 1 20:08:10 [postfix/virtual] F2ED86FDED: to=<luis@parchis.org>, relay=virtual, delay=0.13, delays=0.07/0.01/0/0.06, dsn=2.0.0, status=sent (delivered to maildir)
Mar 1 20:08:10 [postfix/qmgr] F2ED86FDED: removed
Mar 1 20:08:16 [postfix/smtpd] sql_select option missing
Mar 1 20:08:16 [postfix/smtpd] auxpropfunc error no mechanism available_
Mar 1 20:08:16 [postfix/smtpd] initializing the server-side TLS engine
Mar 1 20:08:17 [postfix/smtpd] connect from cpe-72-227-36-120.stny.res.rr.com[72.227.36.120]
Mar 1 20:08:17 [postfix/smtpd] NOQUEUE: reject: RCPT from cpe-72-227-36-120.stny.res.rr.com[72.227.36.120]: 550 5.1.1 <mail@luispa.com>: Recipient address rejected: User unknown in virtual mailbox table; from=<{$FNAME$}747@myway.com> to=<mail@luispa.com> proto=SMTP helo=<cpe-72-227-36-120.stny.res.rr.com>
Mar 1 20:08:17 [postfix/smtpd] disconnect from cpe-72-227-36-120.stny.res.rr.com[72.227.36.120]
Activación del Aprendizaje de Spam
El aprendizaje se utiliza la herramienta "sa-learn". Se ejecuta priódicamente contra un buzón lleno de mails basura (SPAM) y contra otro de mails buenos (HAM), de modo que spamassassin "aprende" que firmas significan spam y cuales ham. Esto se puede hacer en colaboración con los usuarios de tu dominio o lo puedes hacer tú mismo con tu cuenta (o cuentas). En mi caso lo voy a hacer yo mismo dado que suele ser lo más fácil, explicar el proceso a los usuarios no suele ser efectivo.
- Copiare manualmente a un buzón SPAM "mibuzonspam@mydomino.com" aquellos mails que spamassasin "no" detecta como spam, pero que sí lo son. Cada cierto tiempo ejecuto la herramienta sa-learn contra dicho buzon de spam y también contra mi buzón "limpio" sin spam, de modo que va aprendiendo.
Con amavisd
- Dado que utilizo Courier-imap con estructura Maildir, los comandos serán:
* PARA SPAM: Aquí cae el spam detectado por spamassassin y además he "movido" manualmente aquellos mails que me siguen entrando a mi buzón y no son detectados
# sa-learn -p /etc/mail/spamassassin/local.cf --spam --spam /data/vmail/midominio.com/mi-buzon-spam\@midominio.com/{cur,new}
* PARA HAM: Me he asegurado de limpiarlo manualmente de todo spam antes de ejecutar el comando.
# sa-learn -p /etc/mail/spamassassin/local.cf --ham /data/vmail/midominio.com/miusuario\@midominio.com/{cur,new}
- Esto lo hago de vez en cuando y después limpio el inbox de mibuzonspam@mydominio.com
Con MailScanner
- Dado que utilizo Courier-imap con estructura Maildir, los comandos serán:
* PARA SPAM: Aquí cae el spam detectado por spamassassin y además he "movido" manualmente aquellos mails que me siguen entrando a mi buzón y no son detectados
# sa-learn -p /etc/MailScanner/spam.assassin.prefs.conf --spam --spam /data/vmail/midominio.com/mi-buzon-spam\@midominio.com/{cur,new}
* PARA HAM: Me he asegurado de limpiarlo manualmente de todo spam antes de ejecutar el comando.
# sa-learn -p /etc/MailScanner/spam.assassin.prefs.conf --ham /data/vmail/midominio.com/miusuario\@midominio.com/{cur,new}
- Esto lo hago de vez en cuando y después limpio el inbox de mibuzonspam@mydominio.com
Primera ejecución
Con amavisd
- Crear el directorio bayes y las bases de datos bayesianas. Ya lo documenté antes:
# cd /data/vmail/amavis/.spamassassin/ # mkdir bayes # sa-learn --sync –p /etc/mail/spamassassin/local.cf # chmod 755 bayes/ # chmod 764 bayes/*
Con MailScanner
- Crear el directorio bayes y las bases de datos bayesianas. Ya lo documenté antes:
# cd /etc/MailScanner # mkdir bayes # sa-learn --sync –p /etc/MailScanner/spam.assassin.prefs.conf # chmod 755 bayes/ # chmod 764 bayes/* # ls -al /etc/MailScanner/bayes/ total 28 drwxr-xr-x 2 root root 4096 ene 25 20:45 . drwxr-xr-x 7 root root 4096 ene 26 20:19 .. -rwxrw-r-- 1 root root 10 ene 25 20:45 bayes.mutex -rwxrw-r-- 1 root root 12288 ene 25 20:45 bayes_seen -rwxrw-r-- 1 root root 12288 ene 25 20:45 bayes_toks
- Muevo todos los mails spam's no detectados por spamassassin a mibuzonspam@midominio.com
- Me aseguro que el buzón de mi usuario miusuario@midominio.com está limpio de spam
- Ejecuto los dos comandos anteriores
# sa-learn -p /etc/MailScanner/spam.assassin.prefs.conf --spam --spam /data/vmail/midominio.com/mi-buzon-spam\@midominio.com/{cur,new}
# sa-learn -p /etc/MailScanner/spam.assassin.prefs.conf --ham /data/vmail/midominio.com/miusuario\@midominio.com/{cur,new}
- Veo el directorio de nuevo y compruebo que la base de datos se ha actualizado
# ls -al /etc/MailScanner/bayes/ total 2376 drwxr-xr-x 2 root root 4096 ene 26 21:11 . drwxr-xr-x 7 root root 4096 ene 26 21:09 .. -rwxrw-r-- 1 root root 5520 ene 26 21:19 bayes.mutex -rwxrw-r-- 1 root root 167936 ene 26 21:19 bayes_seen -rwxrw-r-- 1 root root 2609152 ene 26 21:19 bayes_toks
- Borro todos los mails de mibuzonspam@midominio.com
Ejecuciones posteriores
- De vez en cuando repito lo anterior, ejecuto sa-learn sobre el buzón de SPAM y el mio "limpio".
- Borro todos los mails de mibuzonspam@midominio.com
- También es conveniente salvarse la base de datos Bayes de vez en cuando.
# cd /etc/MailScanner/bayes # tar cvfz /sitio/de/backup/bayes-database-AADDMM-HHMMSS.tgz
Optimizar el Sistema de Correo (PENDIENTE)
A partir de aquí he dejado documentadas algunas cosas realizadas, pero lo marco como PENDIENTE DE ESTUDIO !!!!, tengo que revisarlo y documentarlo mejor...
Excepciones a la regla
Toda buena regla tiene excepciones, podria interesarte hacer whitelist/blacklist de emisores. Para hacerlo he descomentado la siguiente línea en amavisd.conf.
read_hash("/data/vmail/amavis/sender_scores_sitewide"),
En dicho fichero pondré listas de correo o solo el dominio y le daré una puntuación positiva o negativa que se añadirá a la puntuación de spam automáticamente calculada. Un ejemplo:
# Whitelist todos los mails que vengan desde: postmaster@example.net -3.0
# Whitelist todos los emails que vengan de este dominio (excluyendo subdominios) .example.net 1.0
# En el fichero /etc/amavisd.conf hay más ejemplos
Note: Al final del artículo veré como hacer políticas por usuario usando MySQL.
- Para saltarse "spam checks for postmaster and abuse mailboxes", modifico el fichero amavisd.conf
map { $bypass_spam_checks{lc($_)}=1 } (qw(
postmaster@
abuse@
));
Aviso: While we are at it we should never automatically discard mails to the postmaster or the abuse accounts. See RFC 2142 MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS. Otherwise your domains might end up listed in some of the evil lists over at rfc-ignorant.org.
Adding more rules
Iambién tienes la posibilidad de añadir más reglas ofrecidas por SARE Ninjas en el SpamAssassin Rules Emporium. Se hace con el comando sa-update. Tengo pendiente estudiar la guía sobre sa-update.
Configuración de Vipul's Razor
- PENDIENTE DE ESTUDIO (Salida del emerge de razor)
: * Messages for package mail-filter/razor-2.82: * * Run 'razor-admin -create' to create a default config file in your * home directory under /home/user/.razor. (Remember to change user to * your username from root before running razor-admin) * * Razor v2 requires reporters to be registered so their reputations can * be computed over time and they can participate in the revocation * mechanism. Registration is done with razor-admin -register. It has to be * manually invoked in either of the following ways: * * To register user foo with 's1kr3t' as password: * * razor-admin -register -user=foo -pass=s1kr3t * * To register with an email address and have the password assigned: * * razor-admin -register -user=foo@bar.com * * To have both (random) username and password assgined: * * razor-admin -register * * razor-admin -register negotiates a registration with the Nomination Server * and writes the identity information in * /home/user/.razor/identity-username, or /etc/razor/identity-username * when invoked as root. * * You can edit razor-agent.conf to change the defaults. Config options * and their values are defined in the razor-agent.conf(5) manpage. * * The next step is to integrate razor-check, razor-report and * razor-revoke in your mail system. If you are running Razor v1, the * change will be transparent, new versions of razor agents will overwrite * the old ones. You would still need to plugin razor-revoke in your MUA, * since it's a new addition in Razor v2. If you are not running Razor v1, * refer to manpages of razor-check(1), razor-report(1), and * razor-revoke(1) for integration instructions. * * Messages for package mail-filter/amavisd-new-2.6.1-r1: * Setting up initial razor config files... * As of amavisd-new-2.4.5 p0f-analyzer.pl only binds to the loopback interface * by default instead of to all interfaces. You will need to change * in p0f-analyzer.pl to '0.0.0.0' if p0f-analyzer.pl is running on a different * host from amavisd or from other querying clients. * Adjusting permissions for /etc/amavisd.conf (0 for world, owner root:amavis)
Razor2 es una red colaborativo y distribuida de generación de checksums para luchar contra el Spam. Es necesario instalar el paquete mail-filter/razor y configurarlo. Durante la instalación de amavisd-new y dado que utilicé el flag "razor", dicho paquete ya está instalado.
- Configuración de Razor. Hay que ejecutar el proceso de configuración con el usuario amavis, por lo tanto ejecuto:
# usermod -s /bin/bash amavis # su - amavis amavis@bolica ~ $ pwd /data/vmail/amavis amavis@bolica ~ $ razor-admin -create amavis@bolica ~ $ ls -al .razor/ total 28 drwxr-xr-x 2 amavis amavis 4096 Mar 1 14:47 . drwxr-xr-x 6 amavis amavis 4096 Mar 1 11:00 .. -rw-r--r-- 1 amavis amavis 739 Mar 1 14:47 razor-agent.conf -rw-r--r-- 1 amavis amavis 0 Mar 1 14:47 razor-agent.log -rw-r--r-- 1 amavis amavis 843 Mar 1 11:00 server.n003.cloudmark.com.conf -rw-r--r-- 1 amavis amavis 57 Mar 1 14:47 servers.catalogue.lst -rw-r--r-- 1 amavis amavis 22 Mar 1 14:47 servers.discovery.lst -rw-r--r-- 1 amavis amavis 76 Mar 1 14:47 servers.nomination.lst amavis@bolica ~ $ exit # # usermod -s /bin/false amavis
Configuración de DCC
Al igual que Razor2, el programa DCC es una red de checksum de spam distribuida. Su filosofía es contar el número de receptores de un correo dado por el hecho de identificar cada correo con un checksum.
# emerge -pv dcc
These are the packages that would be merged, in order:
Calculating dependencies... done! [ebuild N ] mail-filter/dcc-1.3.55 USE="ipv6 -rrdtool" 1,424 kB
# emerge -v dcc
Una vez que he activado todo lo anterior, he tenido el servidor funcionando durante unos días, y he mirado los logs, he observado que funciona correctamente, muchos mails son catalogados como spam y el número de correo basura que llega a mis cuentas se ha reducido de forma increible. De hecho me hace plantearme la siguiente pregunta ¿estaré descartando demasiados emails? ¿habrá falsos positivos? ¿cuantos emails se están procesando? ¿cuantos son spam?.
Es obvio que hace falta monitorizar, tener posibilidad de saber cuantos correos se procesan, cuantos son válidos, cuantos son spam, tener opción de comprobar los que son spam de vez en cuando en busca de falsos positivos, etc.
Autoaprendizaje y Desvío de correos
Voy a empezar activando dos técnicas muy útiles. La primera es el desvío de correos Spam y la segunda el Autoaprendizaje. El primer paso es crear una cuenta especial que atrape todos los mails de spam en vez de tirarlos, de modo que me sirva a mi para ir verificando de vez en cuando si estoy teniendo falsos positivos.
- Creo un usuario en el sistema llamado "spamtrap" a donde enviaré todos el Spam
- useradd -m spamtrap
- maildirmake /home/spamtrap/.maildir
- chown -R spamtrap:mailusers /home/spamtrap/.maildir
(Give the spamtrap user a sensible password)
- passwd spamtrap
Clientes de correo
Thunderbird
- Bastante bueno.
emerge -v mozilla-thunderbird
- Soporte de Calendaring
emerge x11-plugins/lightning
Claws-mail
- Me gusta más.
- package.keywords
mail-client/claws-mail-3.7.3 ~amd64
- package.use
mail-client/claws-mail crypt gnome imap ipv6 kde session ssl dbus -dillo gnutls nntp smime spell startup-notification xface
- Instalar
emerge -v claws-mail claws-mail-gtkhtml
- Ejecutar
claws-mail
- Configurar el plugin HTML
Config->plugins->add gtkhtml2_viewer.so
Usuario spam-quarantine
Estoy probando, he creado el usuario spam-quarantine desde postfix.admin y he configurado lo siguiente en amavis:
Viejo: $spam_quarantine_to = 'spam-quarantine\@$mydomain'; # local quarantine Nuevo: $spam_quarantine_to = 'spam-quarantine';
Enlaces y Créditos
En la creación de este artículo he seguido las guías y referencias de Sistema de correo virtual con postfix de Gentoo y otra como la Virtual Mail Server setup with Postfix, Courier and PostfixAdmin. De hecho he utilizado material documentado en dichas guías y lo he adaptado para mi caso, donde utilizo otro servidor de IMAP.
Volver a la página de SERVICIOS
--Luis 10:31 1 mar 2009 (CET)

