Qmail con soporte de cifrado y autenticación SMTP


Introducción

Qmail es un MTA muy popular en sistemas Linux (y Unix). Un MTA ("Mail Transport Agent" o "Agente de Transporte de Correos") es el programa encargado de transferir el correo electrónico a través de Internet. Un MTA no es usado por los usuarios directamente, sino que estos utilizan un programa cliente que se encarga de ponerse en contacto con el MTA para enviar los mensajes. Realmente Qmail no es un solo programa, sino que está formado por varios que interactúan entre si para funcionar como uno solo.

En esta guía explico cómo instalar Qmail en Gentoo y cómo configurarlo para:

  • Tener entrega local entre usuarios de la máquina en la que se encuentra el servidor.
  • Poder consultar remotamente los mensajes a través de POP3.
  • Poder enviar mensajes al exterior tanto desde el interior como desde el exterior de la máquina a través de SMTP, con las siguientes particularidades:
    • autenticación para evitar que usen nuestro servidor personas no autorizadas (spammers).
    • cifrado para que nuestros datos viajen seguros.
  • Evitar en la medida de lo posible el SPAM.

Además, procuraré dar una descripción breve de los distintos tipos de cifrado y métodos de autenticación que soporta Qmail así como de los programas que podemos utilizar para realizar la autenticación.

Esta guía no cubre el uso de Qmail para dar servicio a dominios virtuales, para eso ya existe una excelente guía de qmail/vpopmail en la documentación oficial. Finalmente, aclarar que la guía está pensada para el ebuild qmail-1.03-r16 aunque supongo que seguirá siendo válida para versiones superiores.

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 2.5.

Índice


Instalación

Antes de nada desinstalar cualquier servidor de correo previo

# emerge -Ca ssmtp mailbase sendmail postfix

Lo siguiente es instalar Qmail. Estos son los valores de la variable USE que he utilizado: USE="notlsbeforeauth ssl".
El valor USE="ssl" proporciona capacidades de cifrado a Qmail. La explicación de la USE="notlsbeforeauth" se verá en el apartado dedicado al SMTP.

Una vez modificado el valor de la variable USE ya podemos instalar Qmail

# emerge -av qmail
# source /etc/profile


Configuración básica

