jueves, 29 de julio de 2010
 
  Inicio arrow Artículos arrow General arrow Dominios virtuales de correo en Debian/Sarge
template designed by peekmambo.com
 
Menú Principal
Inicio
Asociación
Noticias
Artículos
Planet LinuxAlbacete
Jornadas
Cursos
Galería de imágenes
Descargas
Foro
Búsqueda
Enlaces
Contacto
Privacidad
Formulario de socios





¿Recuperar clave?
¿Quiere registrarse? Regístrese aquí
Lista de correo
Para subscribirte a nuestra lista de correo, introduce tu direccion de correo y presiona en el boton Subscribirse para enviar tu solicitud.
Advertisement
Dominios virtuales de correo en Debian/Sarge PDF Imprimir E-Mail
Artículos - General
escrito por Javier Turégano Molina (SETAS)   
sábado, 01 de mayo de 2004
Traducción al español de esta útil guía de Christoph Haas sobre como instalar un sistema de correo postfix con autentificación y dominios virtuales en MySQL, webmail, filtros antivirus y antispam en nuestra Debian Sarge.
- ARTICULOS -
Titulo: Dominios virtuales de correo en Debian/Sarge
Autor: Christoph Haas
Traducido por: Javier Turégano
12-04-2002


Dominios virtuales de correo en Debian/Sarge
 
     

Prólogo del Traductor

Tras mucho tiempo buscando e intentando la manera de configurar un sistema de correo basado en Postfix con dominios virtuales en MySQL y con posibilidades de webmail, filtros antispam y antivirus un buen día topé con este documento muy completo que Christoph Haas había escrito.

Versión original en ingles: http://workaround.org/articles/ispmail-sarge/

Lo puse en práctica y funcionó a la perfección y hoy en día es el sistema de correo que estoy utilizando por lo tanto me puse en contacto con él para ofrecerle la posibilidad de traducirlo al Español con lo que estuvo completamente de acuerdo. Y tras unos pocos días de dedicarle unas horillas aquí tenemos mi primera traducción, espero que os sea útil como a mí me lo ha sido. La única diferencia en mi configuración es que yo en lugar de sqwebmail estoy utilizando squirrelmail para la interfaz de correo web, esto nos da idea de la potencia de esta configuración y las multiples combinaciones que se pueden llegar a hacer.

Si tenéis alguna duda o descubrís alguna errata en la traducción podéis poneros en contacto conmigo aquí:

javi (arroba) ideando.net

Introducción

¿Es este tutorial para ti?

Obviamente no querrás gastar horas para descubrir que el resultado no era lo que esperabass. Por lo que haré un pequeño resumen de lo que puedes conseguir siguiendo este tutorial. Imagina que administras un servidor de correo donde recibes emails de usuarios diferentes que pertenecen a dominios distintos. Por supuesto puedes añadir un usuario del sistema (en /etc/passwd) para cada usuario y administrar un gran número de alias. Este acercamiento puede parecer factible pero después de un tiempo acabaras cansado de que los usuarios te soliciten nuevos alias. Además de generar agujeros de seguridad en tu sistema debido a que cada nuevo usuario es un riesgo potencial para la seguridad.

La solución que vamos a plantear es utilizar MySQL como base de datos que contendrá toda la información sobre tus usuarios, sus contraseñas y los reenvíos de correo (forwarding). Existe incluso un Proyecto en Sourceforge que nos provee de un sistema de control mediante web basado en esta configuración en caso de que no quieras añadir los usuarios a la base de datos manualmente. Tus usuarios serán capaces de recibir correo en el servidor, obtenerlo mediante POP3 e IMAP o incluso usar un navegador web para acceder al correo. Por supuesto los usuarios pueden enviar correo también usando SMTP autenticado. Y finalmente puedes filtrar todos los virus y correo basura (spam) que lleguen al servidor. Todo esto se realiza mediante herramientas libres (GNU) por lo que no tendrás que gastar un duro.

¿Qué vamos a necesitar?

Asegurate que dispones de las siguientes herramientas antes de comenzar:

  • un taza de té de vainilla
    (o tu bebida favorita para al menos 1 o 2 horas)
  • acceso de administrador (root) en el servidor de correo
    (si tan solo dispones de acceso limitado por ejemplo mediante Webmin no vas a disfrutar con esto).
  • un administrador de sistemas con experiencia
    (si nunca has odio hablar de PAM, SMTP, MySQL o 'bash')
  • haber instalado Debian GNU/Linux (sarge) en el servidor
    (no voy a detallar como funciona Debian o como instalar paquetes)
  • un poco de paciencia

¿Y si esto falla?

He intentado no olvidarme de nada. Y algunas personas me han confirmado de que este tutorial funciona. Pero se pueden cometer un montón de fallos que te tendrán ocupado un tiempo. Hay un capítulo dedicado a la resolución de problemas más adelante que te puede ayudar a identificar la causa y como darle una solución. Otras fuentes de información son la lista de correo postfix-users o serás bienvenido en el canal de irc #postfix en freenod.net. Yo utilizo el nick de <ChrisH>. Por favor comprended que no puedo dar soporte a través de correo electrónico. Yo también tengo vida.

No te asustes. La configuración no es para los propensos a infartos pero - una vez que te hagas con él - muy potente y segura. Un usuario algo vago en la lista de usuarios de postfix preguntó por qué llevaba más de 15 minutos la instalación. Pero te aseguro que difícilmente nadie hará esta instalación mientras espera al autobús.

