Servidores de correo

De XTech Capacitacion

Tabla de contenidos

Conceptos Basicos

Servidor de Mail

Todos sabemos que es un servidor de mail: es un agente que maneja los mensages. Chocolate por la noticia. Pero pocos saben como esta formado realmente un servidor de mail. La idea de este curso es ir viendo como esta formado un servidor moderno incluyendo controles de virus, spam, spammers, autentificación, webmail, etc.

Para empezar, podemos decir que un servidor de mail cuenta con varios agentes, que pueden estar o no en el mismo servidor o en el mismo servicio (Exchange puede tener todos los agentes en el mismo servicio, por ejemplo). Pero como estamos en sistemas del tipo Unix y estos tienden a modularizar todo, vamos a ver que para armar un servidor de mail, se necesitan varios agentes distintos, que hacen cosas muy distintas.

Agente de transporte de Mail (MTA)

A este agente se lo llama MTA (Mail Transport Agent). Y solo se encarga de enviar y recibir mensage entre los demás MTA. Normalmente, como cliente, nunca usamos el MTA más que para decirle "Enviame esto". El MTA toma ese mensage y, porque es muy inteligente, sabe a donde enviarlo, como hacer para llegar ahí, que medidas tomar ante un error y, si lo educamos bien, si tiene virus o es un spam, en cuyo caso va a hacer un informe el cual le va a llegar a ud. y al amable administrador del MTA.

Hay muchos MTA en Unix/Linux. A saber: sendmail, postfix, qmail, exim, courier, etc. Rescatando solo los mejores. De todos esos, nosotros vamos a aprender a usar Postfix. Las razones son variadas: hoy por hoy Postfix es el MTA más moderno, confiable, rápido y fácil de configurar. Además de que tiene una infinidad de plugins, demonios, antivirus, etc.

Cliente de correo (MUA)

El Mail User Agent o Cliente de correo electrónico es un programa que ejecutan los usuarios para leer y escribir sus mensajes. En la mayoría de casos se ejecuta en un computador personal. Este programa normalmente enviará los nuevos mensajes redactados por el usuario al servidor de la organización/proveedor, y descargará los mensajes pendientes para lectura del usuario desde el servidor de la organización/proveedor. MTA/Servidor

El Mail Transfer Agent se encarga de enviar (y reintentar de ser necesario) los mensajes redactados por los usuarios de la organización. Igualmente, recibe los mensajes dirigidos a usuarios de la organización y los coloca en sus respectivas "casillas de correo" para su posterior lectura.

Protocolos

SMTP