Lo siguiente es ejecutar el script de configuración. Este script averigua el nombre de dominio de nuestra maquina (FQDM o "fully qualified domain name", es decir, el resultado del comando # hostname --fqdn) y lo escribe en los archivos:

  • /var/qmail/control/me contiene el dominio de nuestra máquina.

  • /var/qmail/control/defaultdomain contiene el nombre que aparecera por defecto detrás de la @ en nuestros e-mails.

  • /var/qmail/control/plusdomain contiene el dominio que se agrega a cualquier nombre de host acabado en el signo más (+).

  • /var/qmail/control/locals indica a Qmail las direcciones sobre las que el correo se entrega de forma local, los mensajes destinados al resto de maquinas no indicadas serán reenviados a su correspondiente MX.

  • /var/qmail/control/rcpthosts indica a Qmail que siempre acepte hacer relaying de correo dirigido a estos servidores, independientemente de la IP que haga la solicitud.

En esta guía se supone que el dominio principal de correo de nuestra máquina es dominio.foo y además también vamos a dar servicio de correo al dominio otrodominio.foo. Es decir, las direcciones de nuestros usuarios serán del tipo usuario@dominio.foo. Si no vas a dar servicio a ningún otro dominio simplemente ignora las (pocas) ocurrencias de otrodominio.foo a lo largo de esta guía.

Además, este script lee los datos del fichero de configuración del certificado y genera un certificado SSL. Aunque cómo configurar el SMTP se verá posteriormente, antes de ejecutar el script es necesario editar el fichero de certificado /var/qmail/control/servercert.cnf para que refleje los datos correctos, especialmente los de la sección "req_dn"

# joe /var/qmail/control/servercert.cnf
# 2-Letter ISO country code
C=ES
# FULL name of state/province/district
# NO abbreviations!
ST=Valencia
# FULL name of city
# NO abbreviations!
L=Valencia
# Full Name of your organization
# NO abbreviations!
O=Gentoosiasta S.L
# Leave this alone unless specifically need to change it!
OU=Automatically-generated Qmail SMTP SSL key
# This should be a FQDN that resolves to the IP of your server
CN=dominio.foo
# This should be the email address for the administrator of the server
emailAddress=stolz@dominio.foo

Ahora ya estamos en condiciones de ejecutar el script de configuración:

# emerge --config =qmail-1.03-r16

Para evitar problemas, asegurarse de que realmente el script ha incluido en los archivos los nombres de dominios correctos:

# cd /var/qmail/control/
# for i in me defaultdomain plusdomain locals rcpthosts ;do echo ---Contenido de $i----; cat $i;done
---Contenido de me----
dominio.foo
---Contenido de defaultdomain----
dominio.foo
---Contenido de plusdomain----
dominio.foo
---Contenido de locals----
dominio.foo
otrodominio.foo
localhost
---Contenido de rcpthosts----
dominio.foo
otrodominio.foo
localhost

Nota: Si quieres tener un certificado 'de verdad', ejecuta:

# openssl req -new -nodes -out req.pem -config /var/qmail/control/servercert.cnf -keyout /var/qmail/control/servercert.pem

y manda req.pem a alguna compañía de validación de certificados. Suponiendo que el certificado que nos devuelva se llama signed_req.pem, entonces ejecutar:

# cat signed_req.pem >> /var/qmail/control/servercert.pem


Entrega local


Crear los buzones

Qmail guarda los mensajes en buzones con un formato propio llamado Maildir. Para generar dichos buzones hay que crear un directorio con el comando maildirmake en todos los usuarios que ya existiesen en el sistema. Por ejemplo

# maildirmake ~/.maildir

Hay que asegurarse de ejecutar el comando como el usuario para el que queremos crear el directorio,y NO como root.
Esto lo tenemos que hacer con TODOS los usuarios que ya existiesen en el sistema. Para no tener que hacerlo en los próximos usuarios que añadamos, el script de configuración ya se ha encargado de crear por nosotros el directorio .maildir en /etc/skel/.


Crear los alias de root

Por motivos de seguridad Qmail nunca envía correo al usuario root, así es que debemos indicar a qué usuario será redirigido el correo que normalmente va destinado a root

# cd /var/qmail/alias
# echo stolz > .qmail-root
# echo stolz > .qmail-postmaster
# echo stolz > .qmail-mailer-daemon
# echo stolz > .qmail-webmaster
# chown alias:qmail .qmail-*

Nota: Un alias no puede nunca anteponerse a las entregas a un usuario válido del sistema. Por ejemplo si xxxxx es un usuario normal, ~alias/.qmail-xxxxx no se tendrá en cuenta.


Activar la entrega local

Para activar la entrega local

# ln -s /var/qmail/supervise/qmail-send /service/qmail-send

Para que Qmail se ejecute al arrancar hay que añadir svscan al inicio

# rc-update add svscan default


Comprobar la entrega local

Para comprobar que Qmail funciona para entrega local:

# /etc/init.d/svscan start
# emerge -n mutt
# ssh stolz@localhost

# qmail-inject root << EOF
¡Prueba del e-mail de root!
EOF

# qmail-inject postmaster << EOF
¡Prueba del e-mail de postmaster!
EOF

# qmail-inject stolz << EOF
¡Prueba del e-mail de stolz!
EOF

# qmail-inject webmaster << EOF
¡Prueba del e-mail de webmaster!
EOF

# mutt

Si todo ha ido bien debería haber 4 e-mails en la bandeja de entrada de mutt.


Entrega remota (SMTP)

Para enviar mensajes a usuarios que no pertenezcan a nuestro dominio se usa el protocolo SMTP que es el protocolo estándar de Internet para transferir correo electrónico. Se utiliza para que un MTA o un MUA ("Mail User Agent", el programa que ejecuta el usuario para conectarse a un MTA y transferirle los mensajes de e-mail) remitan mensajes a otro MTA.

Para activar el servidor SMTP de Qmail

# ln -s /var/qmail/supervise/qmail-smtpd /service/qmail-smtpd


Cifrado

Los ebuilds de Qmail posteriores a la versión 1.03-r13 soportan cifrado y autenticación. Por defecto, Qmail se instala con la USE="-notlsbeforeauth". Con esta opción se fuerza a los clientes SMTP a solicitar una sesión cifrada antes de permitir el comando AUTH. Intentar usar AUTH sin cifrado fallará.

Como no todos los clientes que van a usar mi servidor soportan cifrado, he instalado Qmail con la USE="notlsbeforeauth". De esta forma permito a mis clientes decidir si usar o no cifrado.


¿Por qué usar autenticación?

La siguiente sección es la que mas trabajo de configuración requiere para evitar que nuestro servidor de correo actúe como un open relay. Open relay o relé de correo abierto se utiliza para referirse a servidores de correos que aceptan mensajes destinados a usuarios ajenos al sistema sin ningún tipo de impedimento o comprobación.

Un servidor configurado como open relay permitirá que cualquiera pueda usarlo para enviar mensajes de correo, independientemente de a quien vayan destinados. El gran problema que esto supone es que los spammers pueden usar nuestro MTA para enviar spam de forma indiscriminada, además de consumirnos nuestro preciado, escaso y caro ancho de banda :).