Los componentes

La instalación completa depende de que varios componentes software funcionen juntos perfectamente. Vamos a clarificar que hace cada uno de ellos:

  • Postfix
    Es tu MTA (Agente de transporte de correo) que recibe el correo a través de SMTP (Protocolo sencillo de transferencia de correo) y lo envía a sitios distintos en tu disco duro.
  • MySQL
    El servidor de base de datos que guarda la información para controlar el funcionamiento de postfix: usuarios, dominios, reenvío de correo y contraseñas.
  • Courier
    Courier es un servidor de correo como Postfix. Aunque yo lo utilizaré únicamente en los para realizar las tareas de POP3/IMAP que permiten acceder al usuario al buzón de correo.
  • PAM
    PAM (Módulos conectables de autentificación) nos ofrecen un mecanismo de autentificación para los usuarios. Se utiliza para comprobar el nombre de usuario y contraseña almacenados en la base de datos.
  • SASL (la librería Cyrus)
    Si tus usuarios están conectados a través de otro ISP (Proveedor de servicios de Internet) mientras están fuera obtendrán una dirección IP externa a tu red. Sin embargo el servidor de correo sólo confía en direcciones IP locales. SASL (Capa sencilla de Autentificación y Seguridad) añade autentificación a SMTP y permite que tu servidor confié en ellas.
  • AMaViS
    Un scaner de virus que funciona de forma completamente independiente a Postfix. Escanea los mensajes entrantes en busca de patrones de correo basura (utilizando el famoso spamassasin) o virus.
  • phpmyadmin
    Una interfaz web para manejas tus bases de datos MySQL. Es bastante más cómodo que utilizar la línea de comandos de MySQL.

La dirección de coreo es el nombre de usuario

El objetivo es tener la menor cantidad de información posible sobre un usuario virtual. Los usuarios son "tontos" (¿quién lo va a durar?) y no pueden recordar demasiada información. En ese caso lo mejor es que el nombre de usuario sea el mismo que su dirección de correo.

The big picture

Instalando los paquetes de Debian

Como de costumbre el software que necesitas ya ha sido empaquetado para Debian. Por lo tanto todo lo que debemos hacer es 'apt-get install' estos paquetes:

  • postfix (el servidor de correo)
  • postfix-mysql (permite a Postfix realizar búsquedas en MySQL)
  • postfix-tls (la libreria de courier para autentificación SMTP)
  • courier-authdaemon (quizás no es necesario ya que sólo necesitamos authdaemond.mysql)
  • courier-authmysql
  • courier-base
  • courier-maildrop (el agente encargado del envio en courier - dependencia de sqwebmail)
  • courier-pop (para acceso POP3 sin encriptación)
  • courier-pop-ssl (para acceso POP3 con encriptación SSL)
  • courier-imap (para acceso IMAP sin encriptación)
  • courier-imap-ssl (para acceso IMAP con encriptación SSL)
  • mysql-client
  • mysql-server
  • mysql-common
  • libsasl2 (la libreria Courier SASL)
  • libsasl2-modules
  • libpam-mysql (para manejar peticiones MySQL en PAM)
  • sasl2-bin (contiene saslauthdaemon)
  • phpmyadmin (opcional - pero recomendable para la administración de la base de datos)
  • amavisd-new, zoo, lha, unarj, unzip (opcional, instalalo si quieres funciones antivirus)
  • clamav (opcional - si quieres utilizar este antivirus libre)
  • clamav-base
  • clamav-daemon (opcional - acelera el escaneo de virus)
  • clamav-freshclam (opcional - para mantenerse al día de nuevos virus)
  • sqwebmail (opcional: si deseas ofrecer correo-web)
  • libapache-mod-auth-mysql (opcional: si vas a utilizar mi interfaz web para la administración de usuarios)

Rellenando la base de datos MySQL

Creando la base de datos

El primer paso será crear la base de datos que almacena toda la información Por favor primero descarga este volcado SQL y lanzaselo a MySQL para crear toda la estructura de la base de datos automáticamente. Navega por tu nueva base de datos con phpmyadmin para ver como han sido creadas las tablas. Ahora vamos a describir el propósito de cada tabla:

La tabla de alias

Esta tabla describe los alias locales. Utilizala para reenviar to el correo del administrador (root) a otro usuario (virtual). Ten en cuenta de que esto es solo para reenvíos locales - no puedes realizar alias para reenvíos virtuales. Visita la página de manual de los alias (man 5 aliases) para aprender algo más.

columna contenido
id Un índice numérico único
alias Parte local de la dirección de correo (sin el dominio)
destination Donde enviar el correo para el usuario local de más arriba.

La tabla relocated

Esta tabla se utiliza cuando un usuario se ha cambiado a otra dirección de correo y queremos indicar al remitente "El usuario ya no está con nosotros - por favor dirige tus correos a Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla " y rechazar el correo. El MTA del remitente inmediatamente tendrá conocimiento de la nueva dirección de correo. Visita la página de manual de relocated (man 5 relocated) para aprender algo más.

columna contenido
id Un índice numérico único
email Un nombre de usuario (usuario@), un nombre de dominio (@dominio.tld) o una dirección de correo completa ( Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla )
destination La nueva dirección de correo del usuario.

La tabla transport