Simple Mail Transfer Protocol (SMTP), o protocolo simple de transferencia de correo electrónico. Protocolo de red basado en texto utilizado para el intercambio de mensajes de correo electrónico entre computadoras y/o distintos dispositivos (PDA's, Celulares, etc).

Con el tiempo se ha convertido en uno de los protocolos más usados en internet. Para adaptarse a las nuevas necesidades surgidas del crecimiento y popularidad de internet se han hecho varias ampliaciones a este protocolo, como poder enviar texto con formato o archivos adjuntos.

SMTP se basa en el modelo cliente-servidor, donde un cliente envía un mensaje a uno o varios receptores.

En el conjunto de protocolos TCP/IP, el SMTP va por encima del TCP, usando normalmente el puerto 25 en el servidor para establecer la conexión.

POP

El Post Office Protocol permite a los programas clientes de correo electrónico extraer los mensajes pendientes en las casillas de correo del usuario para que éste los pueda visualizar.

IMAP

El Internet Message Access Protocol, al igual que POP, permite a los programas clientes de correo electrónico extraer los mensajes pendientes en las casillas de correo del usuario para que éste los pueda visualizar.

Mediante IMAP se puede tener acceso al correo electrónico desde cualquier equipo que tenga una conexión a Internet, mediante un navegador. Una vez configurada la cuenta IMAP, puede especificar las carpetas que desea mostrar y las que desea ocultar, esta característica lo hace diferente del protocolo POP.

Mensajes

Header (cabecera)

Esta es una sección informativa que contienen todos los mensajes y que contiene datos relacionados a su envío, tales como el nombre y dirección electrónica del creador del mensaje, la lista de destinatarios, la fecha de envío, los servidores intermedios por donde el mensaje ha pasado, etc.

Body

Contiene el texto del mensaje en sí. Está compuesto por caracteres ASCII.

Envelope (sobre)

Contiene información usada para enrutar los mensajes, tal como los destinatarios inmediatos. Esta información normalmente tiene coincidencias con algunos componentes del header.

Attachment

Los archivos que no se componen de texto ASCII pueden ser enviados si primero se codifican como texto ASCII y se añaden ordenadamente a un mensaje normal. Estos añadidos al mensaje se denominan attachments.

Casilla del usuario

Los usuarios de correo electrónico no están conectados a la red durante todo el día, y lo mismo ocurre con sus computadores. Debido a esto, los mensajes que están dirigidos a ellos normalmente se almacenan en un área temporal denominada "casilla de correo" a la espera de que el usuario la extraiga cuando esté listo.

Relay

Corresponde a la facultad del MTA de reenviar los mensajes provenientes de un computador hacia otro computador. Por ejemplo, cuando un usuario de la red local le proporciona un mensaje que en realidad está dirigido hacia un usuario en Internet.


Postfix

Los paquetes necesarios son:

Paquete Descripción
postfix Paquete principal del sistema
libsasl2, libsasl2-modules, sasl2-bin Librerias y binarios del sistema de autentificación del SMTP
metamail Soft para encriptar en MIME y probar la autentificación

Archivos de Configuración de Postfix

Los Archivos de configuración son:

Archivo Descripción
/etc/postfix/main.cf Configuración central de Opciones
/etc/postfix/master.cf Configura a los distintos demonios internos de Postfix.
/etc/aliases Setea los Alias de mail y listas de correo
/etc/postfix/sasl/smtpd.conf Configura los métodos de validación del SASL

/etc/postfix/main.cf

smtpd_banner = SuperServidor de Mail (inHackeable)
myhostname = mailserver
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = dominio.com,localhost.localdomain,localhost
mynetworks = IP_mi_lan/24, 127.0.0.0/8
mailbox_size_limit = 0
message_size_limit = 10485760 # 10mb
mailbox_home= .maildir/

/etc/postfix/master.cf

Lo siguiente activará que la salida sea detallada para poder depurar en el archivo /etc/postfix/master.cf:

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
#
==========================================================================

>>> (Sólo hay que añadir "-v" después de smtpd a la siguiente línea) <<<<

smtp      inet  n       -       n       -       -       smtpd -v

/etc/mail/aliases

Lo siguiente es editar /etc/mail/aliases para añadir los alias locales. Debe haber al menos un alias para root como:

root: your@email.address.

luego, ejecutar lo siguiente si se añadio nuevo alias:

# /usr/bin/newaliases

Postfix + dominios virtuales

Es muy habitual que un servidor SMTP aloje y dé servicios a mas de un dominio. Este documento trata de aclarar un poco la configuracion de Postfix para que pueda implementar esta funcionalidad. Por su puesto, la lectura de este documento debe complemetarse con la consulta de la documentación oficial del desarrollador de Postfix.

La mayor parte de lo que aquí se expone proviene de la documentación html que incluye el paquete postfix y del directorio de ejemplos de configuración que suele encontrarse en el directorio /etc/postfix tras la instalación.

Los usuarios de Sendmail que estén acostumbrados a manejar dominios virtuales a través de virtusertable no deben tener dificultad alguna para migrar esa funcionalidad a Postfix.

En general, hay dos formas de manejar los dominios virtuales en postfix:

con el Estilo Postfix y con el Estilo Sendmail

Estilo Postfix

Los alias, usuarios locales y listas de correos no son visibles en un dominio virtual (mas abajo explico qué es eso). Para especificar ese estilo, tenemos que incluir en '/etc/postfix/virtual' líneas como las siguientes:

mi_dominio.virtual                 Y aqui ponemos cualquier cosa, no importa.
usuario1@mi_dominio.virtual        direccion1
usuario2@mi_dominio.virtual        direccion2, direccion3, ...
usuario3                           direccion4, direccion5, ...
@mi_dominio.virtual                direccion6, ....


En general, la forma de las líneas es

patrón     resultado


cuando uno de los patrones es reconocido en una dirección de correo, entonces ésta última es sustituida por el resultado.

En el ejemplo, la primera linea es obligatoria para especificar el estilo postfix, las otras líneas ilustran las distintas posibilidades. Nótese que podemos redirigir a una o más direcciones.

La segunda línea redirigira todo correo cuyo destinatario es usuario1@mi_dominio.virtual a direccion1.

La tercera línea muestra el hecho de que se puede redirigir a más de una dirección.

En la cuarta línea, usuario3@algun.dominio es redirigida a direccion4, direccion5 ... cuando 'algun.dominio' figura en alguno de los parametros de configuracion $myorigin, $mydestination o $inet_interfaces.

El la quinta linea, redirigirá todo el correo de cualquier usuario de mi_dominio.virtual a direccion6 ...

En cuanto a las direcciones de reenvio, las que tienen forma '@otro_dominio ' son expandidas al mismo usuario de 'otro_dominio', pero esa expansión solo funciona en la primera direccion de la lista (puede haber más, como se muestra en los ejemplos anteriores).


Como se ha dicho en un principio, el servidor postfix aceptará correo de cualquier usuario conocido en mi_dominio.virtual y rechazará como imposible cualquier usuario no conocido en ese dominio. Aquí radica la diferencia en el estilo sendmail. Los usuarios locales NO son reconocidos a no ser que se adapten a algunas de las condiciones del archivo virtual dentro de ese dominio. Los alias definidos en /etc/aliases TAMPOCO son reconocidos en este estilo. Hay que utilizar el estilo sendmail para poder utilizar implicitamente alias y usuarios locales.

Estilo Sendmail

Para fijar ese estilo tenemos que añadir en /etc/postfix/main.cf el nombre del dominio virtual al parámetro de configuración $mydestination:

mydestination= $myhostname localhost.$mydomain $mydomain mi_dominio.virtual

En el archivo /etc/postfix/virtual ahora NO debemos incluir la primera línea del ejemplo del estilo postfix. Es decir, ahora quedaría:

usuario1@mi_dominio.virtual               direccion1
usuario2@mi_dominio.virtual               direccion2, direccion3, ...
usuario3                                  direccion4, direccion5, ...
@mi_dominio.virtual                       direccion6, .... 

con el mismo significado y posibilidades. Ahora bien, la diferencia respecto al estilo postfix es que ahora son utilizables los alias, usuarios locales y listas de correos. Ejemplo, supongamos que tenemos definido el usuario local usuariolocal y que en el archivo aliases tenemos también el alias,

mi_alias:     usuariolocal

Ahora postfix SI que redirigirá el correo a destinatarios como mi_alias@mi_dominio.virtual o usuariolocal@mi_dominio.virtual a usuariolocal@mi_dominio.local aunque no aparezcan explícitamente en el archivo. Evidentemente, si tampoco el usuario es reconocido como alias o usuario local, es mensaje es devuelto.

Por si todas estas posibilidades no fueran pocas, en ambos estilos se pueden incluir también expresiones regulares.

Para generar el archivo /etc/postfix/virtual.db o /etc/postfix/virtual.dbm , una vez editado /etc/postfix/virtualhay que ejecutar postmap

#) postmap hash: /etc/postfix/virtual

También hay que incluir en /ect/postfix/main.cf la línea

virtual_maps = hash:/etc/postfix/virtual

Con lo que postfix lo utilizará al cabo de alrededor de un minuto, o inmediatamente tras

#) rcpostfix reload

En este ejemplo se ha utilizado el archivo /etc/postfix/virtual, pero podríamos haber editado otro, en cuyo caso deberíamos incluirlo en $virtual_maps

Cómo se incluye más de un dominio virtual

Pues depende del estilo de modelo virtual que se adopte. Si se utiliza el estilo sendmail entonces se debe incluir los dominios en main.cf cuando se defina el parametro $mydestination

mydestination= $myhostname localhost.$mydomain $mydomain mi_dominio.virtual1 mi_dominio.virtual2  ...

En caso de utilizar estilo postfix entonces se deber incluir en el archivo definido en $virtual_maps una seccion por cada dominio virtual.

mi_dominio.virtual1   cualquier cosa
.....
mi_dominio.virtual2   cualquier cosa
.....

Lo habitual es que desemos, asimismo, distribuir el correo que venga de los dominios virtuales al resto de la red (hacer relay). Como le valor por defecto de $relay_domains es $mydestination, si ya hemos incluido todos los dominios en los que queremos hacer relay en $mydestination, no hace falta incluirlos en $relay_domains. En caso contrario, por ejemplo si se utiliza el estilo postfix, habria que incluirlos:

relay_domains = $mydestination
       mi_dominio.virtual1
       mi_dominio.virtual2

Autentificación SMTP mediante SASL

La autentificacion del usuario en un servidor SMTP es un tema muy importante, sobre todo cuando los usuarios están fuera de nuestra red local. No podemos (o no debemos) dejar nuestro servidor abierto a cualquier usuario. Si así lo hicieramos, en pocas horas el servidor se saturaría mandando miles de correos no solicitados (SPAM) proveniente de usuarios sin escrúpulos y, poco más tarde, tendríamos el 'privilegio' de figurar en las listas negras antispam resultando que nuestro propio correo se vería bloqueado en gran parte de la Red.

Hay muchas formas de evitar usos ilícitos de nuestro servidor. El más habitual es restringir la posibildad de envio de correo hacia el exterior solamente a los usuarios de una intranet. Los servidores externos sólamente podrían enviar correo cuando el destino final es nuestra intranet. No obstante ese es un mecanismo que solamente sirve cuando los potenciales usuarios estan dentro de una red conocida. Si el usuario se conecta a través de un modem, en que cada vez su dirección IP varía, es necesario habilitar algún mecanismo de identificación. Aún incluso dentro de una red, la identificación es una práctica aconsejable.

Para conseguir la identificación en los servidores SMTP, la practica más habitual es SMTP después de POP y SASL. Hay otros mecanismos muy débiles, como permitir sólamente usuarios con una determinada dirección de correo (un atacante podría suplantar nuestra identidad) .

El mecanismo de identificación SMTP despues de POP se basa en que para recojer el correo desde el servidor POP hay que identificarse. Pues bien, este método guarda la dirección IP desde la que nos identificamos como usuario POP y, a continuación, si solicitamos un servicio SMTP, el servidor comprueba que el usuario proviene de la dirección IP considerada 'amistosa'.

Otro mecanismo más sólido es la identificación directa en el servidor SMTP. Para ello SASL implementa, entre otros, una serie de mecanismos de encriptación que hace más seguro el envío de claves de usuario y Passwords a traves de la red. Es aconsejable el uso de SASL frente a otros mecanismos más inseguros.

Este documento trata de ilustrar cómo conseguir esa funcionalidad en un servidor Postfix.

Cuando la identificación SASL de un cliente tiene éxito, podemos utilizar los archivos de configuración de postfix para darle los privilegios adecuados. Las librerías SASL invocadas por postfix tienen sus própias bases de datos de usuarios/contraseñas. Hay que crear un conjunto de usuarios/contraseñas para ser utilizadas por el servidor smtpd de postfix.

Configuración SASL.

En este apartado veremos cómo configurar la libreria cyrus-SASL para lograr la identificación SASL. Es importante destacar que la identificación SASL en postfix sirve para dar acceso al servidor SMTP, y que este acceso puede ser todo lo privilegiado que queramos dependiendo de las restricciones que añadamos a la configuración de postfix. Los usuarios/contraseñas que se definan serán para SASL y, en principio, no tienen por qué nada que ver con usuarios/contraseñas de login locales utilizados, por ejemplo para POP3.

Crear o editar el archivo /usr/lib/sasl/smtpd.conf. En la única línea de este archivo debe figurar el método en el que se almacenarán las claves:

pwcheck_method: sasldb

Ahora tendremos que crear las claves para cada usuario. Para ello hay que definir un REALM que supondremos como el nombre del dominio donde está el servidor. Téngase en cuenta que para que postfix identifique correctamente, este REALM debe ser único para todos los usuarios del servidor SMTP, independientemente de que hayan uno o más dominios virtuales alojados en el servidor. El programa utilizado para generar las claves essaslpasswd.

#) saslpasswd -c -u REALM usuario

Nos preguntará la clave y la confirmación. Se puede consultar los usuarios/realm introducidos con sasldblistusers

#) sasldblistusers
user: usuario realm: mi_dominio mech: PLAIN
user: usuario realm: mi_dominio mech: CRAM_MD5
user: usuario realm: mi_dominio mech: DIGEST_MD5
                                                                                                      

Como puede verse, cada combinación realm/usuario soporta distintos tipos de encriptación. Hay que notar aquí que los usuarios y claves no tienen por qué ser los mismos que los utilizados para recoger el correo mediante POP. Pueden (¿y deben?) ser distintos. No obstante, algunos clientes de correo ofrecen la posibilidad de utilizar los mismos usuarios/password que POP.

El archivo que contiene estas claves es /etc/sasldb . Concretamente, para la distrubución SuSE el autor no ha logrado que la identificación funcione correctamente si no se cambian manualmente los permisos de ese archivo

#) chmod 644 /etc/sasldb

lo cual es una solución que no es satisfactoria y que debe ser subsanada.

Configuración final POSTFIX.

Ahora hay que configurar Postfix para que utilice SASL. Este es un tema que puede cambiar según las necesidades y el grado de paranoia de cada Administrador. Como caso más general, supondremos que queremos dar acceso a usuarios externos identificados.

El archivo de configuración de Postfix es /etc/postfix/main.cf. Ya debemos tener una configuración por defecto que han generado los scripts de SuSE. Para ver los valores de los parametros de control generados:

#) postconf -n

Pero tendremos que editar el archivo. Incluir las siguientes definiciones:

smtpd_sasl_auth_enable = yes
 smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

Con la primera línea habilitamos postfix para utilizar SASL. Con la segunda damos el valor adecuado de REALM a las librerías SASL. La tercera es una medida de seguridad para evitar que se identifiquen como anonymous (y dejaríamos un agujero de seguridad). La última es para no bloquear algunos clientes.

MUY IMPORTANTE: la definición de 'smtpd_sasl_local_domain' debe coincidir con el REALM con que hayamos definido los usuarios/contraseñas con saslpasswd. En el ejemplo anterior, se supone que el REALM utilizado es el parámetro 'mydomain' de postfix.

Ademas, hay que introducir restriciones. Como mínimo, debe haber la siguiente lista de restricciones en main.cf (puede ocupar varias líneas pero el primer caracter de una continuación debe dejarse en blanco. Cada restricción se separa por comas o espacio.

smtpd_recipient_restrictions =
     permit_mynetworks
     permit_sasl_authenticated
     check_relay_domains

Filtrado de correo no deseado. Listas negras.

La utilización básica de las listas negras es trivial en postfix.

1) Hay que definir en main.cf las listas que quieras utilizar. Por ejemplo

maps_rbl_domains = relays.ordb.org, dnsbl.njabl.org

2) después, en las listas de restricciones, se invocan dichas listas con la restricción