Para establecer restricciones al envío de SMTP existen distintas técnicas. La que se cubre en esta guía es la autenticación SMTP, es decir, requerir un usuario y una contraseña para poder usar el servidor SMTP.


Tipos de autenticación SMTP

Existen tres tipos de autenticación SMTP (Para más información consultar RFC 2554):

  • PLAIN (ninguna).
  • LOGIN (l/p en texto sin cifrar).
  • CRAM-MD5 (cifrado).

Existen (al menos en la instalación por defecto de Gentoo) dos programas para hacer la autenticación SMTP:

  • cmd5checkpw : mantiene en /etc/poppasswd una lista de los nombres y contraseñas de usuarios permitidos. Para que la autenticación funcione correctamente, hay que introducir los datos en dicho fichero. La desventaja es que las contraseñas no se guardan cifradas y además es necesario mantener un archivo de contraseñas de correo a parte del archivo de contraseñas del sistema.
  • checkpassword : lee las contraseñas de /etc/passwd y/o /etc/shadow, permitiendo a usuarios del sistema utilizar autenticación SMTP. La ventaja de usar checkpassword frente a cmd5checkpw es que las contraseñas no tienen que ser almacenadas en un formato sin cifrar en el servidor. La desventaja de checkpassword es que no soporta CRAM-MD5, por lo tanto hay que usar alguno de los métodos de autenticación LOGIN o PLAIN, lo que significa que las contraseñas tienen que ser enviadas sin cifrar a través de la red. Otra desventaja de checkpassword es que para que funcione correctamente tenemos que cambiarle los permisos setuid, si no la autenticación fallará. Esto puede suponer un grave error de seguridad, por lo que hay que tenerlo en cuenta a la hora de elegir que programa de comprobación de contraseña usar.


Configurar la autenticación SMTP

En esta guía se explica como usar checkpassword como programa de comprobación de contraseñas. Concretamente se va a usar net-mail/checkpassword-pam, que es una versión de checkpassword con soporte para PAM. Por tanto, antes de configurar nada tenemos que instalar dicho programa:

# emerge -av net-mail/checkpassword-pam

Además, como ya hemos dicho,checkpassword requiere establecer el setuid. Para asignarle los permisos necesarios ejecutar:

# chmod 6755 /usr/bin/checkpassword-pam

Para configurar Qmail para que use checkpassword como programa de comprobación de la contraseña, editar el fichero /var/qmail/control/conf-smtpd y descomenta las cinco líneas siguientes en la sección "SMTP-AUTH":

QMAIL_SMTP_CHECKPASSWORD="/usr/bin/checkpassword-pam -s system-auth"
[[ -n "${QMAIL_SMTP_CHECKPASSWORD}" ]] && {
        [[ -z "${QMAIL_SMTP_POST}" ]] && QMAIL_SMTP_POST=/bin/true
        QMAIL_SMTP_POST="${QMAIL_SMTP_CHECKPASSWORD} ${QMAIL_SMTP_POST}"
}