Postfix consultará la tabla transport para comprobar que quieres hacer con el correo para este dominio. Puedes utilizar esta característica para reenviar correos de cierto dominio a otro servidor SMTP. No necesitas poner tu dominios virtuales o locales aquí. Esta tabla está normalmente vacía. Quieres saber algo más? Pues lee la página de manual de transport (man 5 transport).

columna contenido
id Un índice numérico único
domain Un nombre de usuario (usuario@), un nombre de dominio (@dominio.tld) o una dirección de correo completa ( Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla )
destination La nueva dirección de correo del usuario.

La tabla virtual

¿Todavía despierto? OK, vamos a por otra tabla interesante. La tabla virtual es el sitio principal donde almacenaremos información sobre la redirección virtual del correo. Imagina que tienes un usuario que quiere que direcciones de correo diferentes sean reenviadas a una única dirección. Por ejemplo: todo el correo de Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla , Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla and Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla debe ser enviado a Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla Entonces esta tabla debe contener 3 filas, una para cada dirección apuntando a Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla Para más información: man 5 virtual.

columna contenido
id Un índice numérico único
email Un nombre de usuario (usuario@), un nombre de dominio (@dominio.tld) o una dirección de correo completa ( Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla )
destination La nueva dirección de correo del usuario.

La tabla user

Otra tabla muy importante. Prometí que no tendrías que utilizar una cuenta del sistema para cada usuario de correo que tenga una contraseña. Esta tabla contendrá todos los datos que normalmente encontramos en /etc/passwd. Veamos.

columna contenido
id A unique index number
email La dirección de correo completa ( Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ) del usuario virtual. Este campo se utiliza también como nombre de entrada (login).
password La contraseña de acceso (pop3, imap, smtp-auth o webmail) de este usuario. Se almacena encriptada (MD5) como en /etc/passwd. La función de MySQL encrypt() también produce este formato.
uid ID de usuario. A pesar de que puedes asignar a cada usuario un UID diferente (si deseas poner cuotas individuales ) recomiendo asignar el mismo UID a todos los usuarios. El UID por defecto es 1008 si utilizaste el volcado SQL anterior.
gid El ID de grupo de este usuario. Lo mismo que el UID. Es también por defecto 1008.
homedir Cada usuario necesita disponer de un directorio home - incluso los usuarios virtuales. Este directorio por defecto es /home/vmail (vmail=virtual mail). Eres libre de poner este directorio donde quieras y no te preocupes porque todos los usuarios tengan el mismo directorio home. Los correos son recibidos en subdirectorios de /home/vmail. Mira la siguiente fila.
maildir El maildir es el lugar en el homedir (fila anterior) donde vamos a guardar los correos del usuario. Yo prefiero almacenarlos en un directorio con el mismo nombre que la dirección de correo. Ejemplo: " Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla /". ¿Te has fijado en la barra final? Esta indica al sistema de entrega que utilice el formato maildir (subdirectorios tmp, new y cur) Si omites la barra final los correos se entregaran en formato mbox (fichero único) Asumiremos que vas a utilizar el formato maildir ya que courier (necesario para el POP3, IMAP y la interfaz web) utiliza este formato.
quota Se desea definir restricciones mediante cuotas de manera que los usuarios no saturen el disco. Desafortunadamente nadie me ha indicado como forzar el uso de quotas para usuarios virtuales :( Por lo tanto esta fila no se utiliza aún.

Creando la cuenta del sistema

Primero debemos añadir una cuenta de usuario al sistema:

groupadd -g 1008 vmail[ENTER]
useradd -g vmail -u 1008 vmail

También hemos aprendido que todos los usuarios virtuales comparten un directorio home. Por supuesto debes de crearlo y darle los permisos correctos:

mkdir /home/vmail[ENTER]
chown vmail:vmail /home/vmail

Configurar Postfix para que use MySQL

Normalmente Postfix utiliza los ficheros de /etc/postfix (aliases, relocated, virtual, transport, ...) para saber como manejar los correos. Por lo tanto el paso siguiente es hacer que Postfix utilice la base de datos MySQL.

Atrapado en una jaula

Postfix dispone de una buena característica de seguridad: puede funcionar en una jaula chroot. "chroot'ed" significa que el directorio "/var/spool/postfix" pretende actuar como si fuera "/" - por lo que Postfix no puede salir de este subdirectorio seguro. Cualquiera que encuentre un fallo de seguridad que afecte a Postfix sólo podrá dañar lo contenido en este subdirectorio y no acceder al sistema completo. Esto sin embargo puede volver loco a los administradores de sistemas si Postfix necesita comunicarse con el (inaccesible) mundo exterior (sistema de ficheros). ( Todo esto es aplicable sólo si ejecutas la base de datos en el mismo sistema que tu servidor de correo - en caso contrario simplemente salta esta sección).

El directorio chroot utilizado por postfix es /var/spool/postfix - por lo que sólo puede acceder a fichero que estén por debajo de este directorio. Obviamente el socket de MySQL (normalmente situado en /var/run/mysqld/...) no está disponible por lo que debemos encontrar otro modo. Otros tutoriales sugieren que desactives la opción de chroot. Pero existen otros modos mejor que abrir agujeros en tu sistema.

Puedes configurar MySQL para que cree su socket en /var/spool/postfix. Esto significa que debes añadir las líneas siguiente a la sección inicial de los script de arranque de MySQL en /etc/init.d/mysql:

mkdir -p /var/spool/postfix/var/run/mysqld[ENTER]
chown mysql /var/spool/postfix/var/run/mysqld[ENTER]
ln /var/run/mysqld/mysqld.sock /var/spool/postfix/var/run/mysqld/mysqld.sock[ENTER]

O configuras Postfix para comunicarse mediante TCP/IP con la base de datos. Si configuras tu servidor de base de datos como 'localhost' Postfix siempre intentará utilizar el socket de UNIX del sistema de ficheros. Pero si utilizas el nombre real (el nombre de host asignado a la interfaz ethernet) Postfix utilizará la comunicación mediante red para acceder a la base de datos. Si este es el método que has elegido no olvides borrar la línea "skip-networking" de /etc/mysql/my.cnf para activar la escucha UDP. Asegurate de que utilizas un cortafuegos o limita el acceso a la base de datos a tu servidor local o habrás abierto otro agujero de seguridad.

Advertir a Postfix que use MySQL

Tu /etc/postfix/main.cf es el fichero principal de configuración. Por favor comprueba que tu configuración es similar a esta. Las palabras entre paréntesis significan que debes adaptarlas a tu sistema.

# Mi nombre de host local
myhostname = mailgateway

# Mi nombre de dominio
mydomain = domain.tld

# Para que hosts/dominios recibimos correo local
# No listes aquí los dominios virtuales
mydestination = $myhostname $mydomain localhost localhost.$mydomain

# Definimos la redes en las que confiamos. Postfix permite reenvio para
# los clientes pertenecientes a estas redes
mynetworks = 127.0.0.0/8, 131.59.12.0/24

# Para que direcciones destino aceptamos correo
# (permit_mynetworks: permit all mail from $mynetworks)
# (permit_sasl_authenticates: trust SMTP-AUTH users)
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# Donde están los buzones de correos situados en el disco
virtual_mailbox_base = /home/vmail

# Donde están los buzones de correo dentro del directorio anterior.
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf

# ¿Qué dominios virtuales hay?
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf

# ¿Que direcciones de correo virtual son reenviadas y donde?
virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf

# ¿Qué usuario/grupo es utilizado para escribir los buzones en el disco?
virtual_uid_maps = static:1008
virtual_gid_maps = static:1008

# SMTP AUTH (SASL)
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
# Be nice to brokenware like Outlook Express:
broken_sasl_auth_clients = yes

# Enviar el correo a través de Amavis (comentalo si no quieres usar amavis)
content_filter = smtp-amavis:[127.0.0.01]:10024

Todos estas definiciones virtuales son temibles, poco documentadas y confusas. Con la introducción de Postfix 2.x el sistema virtual ha cambiando bastante. Intentaré dar algo de luz al asunto. Postfix 1.x utilizaba los llamandos "dominios virtuales postfix". Tenías una entrada "virtualdomain.tld anything" para indicar a Postfix que querías recibir correo para este dominio. Esto está en deshuso.

Postfix 2.x utiliza ahora las directivas de virtual_mailbox_domains para indicar a que dominios virtuales permitimos la recepción de correo. El parametro virtual_mailbox_maps indica a Postfix donde encontrar el buzón de correo para los usuarios virtuales.

Hay otras dos directivas relacionadas con los alias (reenvio). virtual_alias_maps define donde reenviar el correo para los usuarios virtuales. Puedes reenviar todos los correo de Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla a Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla y recibir el correo para las dos cuentas en la de info@. finalmente el parametro virtual_alias_domains es... bueno, debo admitir que no sé para qué se utiliza realmente.

Configurar Postfix para que acceda a la información

Habrás notado que se han usado directivas como ''virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf" en main.cf. Esto indica a Postfix que utilice un método MySQL para obtener la información necesaria y que 'mysql-virtual_mailbox_maps.cf' es un fichero donde vamos a definir donde esta situado los datos en la base de datos. Simplemente copia y pega la sección siguiente en los ficheros correspondientes en /etc/postfix/:

mysql-virtual_mailbox_maps.cf

user = [database user]
password = [database password]
dbname = provider
table = users
select_field = maildir
where_field = email
hosts = [database server]

mysql-virtual_mailbox_domains.cf

user = [database user]
password = [database password]
dbname = provider
table = domains
select_field = domain
where_field = domain
hosts = [database server]

mysql-virtual_alias_maps.cf

user = [database user]
password = [database password]
dbname = provider
table = virtual
select_field = destination
where_field = email
hosts = [database server]

En teoría puedes utilizar las tablas MySQL para opciones raramente utilizadas como 'relocated' o 'transport' pero podría ser igualmente correcto seguir utilizando los ficheros en /etc/postfix para ello.

Un dato importante referente a seguridad: asegurate de que estos ficheros son sólo accesibles por el administrador (root). En caso contrario cualquier usuario puede leer la password de la base de datos desde una cuenta local. Con:

chmod o= /etc/postfix/mysql-*.cf

debería bastar.

SMTP autentificado - el santo grial

Porqué necesitamos SMTP autenticado?

Imagina que tus usuarios reciben su correo utilizando POP3. Ahora necesitan un modo de enviar sus correos a través de tu servidor de correo. Por razones de seguridad Postfix solo permite a los usuarios en la red local (=$mynetwork) enviar correo. Estos significa que sus clientes de correos envían un usuario y una contraseña al servidor de correo para que les autorice. La mayoría de los clientes de correo disponen de esta característica. Obviamente necesitamos esta medida si no queremos que los spammers aprovechen el reenvío abierto (open relay).

Por donde ir

Existen varias maneras de ofrecer autentificación junto al SMTP. La forma que vamos a describir puede parecer totalmente inadecuada pero parece ser la forma más común de hacerlo. Por lo que le daremos una oportunidad. Cuando un guerrero de la carretera (un usuario que está fuera de nuestra red local) envía un correo se pone en contacto con el servidor de correo Postfix. Entonces Postfix pregunta 'saslauthdaemon' (un componente del servidor de correo courier). Salsauthdaemon hace uso de PAM y finalmente PAM consulta la base de datos MySQL para comprobar el usuario y la contraseña. ¿Extraño, eh? Pero funciona al fin y al cabo. (Me dijeron que existe un parte que permite a Postfix consultar la base de datos directamente pero decidí usar sólo los paquetes Debian.

Configuramos Postfix para que use SASL

Ya hicimos la mayor parte añadiendo smtpd_sasl_auth_enable=yes a /etc/postfix/main.cf. No hay que hacer nada más.

Configuramos SASL para que use saslauthd

Crea el directorio /etc/postfix/sasl. Ahora crea un fichero smtpd.conf ahí y añade estas dos líneas dentro:

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Hay diferente maneras de comprobar la contraseña. Tu simplemente indicas a SASL que utilice el demonio de autentificación (saslauthd).

Configuramos saslauthd para que use PAM

Edita el fichero /etc/default/saslauthd y descomenta las siguientes líneas:

START=yes
MECHANISMS="pam"

Un fallo estúpido (#201826) en el paquete sals2-bin impide a Postfix acceder al directorio /var/run/saslauthd si el usuario 'postfix' no es miembro del grupo 'sasl'. Ejecuta la siguiente línea para arreglarlo:

adduser postfix sasl

Otro tema importante a tener en cuenta: el fichero mux (una tubería para comunicarnos con otros procesos) está fuera de la jaula chroot de Postfix por defecto. Simplemente añade la línea siguiente a la cabecera de /etc/init.d/saslauthd para introducirla en la jaula.

PARAMS="-m /var/spool/postfix/var/run/saslauthd"

Reinicia el demonio y asegurate de que no hay procesos antiguos corriendo (ps ax | grep saslauthd debe mostrar sólo procesos con la opción '-m...').

Configuramos PAM para que use MySQL

El paso final es indicar a PAM que utilice la base de datos MySQL. Edita el fichero /etc/pam.d/smtp y hazlo parecido a este:

auth required pam_mysql.so user=[database user] passwd=[database password] host=[database server] db=provider table=users usercolumn=email passwdcolumn=password crypt=1[ENTER]
account sufficient pam_mysql.so user=[database user] passwd=[database password] host=[database server] db=provider table=users usercolumn=email passwdcolumn=password crypt=1[ENTER]

Recibiendo correos usando POP3 o IMAP

El paso final es indicarle al demonio de Courier POP3 que use MySQL para acceder al nombre de usuario y contraseña para la autentificación. Primero editamos el fichero /etc/courier/authdaemonrc y cambiamos la directiva authmodulelist a "authmysql" así:

authmodulelist="authmysql"

Ahora necesitas definir los campos de la tabla de MySQL en /etc/courier/authmysqlrc como aquí:

MYSQL_SERVER [database server hostname][ENTER]
MYSQL_USERNAME [database admin user][ENTER]
MYSQL_PASSWORD [database admin password][ENTER]
MYSQL_PORT 0[ENTER]
MYSQL_DATABASE provider[ENTER]
MYSQL_USER_TABLE users[ENTER]
MYSQL_CRYPT_PWFIELD password[ENTER]
MYSQL_UID_FIELD uid[ENTER]
MYSQL_GID_FIELD gid[ENTER]
MYSQL_LOGIN_FIELD email[ENTER]
MYSQL_HOME_FIELD homedir[ENTER]
MYSQL_MAILDIR_FIELD maildir

No olvides reiniciar el proceso de authdaemon usando "/etc/init.d/courier-authdaemon restart". Si prefieres usar IMAP debes instalar "courier-imap" y/o "courier-imap-ssl" para disponer de servicios IMAP.

Rellenando la base de datos

Por supuesto nuestra configuración necesita alguna información de control para conocer a los usuarios y los dominios.

Para cada nuevo dominio (virtual)

  • Añade el dominio a la tabla 'domain' . (Contrariamente a lo que escribí en mi tutorial para Woody el dominio no se debe meter en las tablas 'transport' o 'virtual'.

Para cada nuevo usuario de POP3

  • Añade una entrada a la tabla 'virtual' con la dirección de correo tanto en el campo email como en el de destino (destination).
  • Añade una entrada a la tabla 'users' y pon los campos como se indica a continuación:
    • email = dirección de correo completa del usuario (también sirve como nombre de usuario).
    • password = contraseña encriptada tanto para recibir correo mediante POP3 como para enviarlo mediante Auth-SMTP
    • uid = dejalo por defecto (por ej. el UID de la cuenta "vmail" )
    • gid =dejalo por defecto (por ej. el GID de la cuenta "vmail" )
    • homedir = deja lo por defecto (por ej. /home/vmail si este es tu directorio de correo)
    • maildir = dirección de correo completa con la barra al final (por ej. " Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla /")
  • Consejo: No es necesario crear el directorio del buzón de correo. Una vez que se recibe un correo el directorio se creará automáticamente. Yo te recomiendo enviar un "correo de bienvenida" a los usuarios para crear el directorio del buzón de correo y evitar error cuando alguien intente descargar el correo mediante POP3 de un buzón inexistente.

Para cada usuario "cogelo todo" POP3

  • Haz lo mismo que indicamos arriba pero añade una dirección de correo del tipo "@dominio.tld" y todos los correos con destinos no especificados explícitamente para ningún usuario " Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla " serán reenviados aquí.
  • Consejo: Esto hará que recibas más correo spam en esta cuenta, ya que los spammers suelen intentar adivinar cuentas de correo y enviar a direcciones como " Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla " a pesar de que estas nunca hayan existido.

Para cada nuevo correo reenviado (email forwarding)

  • Añade una entrada en la tabla 'virtual' con la dirección de correo en el campo email e indica el correo al que quieres que se haga el reenvío en el campo de destino (destination).

Para cada reenvio de correo "catch all" (Cogelo todo)

  • Añade una entrada a la tabla "virtual' con la dirección de correo "@dominio.tld" y todos los correos con direcciones no especificadas serán reenviadas a esta cuenta.
  • Consejo: Esto hará que recibas más correo spam en esta cuenta, ya que los spammers suelen intentar adivinar cuentas de correo y enviar a direcciones como " Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla " a pesar de que estas nunca hayan existido.

Para cada nuevo usuario local

  • Nada. Tan pronto como añadas un usuario a /etc/passwd el/ella podrá inmediatamente recibir correo. (Ten en cuenta que "local" significa el dominio definido en $mydestination. No puedes añadir usuarios virtuales de este modo.)

Filtrando los virus y el spam

Filtrar y eliminar los virus del correo entrante es ha convertido en algo sencillo. Incluso una gran cantidad de spam puede quedar eliminado con poco esfuerzo.

Configurando postfix para que use amavis

Asegura te que tienes instalado el paquete 'amavisd-new'. No te confunda - amavis no es un scanner de virus! Es una herramienta de ayuda que recibe el correo, lo procesa (lo chequea en busca de virus y spam) y lo devuelve al servidor de correo. Necesita de un scanner de virus para la línea de comandos.

Primero debemos indicarle a Postfix que utilice amavis como filtro de contenidos. Añade esta línea a /etc/postfix/main.cf:

content_filter = smtp-amavis:[127.0.0.1]:10024

Esto hará a Postfix enviar todo el correo recibido al puerto 10024 en localhost. Aparentemete amavis estará escuchando en este puerto y recibirá los correos via SMTP.

Ahora edita /etc/postfix/master.cf y añade el servicio adecuado:

smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=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

Después de que amavis haya procesado el correo lo inyectará de nuevo a postfix en el puerto 10025. Ten en cuenta que las variables de postfix están en blanco - el más importante de todos es el content_filter (porque sino el correo daría vueltas a través de amavis una vez y otra).

Configura AMaViS

Ahora debemos configurar amavis. Editamos /etc/amavis/amavisd.conf y descomentamos las directivas de paso apropiadas (busca @bypass_virus_checks_acl y @bypass_spam_checks_acl). Si quieres activar las opciones de escaneo de virus deberás configuras también tu escaner para virus de línea de comando (busca @av_scanners). Os recomiendo instalar ClamAV porque es libre (GPL) y está soportado por amavis. Para comprobar si tu escaner de virus está funcionando correctamente puedes descargar de eicar.com una firma de prueba de virus y añadirla a un correo electrónico.

AMaViS puede hacer mucho más y es muy configurable. Os recomiendo recorrer el fichero de configuración y ver que queréis hacer.

¿Y qué pasa con el correoweb (webmail)?

Ahora que ya sabemos como pueden los usuarios obtener y enviar sus correos a través de POP3, IMAP y SMTP os preguntaréis si hay alguna forma para dar acceso a los usuarios a su buzón de correo a través de una interfaz web. El paquete que necesitas se llama "sqwebmail" - un sistema de correo web que utiliza los servicios de Courier y que podemos configurar para usar el sistema de autentficación (via PAM). Instalalo utilizando "apt-get install sqwebmail".

Para que sqwebmail utilice tu base de datos MySQL necesitas cambiar el fichero /etc/pam.d/webmail así:

auth required pam_mysql.so user=[database user] passwd=[database password] host=[database host] \
db=provider table=users usercolumn=email passwdcolumn=password crypt=1[ENTER]
account sufficient pam_permit.so

Hay un pequeño fallo en el paquete de sqwebmail. Parece que debes activar el bit suid de root al binario del webmail. Utiliza este comando para hacerlo:

chmod u+s /usr/lib/courier/courier/webmail/webmail

También necesitas hacer visible el CGI del correoweb, los iconos y la hoja de estilos a tus usuarios de web. Suponiendo que utilizas el servidor web Apache sólo tenemos que poner estas líneas en /etc/apache/httpd.conf y está hecho:

Alias /sqwebmail /usr/share/sqwebmail[ENTER]
ScriptAlias /webmail /usr/lib/courier/courier/webmail

Ahora accede a tu servidor web mediante http://<hostname>/webmail/webmail y obtendrás una pantalla de entrada.

¿Cómo funciona el proceso de envio?

El proceso de envio de correo no está bien documentado. Pero leyendo unos cuantos kilobytes de la salida de depuración he descubierto que pasos sigue Postfix para enviar un correo.

Acción SQL Query Resultado
¿Quién es el destinatario del correo? select destination from virtual where email=' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' O 'username' (si se trata de un correo local) o ' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' (si el correo es enviado a otra dirección).
¿Se ha marchado el correo a otro servidor? select destination from relocated where email=' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' O no hay nada (que significa que no hay relocalización) o la nueva dirección de correo del usuario en otro servidor.
¿Qué transporte debemos utilizar para este dominio? select destination from transport where domain = 'domain.tld' Aquí se define el modo de transporte. 'virtual:' significa que se van a utilizar dominios virtuales. Postfix envia el correo localmente si no hay ninguna entrada aquí.
¿Se he definido un reenvio para este usuario? select destination from relocated where email = 'user' O no hay nada (que significa que no hay relocalización) o la nueva dirección de correo del usuario en otro servidor.
¿Se he definido un reenvio para este dominio? select destination from relocated where email = '@domain.tld' O no hay nada (que significa que no hay relocalización) o la nueva dirección de correo donde deben enviarse todos los correos para este dominio en el nuevo servidor.

¿Dónde debe ser enviado el correo?
select maildir from users where email=' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' and postfix='y'
La ubicación en el sistema de ficheros donde debe ser enviado el correo. El resultado se añade a lo indicado en homedir. Si el resultado tiene una barra final entonces el correo se guarda en formato maildir. Si no la tiene entonces este el fichero donde se debe añadir el correo en formato mailbox.
¿Quién debe ser el dueño de este fichero? select uid from users where email = ' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' and postfix = 'y' Un UID numérico. Este debe ser por defecto el identificador de usuario de "vmail".
¿A qué grupo de be pertenecer este fichero? select gid from users where email = ' Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla ' and postfix = 'y'

Un GID numérico. Este debe ser por defecto el identificador de grupo de "vmail".

 

La interfaz web

Ahora que toda la información está almacenada en la base de datos podemos cambiarla de la forma que queramos. He escrito una pequeña interfaz basada en CGI que permite manejar fácilmente dominios, usuarios e incluso cuentas POP3/IMAP. Sientete libre de utlizarlo.

Para hacerlo funcionar necesitas estos tres ficheros:

Fichero Descripción
ispmailadmin El CGI principal. Copialo dentro de tu directorio CGI y accede desde un navegador web (ej. http://myserver/cgi-bin/ispmailadmin). Asegurate de que este fichero es ejecutable para tu servidor web. Por favor comprueba si la configuración que he definido en las primeras líneas del script en Perl se adapta a tus necesidades.
sqlutil.pm Esta es una clase con utilidades de MySQL para Perl que utilizo para la mayoría de mis aplicaciones de bases de datos. Ponla en el mismo directorio que 'ispmailadmin'. Tendrás que modificar las líneas del comienzo para indicar tu nombre de host, de usuario y la contraseña para acceder al servidor MySQL o no funcionará. Asegurate de que el fichero no es legible por otros por motivos de seguridad.
style.css Una CSS (hoja de estilos en cascada) que mejorará la apariencia de la GUI. No es necesaria pero deberías copiarla en la raíz de documentos (DocumentRoot) del servidor web (o modificar la línea correspondiente en 'ispmailadmin' e indica otro lugar.

Por favor ten en cuenta que el CGI está hecho para residir en un directorio autentificado. Si olvidas esto obtendrás un mensaje de error: "Nobody logged on". Asegurate que has instalado el paquete 'libapache-mod-auth-mysql'. Para hacer que tu servidor web nos pregunte por un usuario y una contraseña antes de acceder al GUI puedes añadir estas directivas a tu httpd.conf:

Auth_MySQL_Info databaseserver databaseuser databasepassword[ENTER]

<Location /cgi-bin/ispmailadmin>[ENTER]
AuthType Basic[ENTER]
AuthName Customer login[ENTER]
Auth_MySQL_DB provider[ENTER]
Auth_MySQL_Password_Table customers[ENTER]
Auth_MySQL_Username_Field customer[ENTER]
Auth_MySQL_Password_Field password[ENTER]
Auth_MySQL_Empty_Passwords off[ENTER]
#Auth_MySQL_Scrambled_Passwords on[ENTER]
Auth_MySQL_Encryption_Types Crypt_DES[ENTER]
require valid-user[ENTER]
</Location>

Se asume que estas utilizando una tabla 'customers':

CREATE TABLE customers (
customer varchar(8) NOT NULL default '',
realname varchar(30) NOT NULL default '',
password tinytext NOT NULL,
PRIMARY KEY (customer)
) TYPE=MyISAM


En esta tabla los campos customer y password son equivalentes a los campos de usuario y contraseña que tus clientes necesitan para entrar. Las contraseñas deben estar cifradas usando la función ENCRYPT(). El realname es el nombre completo del cliente que sólo vamos a utilizar para mostrarlo.

Para asegurarnos de que un cliente sólo cambie sus alias de correo para su propio dominio(s) debemos crear la tabla 'domains':

CREATE TABLE domains (
customer varchar(8) NOT NULL default '',
domain varchar(60) NOT NULL default ''
) TYPE=MyISAM

El campo customer contiene el mismo nombre que el campo en la tabla 'customers'. El campo domain contiene el nombre del dominio al que el cliente tiene acceso. Por supuesto puede haber varias entradas si un clientes tiene más de un dominio.

Existe un proyecto en SourceForge llamado phpmywebhosting que utiliza una configuración muy cercana a la de este tutorial. No es mala idea darle un vistazo.

Preguntas frecuentes (FAQ) y resolución de problemas

He configurado mi servidor de correo siguiendo tu tutorial para Woody. ¿Qué necesito para pasarme a Sarge?

Siento no disponer de una guía de transición. Muchas cosas han cambiado. Por favor recorre todos los pasos y comprueba tu configuración. Al menos no tendrás que cambiar el formato de la base de datos. Simplemente añade la tabla.

¿Por qué no utilizas directamente MySQL desde saslauthd durante la autentificación SMTP?

Os preguntaréis porqué he introducido el paso extra de utilizar PAM para la autentificación SASL. Lamentablemente esto es necesario si quieres utilizar contraseñas encriptadas. Utilizar saslauthd.mysql directamente significa utilizar contraseñas en texto plano (que no me gustan).

¿Qué hago para que las credenciales para SMTP autentificado se transfieran encriptadas?

Todavía no lo he conseguido configurar. Si encuentras una solución, por favor indicame como lo hiciste.

Se obtiene "warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: Permission denied"

Olvidaste editar /etc/postfix/sasl/smtpd.conf.

¿Cómo aparece una sesión SMTP AUTH/SASL en los logs?

Contraseña incorrecta:

Dec 20 12:22:17 mx1 postfix/smtpd[12084]: connect from simon.workaround.org[212.12.58.136]
Dec 20 12:22:18 mx1 postfix/smtpd[12084]: warning: SASL authentication failure: Password verification failed
Dec 20 12:22:18 mx1 postfix/smtpd[12084]: warning: simon.workaround.org[212.12.58.136]: SASL PLAIN authentication failed

Contraseña correcta:

Dec 20 12:22:32 mx1 postfix/smtpd[12084]: A6B00624A2: client=simon.workaround.org[212.12.58.136], sasl_method=PLAIN, sasl_username= Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla

¿Cómo aparece una sesión POP3/IMAP en los logs?

Contraseña incorrecta:

Dec 20 12:25:15 mx1 courierpop3login: LOGIN FAILED, ip=[::ffff:212.12.58.136]

Contraseña correcta:

Dec 20 12:24:18 mx1 courierpop3login: Connection, ip=[::ffff:213.39.145.214]
Dec 20 12:24:18 mx1 courierpop3login: LOGIN, user= Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla , ip=[::ffff:213.39.145.214]
Dec 20 12:24:18 mx1 courierpop3login: LOGOUT, user= Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla , ip=[::ffff:213.39.145.214], top=0, retr=0

¿Puedo comprobar que consultas son enviadas a MySQL?

Por supuesto. Edita el fichero /etc/mysql/my.cnf, ve a la sección [mysqld] y añade esta línea"log = /var/log/mysql.log". Reiniciar el demonio de MySQL y obtendrás todas las consultas referenciadas en /var/log/mysql.log.

Obtenemos: "warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'"

Postfix está encerrado en una jaula chroot e intenta conectarse al servidor MySQL a través del socket en /var/run/mysqld/mysqld.sock que no está dentro de la jaula. Ve a la sección "atrapado en una jaula".

Todos los correos son entregados en /var/mail/...

Comprueba que has añadido una barra final '/' a la ruta de los buzones de correo. Además no debes listar tus dominios virtuales en la variable $mydestination (que define los dominios locales). ¡Los dominios locales tienen preferencia frente a los virtuales!

¿Y si quiero que mi dominio local se maneje de esta manera? (Solo disponemos de un dominio.)

Simplemente borra tu dominio local de $mydestination eb /etc/postfix/main.cf e introducelo en la tabla domains.

Obtenemos: "fatal: main.cf configuration error: virtual_mailbox_limit is smaller than message_size_limit"

Pon virtual_mailbox_limit al menos tan grande como message_size_limit. Ejemplo:

mailbox_size_limit = 15728640
message_size_limit = 10240000
virtual_mailbox_limit = 15728640

¿Puedo poner un enlace a esta página web?

Por supuesto. Espero que la gente encuentre este tutorial antes de empezar a tirarse de los pelos.

Enlaces

Otros tutoriales similares se pueden encontrar en:

Por hacer

Si has logrado alguna de las siguientes tareas pendientes por favor Esta dirección de correo electrónico está protegida contra los robots de spam, necesita tener Javascript activado para poder verla para que pueda incluirlo en el tutorial:

  • Forzar el uso de cuotas durante el envió
  • Transmitir as credenciales cifradas cuando utilizamos SMTP autenticado.

Contribuciones y correcciones de valor por:

  • Alexander Stielau
  • Tim Weippert
  • Christian Garling
  • Christof Gruber
  • Daniel Hackenberg
  • Christian Kurz
  • Mario Duve
  • Andreas Winkelmann
  • Stefan Windt
  • Jeff Wilges
  • Eicke Kemm

 

 
 

 

» No Comments
There are no comments up to now.
» Post Comment
Email (will not be published)
Name
Title
Comment
 remaining characters
Captcha Image Regenerate code when it's unreadable
Modificado el ( domingo, 15 de enero de 2006 )
 
< Anterior
Calendario de actividades
Junio 2010 Julio 2010 Agosto 2010
Lu Ma Mi Ju Vi Do
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

© 2010 linuxalbacete.org
Joomla! is Free Software released under the GNU/GPL License.

Get The Best Free Mambo Templates at www.peekmambo.com