reject_maps_rbl.


Un ejemplo real.

Por último, para ver la configuracion que tenemos en main.cf (quitando comentarios y otras historias) podemos hacer:

# postconf -n

Y obtendremos un listado con lo importante de main.cf. Aquí tenen un listado real de una configuración actual (no listado de dominios virtuales)

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
canonical_maps = hash:/etc/postfix/canonical
command_directory = /usr/sbin
config_directory = /etc/postfix
content_filter = vscan:
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
default_process_limit = 10
defer_transports =
disable_dns_lookups = no
header_checks = regexp:/etc/postfix/regexp_intruders
inet_interfaces = all
local_recipient_maps = $alias_maps unix:passwd.byname
mail_name = Postfix on UTUTO XS (i686)
mail_owner = postfix
mail_spool_directory = /var/mail
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
maps_rbl_domains = relays.ordb.org, dnsbl.njabl.org
masquerade_domains = ututo.org
masquerade_exceptions = root
message_size_limit = 4096000
mydestination = $myhostname, localhost.$mydomain, $mydomain
myhostname = mhoyos.ututo.org
mynetworks_style = subnet
myorigin = $mydomain
newaliases_path = /usr/sbin/sendmail
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/packages/postfix/README_FILES
relay_domains = $mydestination
relayhost =
relocated_maps = hash:/etc/postfix/relocated
sample_directory = /etc/postfix
sender_canonical_maps = hash:/etc/postfix/sender_canonical
sendmail_path = /usr/sbin/sendmail
setgid_group = maildrop
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_helo_required = yes
smtpd_recipient_restrictions = reject_non_fqdn_sender,
    reject_non_fqdn_recipient,      permit_mynetworks,
   permit_sasl_authenticated,   reject_unauth_destination,
   reject_unauth_pipelining,       reject_invalid_hostname,
   reject_non_fqdn_hostname,       reject_maps_rbl,      
   warn_if_reject    reject_unknown_client,   permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous
smtpd_sender_login_maps = hash:/etc/postfix/login_auth
strict_rfc821_envelopes = yes
transport_maps = hash:/etc/postfix/transport
virtual_maps = hash:/etc/postfix/virtual

Bibliografía

Herramientas personales