Reinicia Qmail para que los cambios tengan efecto

# source /etc/profile
# /etc/init.d/svscan restart


Comprobar la autenticación SMTP

Para comprobar que tenemos SMTP-AUTH, en el siguiente comando debe aparecer AUTH LOGIN PLAIN CRAM-MD (lo que está en negrita es lo que tenemos que escribir, el resto es la salida del comando):

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 dominio.foo ESMTP
ehlo
250-dominio.foo
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-AUTH LOGIN PLAIN CRAM-MD5
250 SIZE 0
quit
221 dominio.foo
Connection closed by foreign host.

Si instalaste Qmail con la USE="-notlsbeforeauth" (opción por defecto) entonces no verás la salida del comando de la misma forma ya que no estás usando una sesión cifrada. Por tanto la salida del comando aparentará que el servidor no soporta autenticación SMTP. Si estás en ese caso, salvo que sepas cifrar los datos a mano ;) la única forma de comprobar que la autenticación SMTP funciona es usando un cliente de correo o algo más complicado.


Filtrando conexiones

Con la configuración actual de Qmail aunque ya tengamos activada la autenticación SMTP nuestro sistema aceptará envíos SMTP procedentes desde cualquier IP con las siguientes particularidades:

  • Para las conexiones locales(desde el propio servidor, no desde la red), todo e-mail será aceptado, y cualquier e-mail no destinado para la entrega local será dirigido (o "relayed") a la destinación apropiada.
  • Para el resto de las conexiones, solamente los e-mails destinados para la entrega local será aceptado.

Por tanto es necesario hacer que Qmail acepte hacer envíos a usuarios de otros dominios.

Al instalar Qmail también se instaló el paquete ucspi-tcp. Qmail lo usa para manejar las conexiones TCP entrantes al servicio. Se pueden filtrar dichas conexiones mediante reglas de filtrado. Estas reglas se almacenan en sus archivos de configuración dentro de /etc/tcprules.d/. Existen dos archivos por cada servicio, el archivo de configuración (ej. tcp.qmail-smtp) y la versión compilada del mismo, que es el que usa ucspi-tcp (ej. tcp.qmail-smtp.cdb).

Podemos usar estas reglas para evitar que nuestro servidor SMTP funcione como un "open relay", forzando a los clientes externos al sistema a usar autenticación SMTP.

# joe /etc/tcprules.d/tcp.qmail-smtp
#Al localhost (conexiones desde la propia máquina) le permitimos hacer relay sin autenticación por SMTP 
#y no comprobamos la validez en listas negras on-line (RBL)
127.0.0.1:allow,RELAYCLIENT="",RBLSMTPD=""

#A todas aquellas maquinas de la red local 192.168.0.x. Tampoco les exigimos autenticación por SMTP
192.168.0.:allow,RELAYCLIENT="",RBLSMTPD=""

#Al resto de ordenadores le permitimos conectarse al servidor pero no hacer relay salvo que se autentiquen.
#Además comprobamos la validez en listas negras on-line (RBL)
:allow

Nota: Para que funcione la comprobación de listas negras on-line (RBL) es necesario que en el archivo /var/qmail/control/conf-smtpd esté sin comentar la línea

QMAIL_SMTP_PRE="${QMAIL_SMTP_PRE} rblsmtpd -r RBL-SERVER"

siendo RBL-SERVER un servidor de tu confianza de los listados en la página de rblsmtpd, por ejemplo zen.spamhaus.org

Ahora hay que reconstruir la versión binaria (Cada vez que realices una actualización del archivo de configuración /etc/tcprules.d/tcp.qmail-smtp habrá que ejecutar esto)

# tcprules /etc/tcprules.d/tcp.qmail-smtp.cdb /etc/tcprules.d/.tcp.qmail-smtp.tmp < /etc/tcprules.d/tcp.qmail-smtp
# chmod 444 /etc/tcprules.d/tcp.qmail-smtp.cdb

Las reglas binarias son leídas cada vez que se produce una conexión, por tanto, no es necesario reiniciar Qmail para que los cambios en las reglas tengan efecto.


Combatiendo el SPAM

La comprobación en las listas negras vista en un apartado anterior es solo el comienzo de la lucha contra el peor enemigo de cualquier administrador de un servidor de correo, el SPAM. El tema es demasiado extenso como para tratarlo aquí de forma detallada, así es que solo mencionaré algunos métodos útiles para combatir el SPAM con Qmail.

La forma más rápida y sencilla es instalar el paquete mail-filter/spamassassin con la USE qmail. Esto instalará /usr/bin/qmail-spamc, un cliente de spamassassin extremadamente rápido que podemos integrar con Qmail con tan solo editar /etc/tcprules.d/tcp.qmail-smtp y remplazar el ultimo

:allow

por

:allow,QMAILQUEUE="/usr/bin/qmail-spamc"

Recuerda que hay que reconstruir la versión binaria del archivo

# tcprules /etc/tcprules.d/tcp.qmail-smtp.cdb /etc/tcprules.d/.tcp.qmail-smtp.tmp < /etc/tcprules.d/tcp.qmail-smtp
# chmod 444 /etc/tcprules.d/tcp.qmail-smtp.cdb

Otra opción más completa es usar el programa Simscan (mail-filter/simscan) que integra en un solo paquete spamassassin+antivirus varios+filtro de adjuntos+filtro por expresiones regulares (regex), con una configuración bastante sencilla aplicable por separado a distintos dominios.

Por último podemos usar los plugins de qmail-spp, que permiten aplicar distintos filtros antes de que el correo sea aceptado por el servidor. Tan solo hay que instalar Qmail con la USE del mismo nombre activada. Encuentro particularmente útil el siguiente plugin, que rechaza el mensaje si el destinatario no es un usuario de Qmail válido, para evitar los abundantes "bounces" causados por los spammers.


Comprobación de correo remota (POP3)

Para obtener los correos de nuestros usuarios desde una máquina remota se usa el protocolo POP, también conocido como POP3 para referirse a la tercera versión del protocolo.

Para usar el servidor POP3 de Qmail es tan sencillo como crear el siguiente enlace

# ln -s /var/qmail/supervise/qmail-pop3d /service/qmail-pop3d


Utilidades

En el directorio /var/qmail/bin existen varios programas para consultar el estado de Qmail aunque las mejores utilidades se encuentran en programas externos. Algunas recomendaciones:

  • Para ver el estado de las colas de mensajes: qmHandle (net-mail/qmhandle).
  • Para recibir estadísticas del uso del servidor: qmailanalog (net-mail/qmailanalog).
  • Para generar gráficas del uso del servidor: Qmrtg (net-mail/qmrtg).


Conclusiones

Con esto ya tenemos servidor SMTP y POP3 funcionando. Todos los mensajes destinados a los host de rcphost serán enviados. Todos los mensajes, independientemente del destino, que vengan de las ip's de tcp.qmail-smtp también serán enviados. El resto de mensajes (no vienen de las IP's de tcp.qmail-smtp o no van destinados a los hosts de rcphost) harán autenticación SMTP antes de ser enviados. Además, los clientes pueden elegir si usar cifrado o no.

Para comprender mejor Qmail.

El protocolo SMTP utiliza el puerto 25 de TCP y el protocolo POP3 el puerto 110 de TCP, en caso de usar un router o firewall no olvides redireccionar estos puertos a la máquina servidor de correo.

Se agradecerá cualquier tipo de corrección, crítica, aclaración, ampliación o comentario sobre esta entrada.

ñañaña

Gracias por este regalo de navidades XDDDD, me pongo manos a la obra... ya! :). Gracias.

Maestrisimo

Eres un genio acabas de salvarme la vida..., tuve q instalar Gentoo en un SUN FIRE 280R y la verdad no podia mas con el sendmail, postfix y asi di con tu blog, hermano segui al pie de la letra, excepto por un paquete enmascarado (checkpassword-pam) todo funciono de maravilla,
gracias.