Introducción
El servicio de e-mail es tan viejo como la propia Internet, ha sufrido algunos cambios a lo largo del tiempo pero la arquitectura básica se mantiene. Sin embargo, el cambio ha venido en los propios usuarios del correo electrónico, ya que, en sus inicios, la Internet no necesitaba los requerimientos de seguridad que hoy en día son necesarios. Esta es la clave por la cual poco a poco los servidores de correo que se basan en Sendmail están siendo migrados a otros MTAs como qmail o Postfix. El viejo Sendmail no parece ser capaz de superar sus problemas de seguridad, ya que fue diseñado para una red no tan “peligrosa” como la existente en la actualidad, a pesar de haberse sometido a repetidos procesos de reingeniería últimamente.
Actualmente, qmail (siempre escrito con
minúsculas) es el segundo MTA más usado en el mundo. Junto
con Postfix, lucha en las plataformas Unix para desbancar el liderazgo
de Sendmail. El hecho de
implementar una solución de correo con un MTA u otro, siempre
depende de las necesidades de cada uno o incluso de sus preferencias
personales. Pero eso no debería evitar reconocer a qmail como el MTA más
rápido, estable y seguro de los que actualmente se encuentran
disponibles. Dave Sill, en su
libro “The qmail Handbook”,
realiza una comparación de los cinco principales MTAs disponibles
para plataformas Unix o similares:
|
MTA |
Madurez |
Seguridad |
Características |
Desempeño |
Modularidad |
|---|---|---|---|---|---|
|
qmail |
Media |
Alta |
Alta |
Alta |
Sí |
|
Postfix |
Media |
Alta |
Media |
Alta |
Sí |
|
Sendmail |
Alta |
Baja |
Alta |
Baja |
No |
|
Exim |
Media |
Baja |
Alta |
Media |
No |
|
Courier |
Baja |
Media |
Alta |
Media |
Sí |
Dicho todo esto, parece que qmail nos ofrece una apetecible plataforma para crear un sistema de correo bastante óptimo. Su autor Dan Bernstein, está tan seguro de la seguridad del mismo, que ofrece una recompensa de 1000 dólares a quien encuentre un fallo de seguridad en el software. Por ello, en este documento se intentará explicar el MTA qmail y cómo crear un sistema que incluya servicios SMTP, POP3, IMAP, gestión de listas de correo y webmail con ciertas características que iremos viendo más adelante. Pasen y vean.
Entendiendo qmail
Para empezar, podríamos decir que la gran característica de qmail es su gran modularidad y que el alma de qmail es su cola de mensajes (queue). Por ella pasan todos los mensajes de correo que maneja el servidor. Cuando qmail acepta un mensaje, ya sea enviado vía SMTP o localmente y el destinatario final sea uno remoto o alguno de los usuarios de nuestro servicio, lo primero que hace es introducirlo en su cola. Una vez en ella, averiguará el destinatario y lo procesará en consecuencia. Podríamos dividir los módulos de qmail siguiendo este patrón: módulos encargados de aceptar mensajes, módulos encargados de introducirlos en la cola y módulos encargados de entregarlos.
A continuación se detallarán los módulos que nos interesan conocer para el propósito que nos hemos planteado. Aunque qmail tiene algunos otro, se escapan de la orientación de este documento:
qmail-queue: Introduce mensajes en la cola.
qmail-inject: Construye un mensaje y utiliza qmail-queue para introducirlo en la cola localmente.
qmail-smtp: Acepta los mensajes a través de SMTP y utiliza qmail-queue para introducirlo en la cola.
qmail-send: Realiza el primer procesamiento del mensaje en la cola para saber si el destinatario es local o remoto.
qmail-lspawn: Es llamado por qmail-send cuando el destinatario es local. Procesa el mensaje en consecuencia y utiliza qmail-local para entregar el mensaje.
qmail-local: Entrega un mensaje a un usuario local.
qmail-rspawn: Es llamado por qmail-send cuando el destinatario no es local y utiliza qmail-remote para entregar el mensaje.
qmail-remote: Entrega un mensaje a un usuario remoto.
qmail-clean: Limpia la cola (no utilizar manualmente).
Una visión gráfica de las secuencias que sigue sistema se ilustra en el siguiente esquema:

En este caso, se ha introducido un mensaje en el sistema de correo de manera local. Ya hablamos de la existencia de qmail-inject, pero puede sorprender la existencia del programa sendmail. Bajo /usr/sbin en los sistemas Unix existe una programa para enviar mensajes usando el MTA instalado. Ya que sendmail ha sido utilizado durante largos años como MTA por defecto, se ha convertido en un estándar y muchos programas suponen la existencia del mismo. Con qmail se incluye una versión del programa manteniendo la misma interfaz con el fin de preservar la compatibilidad.
El mensaje se recibe de manera remota vía SMTP.
El módulo qmail-send ha concluido que el destinatario del mensaje se encuentra en el sistema local y cede la gestión del mensaje a los módulos encargados de dichas entregas.
Ahora, el mensaje debe ser entregado a otro servidor donde se encuentra el destinatario final.
En qmail se considera al módulo qmail-send el cerebro del sistema. Y como hemos visto, todos los mensajes pasan siempre por la cola. La cola de qmail es un conjunto de directorios y archivos que se encuentran bajo el directorio /var/qmail/queue.
En sistema de encolado de mensajes de qmail garantiza que ningún mensaje se pierda. Esta es una de las grandes garantías de qmail. Sin embargo, para que esa garantía sea cien por cien, deben cumplirse ciertos requisitos en el sistema de ficheros:
La cola de qmail debe estar situada siempre en un sistema de ficheros local. No puede encontrarse compartida vía NFS.
El sistema de ficheros debe ejecutar llamadas link() síncronamente. Cuando qmail ejecuta una llamada link() asume que los metadatos para el nuevo enlace son escritos de manera segura. Este requerimiento es necesario para evitar que una caída del sistema en un momento inoportuno provoque que se pierdan algunos mensajes. Los sistemas de ficheros que cumplen este requisito son:
BSD Fast File System (FFS) sin softupdates.
Variantes de FFS como Solaris o Tru64 UFS.
Algunos sistemas de correo que no cumplen este requisito:
El tercer y último requisito se refiere a la unidad de disco en la cual está albergada la cola de qmail: el disco no debe realizar un caché de escritura. Esta práctica es habitual en unidades IDE y menos en unidades SCSI. Algunos discos IDE, en ciertos sistemas, permiten deshabilitar esta funcionalidad.
El hecho de no cumplir todos los requisitos no implica que vayamos a realizar un mal sistema, sino que no estamos explotando todas las características de seguridad del MTA qmail. Existen muchos sistemas que manejan grandes cantidades de correo sin cumplir estos requisitos y realizan una tarea excelente.
Descripción del sistema a instalar
Las características del sistema serán las siguientes:
Servicio SMTP autenticado y con seguridad TLS(SSL).
Gestión de usuarios y dominios virtuales.
Base de datos de usuarios y grupos con MySQL.
Servicios POP e IMAP con seguridad SSL.
Webmail.
Autorrespondedor.
Listas de correo.
Administración del servidor vía web.
Antispam.
Antivirus.
Requisitos previos a la instalación.
Ya que en este documento no pueden tocarse todos y cada uno de los aspectos necesarios, realizaremos ciertas suposiciones:
Tienes conocimientos de administración bajo sistemas Unix o derivados.
Tienes conocimientos de los paquetes Ucspi-tcp y Daemontools (véase instalación en esta misma sección de documentos).
El sistema realiza las consultas DNS por medio de Djbdns. En caso contraría se debería aplicar un parche adicional a qmail que no va a ser tratado en el documento.
En el sistema deben estar instaladas las herramientas básicas de desarrollo (gcc, automake, autoconf, patch, make...) ya que todas las instalaciones será detalladas desde código fuente para una mayor compatibilidad entre sistemas.
Si no se cumplen estos requisitos, queda bajo la responsabilidad de cada
uno aprender lo necesario para poder seguir este documento sin perderse.
Seguir el documento puede resultar difícil o pesado en algunos
puntos, pero considero que el resultado es bueno al tratarse (creo) de
uno de los documentos en castellano más completos de los que se
pueden encontrar (eso no quiere decir que sea el mejor). Espero que
estas palabras en lugar de desanimarte te reten para conseguir el
resultado final. Recomiendo además que nadie intente seguir el
documento leyendo únicamente los mandatos que deben realizarse ya
que en estos no se encuentra todo lo que debe hacerse.
Hay que prestar atención a las versiones de los programas que utilizaremos, porque es obvio que a lo largo del tiempo se verán modificadas. Por ello, algunas URLs y órdenes que se detallan cambiarán dependiendo de las versiones actuales de los programas.
Esta no es una guía sencilla de instalación, gran parte por culpa de haber intentado que sea compatible tanto para sistemas basados en Linux como para FreeBSD. Dada también el gran número de distribuciones Linux existentes y las grandes diferencias que empiezan a aparecer entre ellas, es posible que alguno de lo pasos detallados no funcionen en una distribución en particular. Por ello se necesitará la pericia del lector para solucionar problemas que puedan surgir y que no se detalle su solución en el documento.
UCSPI-TCP
La instalación de ucspi-tcp va a ser comentada a
continuación ya que aplicaremos un parche para conseguir
compatibilidad con ciertas listas RBL. El paquete software puede encontrarse en http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz.
El parche puede encontrarse en http://qmail.imasd.elmundo.es/ucspi-rss.diff.
shell#> tar zxfv ucspi-tcp.0.88.tar.gz
shell#> cd ucspi-tcp.0.88
shell#> patch <
../ucspi-rss.diff
shell#> make
shell#> make
setup check
Servicio SMTP
Para poner en marcha nuestro servicio SMTP vamos a instalar qmail (el MTA), Vpopmail (nuestro gestor de usuarios y grupos virtuales), qmail-scanner (da soporte para escanear mensajes) y Clam-Antivirus (el antivirus que usaremos para escanear los mensajes). Como base de datos de usuarios se utilizará MySQL 3.23.x. La instalación de MySQL no se tratará aquí ya que no es el objetivo directo del documento. Tan sólo mencionar que se necesitará tanto el servidor como el cliente, además de las librerías y cabeceras. La instalación dependerá del sistema, notar que en algunas distribuciones de Linux no se instalan las cabeceras cuando se instala el servidor o el cliente. A modo de ejemplo, en Debian se necesitará instalar el paquete libmysqlclient10-dev.
Primero debemos crear el directorio donde se instalará qmail, que por defecto es /var/qmail:
shell#> mkdir /var/qmail
El servidor qmail usa una serie de cuentas de usuario y grupos que deben ser creados antes de la instalación.. Las órdenes a introducir son las siguientes:
NOTA: Algunos sistemas no contienen el programa /sbin/nologin. Cuando ese sea el casos, sustituirlo por /sbin/false,/bin/false o cualquier otro programa de función similar. Verifiquen la existencia antes de continuar.
Linux:
shell#>
groupadd nofiles
shell#>
useradd -g nofiles -d /var/qmail/alias alias -s /bin/nologin
shell#>
useradd -g nofiles -d /var/qmail qmaild -s /sbin/nologin
shell#>
useradd -g nofiles -d /var/qmail qmaill -s /sbin/nologin
shell#>
useradd -g nofiles -d /var/qmail qmailp -s /sbin/nologin
shell#>
groupadd qmail
shell#>
useradd -g qmail -d /var/qmail qmailq -s /sbin/nologin
shell#>
useradd -g qmail -d /var/qmail qmailr -s /sbin/nologin
shell#>
useradd -g qmail -d /var/qmail qmails -s /sbin/nologin
FreeBSD:
shell#>
cd /usr/ports/mail/qmail
shell#> make enable-qmail
NOTA: Si activamos qmail desde ports, el grupo nofiles pasará a llamarse qnofiles.
o también:
shell#> pw groupadd nofiles
shell#> pw useradd -n alias -g
nofiles -d /var/qmail/alias -s /sbin/nologin
shell#> pw
useradd -n qmaild -g nofiles -d /var/qmail -s /sbin/nologin
shell#> pw useradd -n qmaill -g
nofiles -d /var/qmail -s /sbin/nologin
shell#> pw useradd -n qmailp -g
nofiles -d /var/qmail -s /sbin/nologin
shell#> pw groupadd qmail
shell#> pw useradd -n qmailq -g qmail -d /var/qmail -s /sbin/nologin
shell#> pw useradd -n qmailr -g
qmail -d /var/qmail -s /sbin/nologin
shell#> pw useradd -n qmails -g
qmail -d /var/qmail -s /sbin/nologin
Antes de instalar qmail, vamos a procurar protegernos contra el problema que surge con algunos de los sistemas de ficheros. Si el sistema de ficheros que va a albergar la cola de qmail no se encuentra en la lista anteriormente detallada, debes saltarte este paso. Como solución para los sitemas Linux que no utilizan un sistema de ficheros compatible con la cola de qmail vamos a probar a utilizar una librería que nos proporcione ese sincronismo. La podemos obtener de http://untroubled.org/syncdir/syncdir-1.0.tar.gz. Los usuarios de FreeBSD pueden crear una pequeña partición, desactivar softupdates en ella y montarla sobre /var/qmail/queue, algo que en el momento de la instalación puede desactivarse pulsando la tecla “s” sobre la partición deseada y no deben realizar este paso.
Para
crear la librería necesaria para los sistemas Linux, introducimos las siguientes
órdenes:
shell#> tar zxfv syncdir-1.0.tar.gz
shell#> cd syncdir-1.0
shell#> make all
shell#> mv libsyncdir.* /usr/lib
Ya tenemos en nuestro sistema la librería que queríamos dispuesta a ser utilizada cuando compilemos qmail.
Si queremos tener soporte SSL, debemos tener instalado OpenSSL. Si no requerimos esta funcionalidad, ignorad los pasos relacionas con SSL.
En algunas distribuciones Linux, aunque dicen incluir OpenSSL o poderse instalar desde algún formato binario, no instalan las librerías y cabeceras. Debemos verificar que estas se encuentran instaladas para poder tener soporte SSL. Normalmente se deberían encontrar en /usr/lib o en /usr/include, sin embargo puedes tener localizaciones más exóticas. Si verificamos que no las tenemos instaladas, podemos bajar la distribución en código fuente y compilarlo.
shell#> wget
http://www.openssl.org/source/openssl-0.9.7b.tar.gz
shell#> tar zxfv openssl-0.9.7b.tar.gz
shell#> cd openssl-0.9.7b
shell#> ./config
shell#> make
shell#> make install
Los usuarios de FreeBSD no necesitan realizar esto. Pero si quieren correr la última versión de OpenSSL, tan sólo deberían hacer:
shell#> cd
/usr/ports/security/openssl
shell#> make clean install clean
El siguiente paso es obtener el código fuente del MTA qmail. Este se puede encontrar en http://cr.yp.to/software/qmail-1.03.tar.gz. Vamos a suponer que lo descargamos al directorio /usr/local/src. En ese mismo directorio también vamos a descargar los parches que utilizaremos. Estos parches van a añadir funcionalidades que el paquete original de qmail no incluye, como SMTP autenticado. En total propongo aplicar tres parches: el primero añadirá la funcionalidad que acabo de describir (http://qmail.imasd.elmundo.es/qmail-auth-20010105.tar.gz), el segundo nos dará la posibilidad de analizar los mensajes que maneje el servidor con un antivirus (http://qmail.imasd.elmundo.es/qmailqueue-patch) y el tercero dará soporte TLS al servicio SMTP (http://inoa.net/qmail/qmail-1.03-tls.patch). Nos colocamos en el directorio donde hemos descargado los archivos y escribimos:
shell#> tar zxfv qmail-1.03.tar.gz
shell#> tar zxfv qmail-auth-20010105.tar.gz
shell#> cp qmail-auth-20010105/base64.*
./qmail-1.03
shell#> cd
qmail-1.03
shell#> patch < ../ qmail-auth-20010105/auth.patch
shell#> patch < ../qmailqueue-patch
shell#> patch < ../qmail-1.03-tls.patch
Para los usuarios cuyo sistema de ficheros no es compatible (mayoría de los sistemas Linux), deben editar el archivo conf-ld y añadir -lsyncdir, de forma que resulte:
cc -s -lsyncdir
Los usuarios de FreeBSD
que activaron qmail desde
ports, deben editar el fichero conf-groups
y cambiar nofiles por qnofiles. Desde ahora, para estos
usuarios, donde se diga nofiles
será en realidad qnofiles.
shell#> make setup check
Linux:
shell#> make cert (respondemos a las preguntas que nos haga para crear el certificado)
FreeBSD:
shell#> make -f Makefile-cert
o si tienen instalado GNU make (gmake en los ports)
shell#> gmake cert
En este momento qmail ya se encuentra instalado en nuestro sistema. Pero necesita algunos pasos más para que quede perfectamente configurado. El primer paso de configuración es decirle a qmail cuál es el nombre de nuestra máquina:
shell#> ./config-fast nombreDeMiMaquina.miDominio.com
Ya hemos realizado una primera configuración del servidor. Si nos desplazamos al directorio /var/qmail/control vemos que existen una serie de ficheros. Por ejemplo, uno de ellos llamado me contendrá el nombre de nuestra máquina. Esta es la forma en que se configura qmail una vez instalado: una serie de archivos con un nombre específico que da un valor determinado a alguno de los módulos de qmail. Algunos de los archivos que maneja qmail son:
me: Muchas opciones de qmail se basan en este valor. Aquí debe colocarse el nombre de la máquina donde se está realizando la instalación.
locals: En este archivo debe colocarse los nombres de dominio que se tomarán como locales.
rcpthosts: Aquí se colocarán los nombres de dominio que serán aceptados vía SMTP.
smtpgreeting: En este fichero puede especificarse el saludo que se mostrará cuando se acepte una conexión.
queuelifetime: Fija el período de tiempo máximo que puede estar en la cola un mensaje que no ha podido ser enviado.
databytes: Fija el tamaño máximo en bytes de los mensajes recibidos vía SMTP.
concurrencylocal: Fija el número máximo de entregas locales simultáneas posibles. Este parámetro tiene como máximo un valor que se fija durante la compilación y en el fichero conf-spawn. No puede ser superior a 255 y en algunos sistemas no puede superar 125. El máximo que se establece por defecto son 120. Si se necesitaran concurrencias mayores, debe aplicarse el parche big-concurrency en la instalación. Un valor demasiado grande podría ocasionar que se lanzaran más procesos de los que nuestro sistema puede soportar. Por ello es un parámetro crítico que debe ser meditado en consecuencia. El valor por defecto es 10.
concurrencyremote: Fija el número máximo de entregas remotas simultáneas posibles. Pasa lo mismo que con el archivo anterior. El valor por defecto es 20.
defaultdomain: Establece el nombre de dominio por defecto para aquellos mensajes que no contienen uno en el campo FROM.
Por ejemplo, podríamos crear algunos de los archivos que hemos comentado de la siguiente forma:
shell#> cd /var/qmail/control
shell#> echo '*= BIENVENIDO A MI
SERVIDOR qmail =*' > smtpgreeting
shell#> echo '86400' > queuelifetime (un día de tiempo de vida)
shell#> echo '5242880' >
databytes (5 Mb de tamaño
máximo de mensajes)
shell#> echo '60' >
concurrencylocal (este valor debe
ser meditado por cada uno)
shell#> echo '60' >
concurrencyremote (igual que el
anterior)
shell#> echo
'40' > concurrencyincoming (no
es un archivo propio de qmail
pero lo usaremos más adelante cuando definamos los scripts de arranque del sistema)
En el directorio /var/qmail/alias podemos definir alias de usuarios de la siguiente forma:
shell#>
cd /var/qmail/alias
shell#> echo
'postmaster@dominio.com' > .qmail-root
shell#> echo 'postmaster@dominio.com' > .qmail-postmaster
shell#> echo
'postmaster@dominio.com' > .qmail-mailer-daemon
Como se comentó anteriormente, los sistemas Unix han convivido muchos años con Sendmail, es por ello que se ha convertido prácticamente en un estándar. Todos estos sistemas tienen una serie de programas para enviar correo de manera local que suelen encontrarse en /sbin/sendmail y /usr/lib/sendmail. Estos programas deben ser movidos a otro lugar o borrardos (en en caso de ser enlaces, desenlazarlos) y poner en su lugar los ofrecidos por qmail. Un ejemplo de las operaciones a realizar podría ser:
shell#>
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
shell#> mv /usr/lib/sendmail
/usr/lib/sendmail.old (en FreeBSD /usr/libexec/sendmail/sendmail)
shell#> ln -sf /var/qmail/bin/sendmail /usr/sbin/sendmail
shell#> ln -sf /var/qmail/bin/sendmail /usr/lib/sendmail
Todavía nuestro servicio SMTP no está del todo listo para ser lanzado, ya que los usuarios y grupos serán manejados por el gestor Vpopmail. El gestor puede ser descargado desde http://www.inter7.com/vpopmail/vpopmail-5.2.1.tar.gz en su versión estable y desde http://www.inter7.com/devel/vpopmail-5.3.20.tar.gz en su versión en desarrollo. Nosotros utilizaremos la versión en desarrollo y de nuevo lo situaremos en /usr/local/src. Además hay que crear el usuario y el grupo que usará Vpopmail.
Linux
shell#>
groupadd -g 89 vchkpw
shell#> useradd -g vchkpw -u 89 vpopmail -d
/usr/local/vpopmail -s /sbin/nologin
FreeBSD
shell#> pw
groupadd -n vchkpw -g 89
shell#> pw useradd -n vpopmail -u 89 -g vchkpw -d
/usr/local/vpopmail -s /sbin/nologin
Al utilizarse MySQL como base de datos de los usuarios, para esta compilación ya se requiere tener instalados en el sistema las librerías, cabeceras y el cliente de MySQL. Si además el servidor MySQL va a residir en la misma máquina que el servidor de correo, también deberíamos instalar el servidor en este momento. Esta instalación no se cubrirá en este documento.
Además ,Vpopmail tiene como dependencia la librería zlib. En los sistemas FreeBSD viene incluida, pero en algunas distribuciones de Linux es posible que no sea así. Por lo tanto debemos obtenerla de http://www.gzip.org/zlib/zlib-1.1.4.tar.gz e instalarla:
shell#> tar zxfv zlib-1.1.4.tar.gz
shell#> cd
zlib-1.1.4
shell#> ./configure
shell#> make
shell#> make install
A continuación configuramos el código fuente de Vpopmail:
shell#> tar -zxfv vpopmail-5.3.20.tar.gz
shell#> cd
vpopmail-5.3.20
shell#> mkdir /usr/local/vpopmail
shell#> ./configure --enable-mysql=y \
-–enable-defaultquota=26214400S,1000C \
--enable-valias=y --enable-learn-passwords=y --enable-logging=p \
--enable-domainquotas=y –enable-default-domain=miDominio.com
NOTA:Es posible que la configuración falle si no encuentra los includes y las librerías de MySQL por no estar en los lugares convencionales. Estos lugares puede ser especificados a mano añadiendo a la línea de configuración
“--enable-incdir=/path/delosincludes/demysql” y
“--enable-libdir=/path/delibrerias/demysql”
respectivamente.
Muy posiblemente los valores sean:
“--enable-incdir=/usr/include/mysql” y
“--enable-libdir=/usr/lib“
Ahora debemos modificar un archivo del código fuente con el fin de indicarle los datos sobre la base de datos de MySQL. Debemos indicarle dónde está el servidor, el usuario de la base de datos y su password. Para ello hay que editar el archivo vmysql.h, en el que encontraremos una zona que dice lo siguiente:
#define MYSQL_UPDATE_SERVER “localhost”
#define MYSQL_UPDATE_USER “root”
#define MYSQL_UPDATE_PASSWD
“secret”
#define MYSQL_READ_SERVER “localhost”
#define MYSQL_READ_USER “root”
#define MYSQL_READ_PASSWD “secret”
Vamos a modificar donde pone root por vpopmail y secret por la contraseña que queramos. No es necesario modificar el valor localhost si es que el servidor de bases de datos se encuentra en la misma máquina en la que estamos instalando qmail. Quedará algo como lo siguiente:
#define
MYSQL_UPDATE_SERVER “localhost”
#define MYSQL_UPDATE_USER “vpopmail”
#define MYSQL_UPDATE_PASSWD “mi_password”
#define MYSQL_READ_SERVER “localhost”
#define MYSQL_READ_USER “vpopmail”
#define MYSQL_READ_PASSWD “mi_password”
Ahora ya podemos compilar e instalar Vpopmail:
shell#> make
shell#> make install-strip
Antes de configurar ningún script de arranque, debería ser añadido por lo menos un dominio. Esto se va a realizar por medio de Vpopmail, ya que va a ser él quien los maneje. Como los dominios y y usuarios van a ser almacenados en una base de datos de MySQL, es el momento de crear el usuario y la base de datos cuyos parámetros se definieron en la compilación de Vpopmail. Para ello introducimos las siguientes órdenes:
shell#> mysql -u root -p
Enter password: ****** (el
password del root si lo hemos establecido, no confundir con el root
del sistema)
mysql>
CREATE DATABASE vpopmail;
mysql> GRANT ALL
PRIVILEGES ON vpopmail.* TO vpopmail@localhost IDENTIFIED BY
'my_password'; (El definido en vmysql.h. Es necesario poner
las comillas simples)
mysql> quit;
Para comprobar que hemos creado correctamente la base de datos y el usuarios, hay que comprobar que puede hacer login en MySQL:
shell#> mysql -u vpopmail -h
localhost -p
Enter password: ******
(mi_password)
mysql>
quit;
Ahora ya podemos
añadir el dominio y los usuarios:
shell#> ~vpopmail/bin/vadddomain midominio.com
Please enter password for
postmaster: ******
enter password again: ******
shell#> ~vpopmail/bin/vadduser miprimerusuario@midominio.com
Please enter password for
miprimerusuario@midominio.com: ******
enter password again: ******
Ya hemos creado un dominio (midominio.com) y dos usuarios: postmaster, que se crea por defecto, y miprimerusuario. Si nos fijamos en el directorio /var/qmail/control, vemos como se han modificado algunos archivos como rcpthosts y virtualdomains. La funcionalidad del primero ya fue explicado y, obviamente, en el segundo se especifican los dominios virtuales que manejará el servidor.
Nuestro servicio SMTP ahora mismo es completamente funcional. Tan sólo queda crear los scripts de inicio. Para lanzar el servidor nos ayudaremos de daemontools y Ucspi-tcp. Necesitamos crear dos servicios que llamaremos qmail-run y qmail-smtp. El primero lanza la mayor parte de los demonios de qmail, mientras que el segundo se encarga de las conexiones SMTP. Situaremos los servicios bajo /usr/local/service.
shell#> mkdir /usr/local/service
shell#> mkdir
/usr/local/service/qmail-send
shell#> mkdir /usr/local/service/qmail-send/env
shell#> mkdir /usr/local/service/qmail-send/log
shell#> mkdir /var/log/qmail-send
shell#> chown qmaill:nofiles /var/log/qmail-send
A continuación colocamos los scripts siguientes allí donde
se indique con los nombres, permisos y propietario detallados:
Ubicación: /usr/local/service/qmail-send
Nombre: run
Dueño: root
Permisos: 700
---------------COPIA DESDE AQUÍ--------------
#!/bin/sh
exec envdir ./env /var/qmail/bin/qmail-start ./Maildir/
---------------HASTA AQUÍ------------------------
Ubicación: /usr/local/service/qmail-send/env
Nombre: PATH
Dueño: root
Permisos: 600
---------------COPIA DESDE AQUÍ--------------
/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/var/qmail/bin
---------------HASTA AQUÍ------------------------
Ubicación: /usr/local/service/qmail-send/log
Nombre: run
Dueño: root
Permisos: 700
---------------COPIA DESDE AQUÍ--------------
#!/bin/sh
exec envdir ../env setuidgid qmaill multilog t /var/log/qmail-send
---------------HASTA AQUÍ------------------------
shell#> mkdir /usr/local/service/qmail-smtp
shell#> mkdir /usr/local/service/qmail-smtp/env
shell#> mkdir /usr/local/service/qmail-smtp/log
shell#> mkdir /var/log/qmail-smtp
shell#> chown qmaill:nofiles /var/log/qmail-smtp
Ubicación:/usr/local/service/qmail-smtp
Nombre: run
Dueño: root
Permisos: 700
---------------COPIA DESDE AQUÍ--------------
#!/bin/sh
USER=`id -u vpopmail`
GROUP=`id -g vpopmail`
MAXCONCU=`head -l /var/qmail/control/concurrencyincoming`
HOSTNAME=`head -l /var/qmail/control/me`
exec 2>&1
exec envdir ./env softlimit -m 8000000 \
tcpserver -v -R -H -c $MAXCONCU -u $USER -g $GROUP
mailhost.cidsite.qc.to smtp \
rblsmtpd -r relays.ordb.org \
qmail-smtpd HOSTNAME vchkpw true
---------------HASTA AQUÍ------------------------
Ubicación:/usr/local/service/qmail-smtp/env
Nombre: PATH
Dueño: root
Permisos: 600
---------------COPIA DESDE AQUÍ--------------
/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/var/qmail/bin:/usr/local/vpopmail/bin
---------------HASTA AQUÍ------------------------
Ubicación:/usr/local/service/qmail-smtp/log
Nombre: run
Dueño: root
Permisos: 700
---------------COPIA DESDE AQUÍ--------------
#!/bin/sh
exec envdir ../env setuidgid qmaill multilog t /var/log/qmail-smtp
---------------HASTA AQUÍ------------------------
Como vemos el servidor va a ser lanzado bajo la identidad del usuario vpopmail. Por ello debemos cambiar el propietario del certificado del servidor para que pueda ser leído por este:
shell#> chown vpopmail:vchkpw /var/qmail/control/servercert.pem
En este momento el servidor ya puede ser lanzado:
shell#> ln -s /usr/local/service/qmail-send
/service
shell#> ln -s /usr/local/service/qmail-smtp
/service
AÑADIENDO SOPORTE ANTIVIRUS
El siguiente paso es opcional, ya que añadiremos soporte antivirus a nuestro servidor. Si alguien considera que no necesita esta carácterística, puede saltarse este apartado.
En este momento vamos a realizar una pequeña aclaración para evitar disgustos posteriores. Un sistema de escaneo de emails es algo que no se recomienda tener instalado en la misma máquina de entrada de mensajes o donde se realicen otros servicios. Simplemente porque el gasto de CPU y memoria puede llegar a ser muy alto. Esto puede acarrear una disminución de rendimiento considerable en los servicios. De hecho, en cualquier sistema de correo real que incluya esta característica y haya sido diseñado con un mínimo de delicadeza, estas tareas se realizan en máquinas de dedicación exclusiva.
Como viene siendo común en este documento, sólo se trata la instalación del sistema sin entrar tanto en detalle en la administración y ciertas partes de la configuración del mismo. De nuevo recae sobre el lector aprender a configurar y administrar aquellas partes del sistema que crea oportunas.
Podemos escanear los emails que circulen a través de nuestro servidor con una herramienta antivirus y con él contribuir a que éstos no se extiendan por la Internet. Una opción gratuita es Clam Antivirus (http://www.clamav.org). Si utilizamos este antivirus con alguna herramienta que permita interceptar los emails en el servidor y escanearlos, podríamos sanear los mensajes que circulen. Para ello hemos instalado el parche qmailqueue, que junto con la herramienta qmail-scanner va a hacer realidad este hecho.
Más tarde nos ocuparemos de todo esos asuntos, de momento sólo vamos a centrarnos en la instalación del antivirus Clam. Obtemos el programa desde http://www.clamav.org/stable/clamav-0.60.tar.gz y lo colocamos en algún lugar de nuestro árbol de directorios (por ejemplo, /usr/local/src). Primero debemos crear un usuario y un grupo que llamaremos clamav. Introducimos las siguientes órdenes:
LINUX
shell#>
groupadd clamav
shell#>
useradd -g clamav clamav -d /nonexistent -s /sbin/nologin
FREEBSD
shell#> pw groupadd -n clamav
shell#> pw
useradd -n clamav -g clamav -d /nonexistent -s /sbin/nologin
shell#> tar zxfv clamav-0.60.tar.gz
shell#>
cd clamav-0.60
shell#>
./configure
shell#>
make
shell#>
make install
A continuación vamos a realizar una prueba escaneando las fuentes de clamav para ver si encontramos algún virus. Para ello nos colocamos en el directorio /usr/local/src (el supuesto directorio donde estamos descargando todas las fuentes de los programas) y tecleamos:
shell#> clamscan -r -l scan.txt clamav-0.60
Hemos creado un archivo (scan.txt) donde se registrará la salida del escaneo y podemos verficar que se han encontrado 4 ficheros infectados.
Es importante mantener el antivirus al día. Podemos actualizar el antivirus vía Internet mediante el programa freshclam. Sería interesante crear una tarea cron para que el antivirus se actualice automáticamente diariamente. Decir por último que el archivo de configuración se encuentra en /usr/local/etc/clamav.conf
El siguiente paso es instalar el soporte necesario para que los mensajes de correo puedan ser escaneados antes de ser introducidos en la cola de qmail. Es necesario tener soporte Perl en nuestro sistema , bajo la responsabilidad de cada uno queda dotar al sistema de esta funcionalidad si no la tiene. Muchas sistemas consideran que es raro necesitar correr script Perl con soporte suid. Para poder correr en nuestro sistema el controlador de spam y virus necesitamos dicha opción. Existen paquetes precompilados para algunos sistemas con esta opción activada, en caso contrario necesitariamos instalar desde los fuentes activando dicha opción. Podemos comprobar si nuestra distribución de Perl tiene este soporte verificando la existencia del archivo /usr/bin/suidperl. En el caso de Debian 3.0 r0 (a modo de ejemplo) esta opción no viene activada por defecto, para conseguirlo bastaría con introducir la siguiente orden:
shell#> apt-get install perl-5.6-suid
Además, es posible que necesitemos modificar los permisos del ejecutable (piensa en las posibles consecuencias de seguridad que pueden tener las siguientes órdenes):
shell#>
chown root /usr/bin/suidperl
shell#> chmod 4711
/usr/bin/suidperl
El motor de nuestro sistema antivirus y antispam será qmail-scanner, el cual necesita que se instalen ciertos componentes previos a su instalación:
shell#>
perl -MCPAN -e 'install Time::HiRes'
shell#> perl -MCPAN -e 'install
DB_File' (suele venir
instalado)
shell#>
perl -MCPAN -e 'install Sys::Syslog'
(suele venir instalado)
A continuación debemos obtener Maildrop desde http://prdownloads.sourceforge.net/courier/maildrop-1.5.3.tar.bz2
shell#>
bzunzip2 maildrop-1.5.3.tar.bz2
shell#> tar xfv maildrop-1.5.3.tar
shell#> cd maildrop-1.5.3
shell#> ./configure
shell#>
make
shell#>
make install-strip
shell#>
make install-man (si queremos instalar las páginas de manual)
Opcionalmente podemos instalar TNEF unpacker con el fin de decodificar ciertos attachments propios de Microsoft y así detectar ciertos virus. Este software lo podemos obtener desde http://prdownloads.sourceforge.net/tnef/tnef-1.2.1.tar.gz
shell#>
tar zxfv tnef-1.2.1.tar.gz
shell#>
cd tnef-1.2.1
shell#>
./configure
shell#>
make
shell#>
make check
shell#>
make install
Nuestro antivirus va a escanear archivos comprimidos, por lo que en nuestro sistema es recomendable que tengamos instalado unzip, uno de los sistemas de compresión más usado en los sistemas Windows.
FREEBSD
shell#> cd
/usr/ports/archiver/unzip
shell#> make clean install clean
LINUX
Primero se debe descargar el binario apropiado para nuestro sistema desde http://www.info-zip.org. Descomprimir y colocar en nuestro árbol de directorios.
shell#> wget http://sunsite.cnlab-switch.ch/ftp/mirror/infozip/UNIX/LINUX/unz550x-glibc.tar.gz
shell#> tar zxfv unz550x-glibc.tar.gz
shell#> cd unzip-5.50
shell#> mv funzip unzip unzipsfx
zipgrep zipinfo /usr/local/bin
shell#> mv funzip.1 unzip.1
unzipsfx.1 zipgrep.1 zipinfo.1 /usr/local/man/man1
Suele venir en los CDs de las distribuciones, por lo que suele ser más sencillo instalarlo mediantes los sistemas de gestión de paquetes propios de la distribución. Dada la diversidad de distribuciones, se dejará bajo la responsabilidad y habilidad de cada uno la instalación de este paquete.
Ahora ya estamos preparados para instalar qmail-scanner en nuestro sistema. Lo podemos obtener desde http://prdownloads.sourceforge.net/qmail-scanner/qmail-scanner-1.16.tgz. Lo colocamos en algún lugar de nuestro árbol de directorios y escribimos:
shell#>
tar zxfv qmail-scanner-1.16.tgz
shell#>
cd qmail-scanner-1.16
shell#>
./configure --admin root --domain nombreDeMiMaquina.miDominio.com \
--local-domains
“nombreDeMiMaquina.miDominio.com,miDominio.com”
--lang es_ES --install
NOTA 1: Si tuvieramos más dominios locales, deberían nombrarse en la opción --local-domains
Ya está todo preparado en nuestro sistema, sin embargo debemos decirle a qmail que utilice nuestro soporte antivirus. Para esto fue por lo que instalamos el parche qmailqueue. Este parche provoca que qmail verifique la existencia de la variable de entorno QMAILQUEUE. Si esta existe, cada mensaje en lugar de ser introducido en la cola, se le pasa al programa que especifique la variable de entorno.
Por ello debemos crear dos variables de entorno a cargar por nuestros servicios qmail-send y qmail-smtp. Para ello hacemos lo siguiente:
shell#> echo
'/var/qmail/bin/qmail-scanner-queue.pl' >
/usr/local/service/qmail-send/env/QMAILQUEUE
shell#> echo
'/var/qmail/bin/qmail-scanner-queue.pl' >
/usr/local/service/qmail-smtp/env/QMAILQUEUE
shell#> svc -h /service/qmail-send
shell#> svc -h /service/qmail-smtp
Ahora podemos comprobar si nuestro sistema de verdad tiene protección antivirus. Para ello realizaremos el test que se incluye con qmail-scanner. Este test envía cuatro mensajes: el primero no está infectado, el segundo y tercero portan virus, y el cuarto es claro mensaje de spam. El cuarto mensaje se realiza por si tenemos instalado en nuestro sistema un programa que chequee los contenidos de los mensajes en busca de posibles correo basura, como por ejemplo spamassassin. Esta funcionalidad no será cubierta en este documento. Para realizar el test tecleamos los siguiente:
shell#>
cd contrib
shell#>
./test_instalation.sh -doit
El test ha introducido en nuestro sistema de correo los cuatro mensajes que se comentaba antes. Ahora debemos comprobar que estos mensajes han sido detectados por el sistema. Para ello nos dirigimos a /usr/local/vpopmail/domains/miDominio.com/postmaster/Maildir/new. Allí podemos leer el contenido de los mensajes mediante las herramientas more o less. El primer de los mensajes está completamente limpio; el segundo y tercero contienen un virus que será detectado por el sistema; el último es un ejemplo de correo basura.
Esta entrega se realiza de manera local. Si cuando probemos
entregas a través de SMTP obtenemos un error de falta de memoria
para el proceso, debemos aumentar el valor de memoria asignada por softlimit en el script de arranque del servicio (que
pusimos a 8000000).
Tu sistema ya está dotado de un servicio SMTP
completo. En los siguientes documentos de esta serie se
añadirán nuevos servicios y funcionalidades que pueden ser
interesantes.
Los pasos seguidos en este documento han sido probados sobre
Debian GNU/Linux 3.0r0 y Unix FreeBSD 4.8 Release. El documento
debería ser válido para cualquier distribución
Linux o cualquier versión o rama de FreeBSD.
Agradecería que todo el mundo que haya leído o
seguido el documento y haya encontrado algún fallo en su
contenido o alguna parte que no considere afortunada ponga un
comentarío debajo del mismo.