Crear un servidor de correo en GNU Linux desde cero
En la web ya hemos tratado servicios de correo, concretamente la instalación y configuración de relay de correo con Postfix, tanto con cuentas de gmail como de Office365. El problema es que dicho servicio sólo funciona para los envíos utilizando smtp. Hoy veremos como instalar un servidor de correo desde cero, utilizando los programas de software libre, Postifx, Dovecot y SpamAssasin, sobre un servidor Ubuntu.
Adquisición de un dominio económico
Antes de nada necesitamos adquirir un dominio, si puede ser económico mejor, ya que lo necesitaremos para el sistema de correo. Para la ocasión he realizado una pequeña adquisición del nombre ochobitsunbyte.pw, por sólo 3 euros y pico al año. Para ellos he utilizado los servicios de namecheap.com, como podéis ver en la imagen.
Primero de todo tenemos que averiguar si el dominio está disponible, para ello utilizaremos el buscador.
Los dominios .pw son muy económicos, por lo que para el tutorial me irá de perlas.
Tal y como vemos en la imagen, añadido al dominio nos ofrecen servicio de Whois anónimo llamado «Free WhoisGuard«, de manera gratuita, por lo que nos irá genial para que nuestros datos no sean públicos. Al confirmar la orden nos enviará a la pasarela de pago, que en mi caso es vía paypal. Una vez adquirido ya podemos pasar a la siguiente parte.
Contratar un VPS
Para el tutorial y para un uso todavía por determinar por mi parte, contrataremos un VPS, es decir, un servidor privado virtual en la nube, esto es, en una granja de servidores situada en alguna parte del planeta. Para ello utilizaremos la web digitalocean.com, con la que tengo muy buena experiencia, desde hace más de un año. Para ello nos iremos a la web.
Yo ya tengo creada una cuenta, que por cierto es gratuita. En el siguiente paso crearemos un VPS o Droplet. Escogeremos un pequeño con 512 MB de memoria, 20 GB de disco duro y 1 núcleo, más que suficiente. Con un sistema operativo con Ubuntu 12.04
En la primera parte tenemos que escoger el nombre para el servidor, en mi caso será correo.ochobitsunbyte.pw, escogemos el servidor con las características que he comentado antes, que tiene un coste de 5 eur al mes.
A continuación elegimos la ubicación del centro de datos. Si vivimos en Europa recomiendo un centro de datos en dicho continente, ya que tiene unas leyes menos invasivas como por ejemplo las de Estados Unidos.
He escogido la ubicación geográfica de Frankfurt en Alemania. En el siguiente paso elegimos el sistema operativo. He escogido Ubuntu en su versión 12.04 de 64 bits. La razón por la que no he escogido Debian, que es mi distribución favorita, es que cuando he realizado la instalación (llevo varios días haciendo pruebas), cuando tenía todo instalado un bug del sistema con el servicio Dovecot me ha fastidiado la fiesta. Dicha versión de Ubuntu es una versión fiable para el fin de ésta guía.
En el último paso podemos seleccionar una llave ssh, en nuestro caso no lo haremos, aunque podéis ver los nombres de las llaves que hasta ahora he ido creando para otros servidores. También podemos añadir una red interna, servicios de copias de seguridad, etcétera.
Y apretamos el botón «Create Droplet«
Al crear el servidor nos llegarán las credenciales a nuestro correo electrónico, para así poder acceder por ssh. La clave que nos envíen la tendremos que cambiar de manera obligatorio al acceder por primera vez.
Para quien esté interesado en utilizar DigitalOcean, puede utilizar el siguiente código promocional y obtener un descuento de 10 USD
Primeros pasos con el servidor
Al acceder vía ssh, debemos cambiar la contraseña. Recomiendo utilizar una contraseña de al menos 8 dígitos y que no sea habitual, podemos utilizar el programa pwgen del que ya hablamos en su día, ya que es una fantástica herramienta de creación de contraseñas.
Otro paso importante para segurizar nuestro servidor es cambiar el puerto por defecto del servicio ssh, tema que también tratamos en otro artículo, también podemos limitar el tiempo de conexión.
Actualizamos las fuentes y los paquetes del servidor a la última versión:
apt-get -y update
apt-get -y upgrade
De ésta manera ya podemos empezar a instalar nuestro servidor de correo.
Requisitos mínimos para el funcionamiento del servidor
Para que todo nos funcione a la perfección primero de todo debemos utilizar un nombre FQDN correcto. Para ello primero modificamos el archivo /etc/hosts y deberá quedar así:
127.0.0.1 localhost
127.0.1.1 correo.ochobitsunbyte.pw correo
nuestra.ip correo.ochobitsunbyte.pw correo
En la última línea debemos sustituir «nuestra.ip» por la IP del servidor.
Otro requisito para el servidor será tener instalado un servicio de base de datos MYSQL Recordar que al instalarlo nos pedirá otra vez una contraseña, es importante que no sea la misma que la del servidor.
Instalamos los paquetes:
apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql
Debemos securizar nuestro servicio de base de datos, siguiendo los pasos del comando:
/usr/bin/mysql_secure_installation
Instalación de Postfix y Dovecot
De Postfix ya hemos hablado mucho en la web. Simplificando se trata de una herramienta para la gestión del correo, mucho más segura y avanzada que otras «marcas» propietarias. Dovecot se trata de un servicio IMAP y POP3 para sistemas GNU Linux, que pone especial hincapié en la seguridad. Todo ello combinado con MYSQL, que ya hemos instalado antes, y que hará que la combinación de los tres tengamos un servidor de correo muy completo.
Realizamos la instalación de los paquetes:
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
Nos aparecerá una pantalla donde nos preguntará que tipo de servidor de correo queremos, escogemos «Servidor de Internet«
El siguiente paso le decimos el nombre cualificado para el servidor:
Creación de la base de datos MYSQL
Antes de finalizar la instalación un paso muy importante es crear la base de datos con la que trabajará el sistema de correo. Al igual que en otros casos debemos de llamar a la base de datos con un nombre poco común. Llamaré a la base de datos ‘cronos‘
De la siguiente manera:
mysqladmin -p create cronos
Y a continuación accedemos a la consola MYSQL
mysql -u root -p
Una vez dentro crearemos un nuevo usuario que tendrá privilegios sobre la base de datos ‘cronos‘. A dicho usuario le llamaremos ‘fantastes‘, con nueva contraseña diferente de la de root.
GRANT SELECT ON cronos.* TO 'fantastes'@'127.0.0.1' IDENTIFIED BY 'contraseña';
Y recargamos los privilegios:
FLUSH PRIVILEGES;
Y accedemos la base de datos:
USE cronos;
Crearemos una nuevo tabla para los dominios virtuales de correo:
CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ahora creamos otra tabla con los datos de los usuarios, correos electrónicos y contraseñas:
CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Como cualquier servidor de correo que se precie también crearemos una tabla para los «alias», es decir, para las redirecciones de correo:
CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` VARCHAR(100) NOT NULL,
`destination` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Otro paso importante es insertar los servidores virtuales con los que vamos a trabajar, recordar que tienen que cumplir con las normas FQDN. En nuestro caso será por una parte el nombre de dominio ochobitsunbyte.pw y por el otro el nombre del servidor correo.ochobitsunbyte.pw
De la siguiente manera:
INSERT INTO `cronos`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'ochobitsunbyte.pw'),
('2', 'correo.ochobitsunbyte.pw');
Ahora añadiremos un correo, con el realizaremos pruebas de funcionamiento a posteriori.
INSERT INTO `cronos`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('contraseña', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'davidochobits@ochobitsunbyte.pw');
Y por último los «Aliases» o redirecciones, en éste caso sólo añadiremos una ficticia.
INSERT INTO `cronos`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@ochobitsunbyte.pw', 'davidochobits@ochobitsunbyte.pw');
Por ésta parte ya hemos acabado. Podemos salir con ‘exit‘
Configurar Postfix
Ahora nos toca configurar Postfix. Guardamos el fichero de configuración original:
mv /etc/postfix/main.cf /etc/postfix/main.cf.back
Y creamos uno nuevo utilizando nuestro editor favorito, en mi caso nano:
nano /etc/postfix/main.cf
Utilizaremos los certificador SSL gratuitos disponibles en el sistema, para ellos añadimos éstas primeras líneas:
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
Y añadimos:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
Decidimos que no queremos conexiones anónimas:
smtp_sasl_security_options = noanonymous
Y los datos referentes a nuestro de dominio y servidor:
mydestination = localhost
myhostname = correo.ochobitsunbyte.pw
Indicamos que vamos a utilizar los servidores virtuales indicados en la tabla de la base de datos:
virtual_transport = lmtp:unix:private/dovecot-lmtp
Por último añadimos las ubicaciones de los ficheros configuración para los dominios, usuarios y alias.
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Y comenzamos a editar los ficheros de configuración. Creamos el fichero «mysql-virtual-mailbox-domains.cf«
nano /etc/postfix/mysql-virtual-mailbox-domains.cf
Y añadimos en el fichero:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Reiniciamos el servicio:
service postix restart
Utilizando el comando postmap comprobaremos que la configuración del fichero es correcta:
postmap -q ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Si todo ha ido bien nos devolverá un ‘1‘
Vamos a por el segundo de los ficheros:
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
Y añadimos las líneas:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT 1 FROM virtual_users WHERE email='%s'
Reiniciamos el servicio:
service postfix restart
Comprobamos la configuración:
postmap -q davidochobits@ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Si nos muestra ‘1’ es que todo va bien.
Por último el tercer fichero:
nano /etc/postfix/mysql-virtual-alias-maps.cf
Y su contenido:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Reiniciamos por última vez en éste apartado el servicio:
service postfix restart
Realizamos la comprobación:
postmap -q alias@ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-alias-maps.cf
De ésta manera nos tiene que mostrar el correo al cual está redirigido, es decir, davidochobits@ochobitsunbyte.pw
Para poder utilizar la conexión segura por el puerto 587 debemos modificar el fichero /etc/postfix/master.cf
nano /etc/postfix/master.cf
Debemos descomentar las siguientes líneas:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
Si reiniciamos Postfix ya podremos utilizar el puerto 587.
Configurar Dovecot
Los principales ficheros de configuración de Dovecot, los cuales tendremos que modificar son los siguientes:
- /etc/dovecot/dovecot.conf
- /etc/dovecot/conf.d/10-mail.conf
- /etc/dovecot/conf.d/10-auth.conf
- /etc/dovecot/dovecot-sql.conf.ext
- /etc/dovecot/conf.d/10-master.conf
- /etc/dovecot/conf.d/10-ssl.conf
Para ello lo primero que haremos es copiarlos a otro archivo para perder la configuración original:
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
Empezamos a trabajar con el fichero /etc/dovecot/dovecont.conf, lo editamos:
nano /etc/dovecot/dovecot.conf
Y verificamos que la siguiente línea no esté comentada:
!include conf.d/*.conf
Justo debajo de la línea «!include_try /usr/share/dovecot/protocols.d/*.protocol line«, debemos añadir los protocolos a utilizar:
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
Editamos el siguiente fichero de configuración:
nano /etc/dovecot/conf.d/10-mail.conf
Debemos descomentar la siguiente línea y dejarla tal así:
mail_location = maildir:/var/mail/vhosts/%d/%n
Ahora buscamos ésta otra línea, la descomentamos, y la dejamos tal cual:
mail_privileged_group = mail
Una vez editado el fichero lo guardamos.
Creamos la carpeta donde veremos los registros de la base de datos MYSQL:
mkdir -p /var/mail/vhosts/ochobitsunbyte.pw
Creamos el usuario y grupo ‘vmail‘ con la ID 5000
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
Asignamos el nuevo usuario y grupo al directorio /var/mail utilizando el comando chown:
chown -R vmail:vmail /var/mail
Editamos el siguiente fichero:
nano /etc/dovecot/conf.d/10-auth.conf
Editamos la línea a continuación añadiendo el parámetro ‘yes‘:
disable_plaintext_auth = yes
Modificamos la línea ‘auth_mechanisms’ con los parámetros:
auth_mechanisms = plain login
Comentamos la línea:
#!include auth-system.conf.ext
Y descomentamos la línea referida a la autorización MYSQL:
!include auth-sql.conf.ext
En el paso siguiente creamos el fichero /etc/dovecot/conf.d/auth-sql.conf.ext para la información de autentificación:
nano /etc/dovecot/conf.d/auth-sql.conf.ext
Y añadimos el contenido:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Guardamos y pasamos al siguiente fichero, en este caso se trata de /etc/dovecot/dovecot-sql.conf, donde indicamos la información MYSQL
nano /etc/dovecot/dovecot-sql.conf.ext
Descomentamos y añadimos el parámetro ‘mysql‘ :
driver = mysql
Descomentamos y añadimos nuestros datos de base de datos:
connect = host=127.0.0.1 dbname=cronos user=fantastes password=password
Ahora descomentamos y modificamos el parámetro «default_pass_scheme«, añadiendo el cifrado «SHA512-CRYPT«
default_pass_scheme = SHA512-CRYPT
Descomentamos «password_query» y añadimos la información:
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Modificamos permisos y asignamos nuevo usuario a la carpeta /etc/dovecot
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
Abrimos y modificamos el fichero /etc/dovecot/conf.d/10-master.conf, modificando varios parámetros, para que quede de la siguiente manera:
nano /etc/dovecot/conf.d/10-master.conf
La primera parte debe quedar así:
##Descomentamos inet_listener_imap y lo modificamos por port 0
service imap-login {
inet_listener imap {
port = 0
}
#Creamos el socket LMTP con esta configuracion
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
Modificamos el parámetro «unix_listener» dentro del apartado «service_auth» :
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
user = dovecot
}
Modifcamos el apartado «service auth-worker» para que quede así:
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn't necessary, the user should be changed to
# $default_internal_user.
user = vmail
}
Guardamos y pasamos al fichero /etc/dovecot/conf.d/10-ssl.conf, lo revisamos y si un caso lo modificamos, para que quede de la siguiente manera:
nano /etc/dovecot/conf.d/10-ssl.conf
Comprobamos que el parámetro «ssl» es el siguiente:
ssl = required
Verificamos y modificamos, si es necesario, los parámetros «ssl_cert» y «ssl_key» :
Reiniciamos el servicio Dovecot:
service dovecot restart
EDITADO ABRIL 2016
Gracias a la colaboración de los usuarios de la web, hemos visto que debido a diferentes problemas de certificado ssl, el servidor no funcionaba. Tanto en su parte IMAP en lo que a Dovecot, como en la parte SMTP de Postfix. Para solucionarlo vamos a ver primero la parte de Dovecot, la solución al final no es complicada, en el fichero /etc/dovecot/conf.d/10-ssl.conf, debemos descomentar la línea:
ssl_ca = /etc/ssl/certs/ca.pem
Y dejar como la tengo yo. A continuación nos iremos a la carpeta /etc/ssl/certs/ y descargaremos el certificado:
wget http://www.startssl.com/certs/ca.pem
Para comprobar que la parte de Dovecot, está lista lo comprobamos con el siguiente comando:
dovecot -f
Respecto a la parte de Postfix, añadimos al siguiente línea en el fichero /etc/postfix/main.cf:
smtpd_tls_CAfile = /etc/postfix/cacert.pem
Ahora copias el respectivo certificado a la carpeta de Postfix
cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem
Con esto ya lo tendremos solucionado.
Ahora reinciaremos el sevidor y probaremos la cuenta davidochobits@ochobitsunbyte.pw en el cliente de correo Thunderbird.
Para ello primero modificaremos los DNS de nuestro dominio para crear un registro A y MX, por seguridad recomiendo que los registros apunten a CloudFlare, si no tenéis cuenta os podéis crear una, son gratuitas. Por defecto namecheap.com ya apunta sus DNS a CloudFlare, así que no tendremos que hacer ninguna modificación.
En CloudFlare debemos añadir o modificar:
- Registro «A» ochobitsunbyte.pw que apunte a nuestra IP
- Registro «A»correo que apunte a nuestra IP
- Registro «MX» de ochobitsunbyte.pw que apunte a correo.ochobitsunbyte.pw
Escogeremos el plan «Free Plan» que no tiene coste. El cambio de DNS puede tardar un poco, de hecho, hasta varias horas.
En Thunderbird los parámetros deberían ser como sigue:
- Nombre a mostrar: davidochobits
- Cuenta de correo: davidochobits@ochobitsunbyte.pw
- Contraseña: ‘nuestro password’
- Servidor de entrada: IMAP, correo.ochobitsunbyte.pw, Puerto 993, SSL/TLS, contraseña normal
- Servidor de salida: SMTP, correo.ochobitsunbyte.pw, Puerto 587, Automático, contraseña normal
- Usuario: davidochobits@ochobitsunbyte.pw
Y con esto nos debería funcionar, aquí os dejo una muestra:
En el fichero de log /var/log/mail.log podemos ver todo lo que sucede con nuestro server de correo.
Configurar SpamAssasin
Con SpamAssasin podremos evitar en gran medida el abuso del spam contra nuestras cuentas de correo. Pertenece al proyecto Apache
Para instalar el programa en nuestro servidor:
apt-get install spamassassin spamc
Para su funcionamiento necesitamos crear el usuario ‘spamd‘ :
adduser spamd --disabled-login
Debemos modificar el fichero /etc/default/spamassassin
nano /etc/default/spamassassin
Cambiamos el parámetro:
ENABLED=1
Las siguientes líneas deben de quedar así:
SPAMD_HOME="/home/spamd/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"
PIDFILE="${SPAMD_HOME}spamd.pid"
CRON=1
Guardamos y ahora modificamos el fichero /etc/spamassassin/local.cf De ésta manera configuraremos el nivel de seguridad. Podemos utilizar los siguientes parámetros de ejemplo:
rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe 0
required_score 5.0
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0
Por último modificamos uno de los ficheros de configuración de Postfix, para que cuenta con el servicio SpamAssassin :
nano /etc/postfix/master.cf
De las dos líneas siguientes, debemos buscar la primera y añadir a continuación la segunda:
submission inet n - - - - smtpd
-o content_filter=spamassassin
Y añadir justo al final del fichero:
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
Ahora ya podemos encender el servicio spamassassin y reiniciar postfix
service spamassassin sart
service postfix restart
Pues ya tenemos montado nuestro servidor de correo, con POSTFIX, DOVECOT y SPAMASSASIN, espero que haya sido de vuestro interés.
Me he ayudado de las siguientes fuentes: