Servidor de correo en un VPS

Después de haber visto varios escenarios de cómo configurar un servidor de correo, hoy veremos como hacerlo pero dentro de un VPS donde no se cuenta con LDAP o MySQL/PostgreSQL como backends de almacenamiento de usuarios. Básicamente estaremos autenticando contra un archivo de texto, procedimiento sencillo y que es más que eficiente y suficiente para pocas cuentas de correo.

Este procedimiento es válido para Debian/Ubuntu, aunque si se adapta a AlmaLinux/RockyLinux debería funcionar del mismo modo. Se asume que ya usted tenga tenga actualizado el sistema:

apt update && apt dist-upgrade -y && apt clean

Primero que nada, deshabilitemos:

systemctl stop systemd-resolved
systemctl disable systemd-resolved
systemctl mask systemd-resolved

Ojo: Recordarles quiero que el sistema de correo depende de un vinculo estrecho con el sistema de dns. Así que configuren bien su archivo de resolución de nombres:

nano /etc/resolv.conf

Y dejamos de la siguiente manera:

search example.com
domain example.com
nameserver 8.8.8.8
nameserver 8.8.4.4

Antes de instalar algo debemos instalar los utilitarios básicos o herramientas que
necesitaremos para nuestro trabajo:

apt install -y arj arc bzip2 cabextract cpio file lzma xz-utils \
lhasa lzop rpm2cpio gzip nomarch pax lzop rar unrar unzip \
unace razor pyzor tnef zip p7zip-full mc rsync git && apt clean

Comenzamos con añadir el grupo de nuestros sistema de correo al que llamaré vmail:

groupadd -g 5000 vmail

Usuario del sistema:

useradd -d /home/vmail -s /bin/false -m -u 5000 -g 5000 -c "Virtual Mailbox Storage" vmail

Instalando el combo Postfix+Dovecot+SASL

apt install -y postfix postfix-{pcre,sqlite} \
dovecot-{common,core,pop3d,imapd,lmtpd} sasl2-bin libsasl2-modules \
ccze dnsutils net-tools && apt clean

Ahora debemos agregar el usuario postfix al grupo sasl:

adduser postfix sasl

Así postfix trabajará con la autenticación sasl.

Habilitando sasl

Ahora, debemos editar /etc/default/saslauthd debemos editar y dejar así:

START=yes

Para lo cual ejecutaremos:

sed -i 's/START=no/START=yes/g' /etc/default/saslauthd

Listo por acá. Ahora pasaremos a los certificados SSL.

Certbot – Lets Encrypt / Certificados autofirmados

Instalando el bot de los certificados Lets Encrypt:

apt install -y certbot

Generando los certificados:

certbot certonly --standalone -d mail.example.com -m [email protected] --agree-tos

Si usas certificados autofirmados:

mkdir /etc/ssl/mail
openssl ecparam -name prime256v1 -genkey -out /etc/ssl/mail/cert.key
openssl req -new -sha256 -key /etc/ssl/mail/cert.key -out /etc/ssl/mail/cert.csr -subj '/CN=*.example.com'
openssl req -x509 -sha256 -nodes -days 3650 -key /etc/ssl/mail/cert.key -in /etc/ssl/mail/cert.csr -out /etc/ssl/mail/cert.crt
openssl dhparam -out /etc/ssl/mail/dhparam.pem 4096

Ahora veamos Dovecot

Antes de seguir debemos entender las variables usadas por Dovecot:

%u – usuario, nombre de usuario completo (por ejemplo: [email protected])
%n – usuario, parte del nombre del usuario que no incluye el dominio (por ejemplo: usuario)
%d – dominio, parte del usuario que no incluye el usuario (por ejemplo: dominio.tld)

Editar:

nano /etc/dovecot/conf.d/10-mail.conf

cambiar:

mail_location = maildir:/home/vmail/%d/%n:INDEX=/home/vmail/%d/%n

Editar:

nano /etc/dovecot/conf.d/10-master.conf

Descomentar:

inet_listener imaps {
    #port = 993
    #ssl = yes
}
inet_listener pop3s {
    #port = 995
    #ssl = yes
}

Si deseamos deshabilitar los puertos 110[pop3] y 143[imap v4] que son inseguros:

en /etc/dovecot/conf.d/10-master.conf debemos comentar los puertos y añadir port = 0

service imap-login {
    inet_listener imap {
        #address = none
        #port = 143
        port=0
        }
    }
service pop3-login {
    inet_listener pop3 {
        #address = none
        #port = 110
        port=0
        }
    }

La sección lmtp dejarla así:

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        mode = 0600
        user = postfix
        group = postfix
    }
}

La sección de autenticación dejarla así:

unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
}

Editar:

nano /etc/dovecot/conf.d/10-ssl.conf

cambiar:

ssl = required
ssl_protocols = TLSv1.2

Si se usan los certificados de Let’s Encrypt:

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

Si se usan certificados autofirmados:

ssl_key = </etc/ssl/mail/cert.key
ssl_cert = </etc/ssl/mail/cert.crt
ssl_dh = </etc/ssl/mail/dhparam.pem

Además:

ssl_prefer_server_ciphers = yes
ssl_cipher_list = EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !CAMELLIA !SEED

Editar:

nano /etc/dovecot/conf.d/10-auth.conf

cambiar:

disable_plaintext_auth = yes
auth_mechanisms = plain login

comentar:

#!include auth-system.conf.ext

descomentar:

!include auth-passwdfile.conf.ext

Editar:

nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext

cambiar:

passdb {
    driver = passwd-file
    args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

userdb {
    driver = passwd-file
    args = username_format=%u /etc/dovecot/users

# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
default_fields = uid=vmail gid=vmail home=/home/vmail/%d/%n

# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
}

Ahora creamos el archivo donde se van a almacenar los usuarios:

touch /etc/dovecot/users
chmod 640 /etc/dovecot/users
chown root:dovecot /etc/dovecot/users

Para generar el password del usuario:

doveadm pw -s SHA512-CRYPT

Nota: Como este proceso es engorroso, al final adjunto script de creación de los usuarios, para mejorar este punto.

Y el formato del archivo de password:

usuario@dominio:{SHA512-CRYPT}hash-del-password::::::

Y por último Postfix:

Primero generaremos los certificados:

openssl dhparam -2 2048 > /etc/ssl/mail/dh_2048.pem
openssl dhparam -2 1024 > /etc/ssl/mail/dh_1024.pem

Ahora procederemos a configurar Postfix:

mv /etc/postfix/main.cf{,.orig}

Editamos:

nano /etc/postfix/main.cf

Y agregamos esto[OJO: esto es un extracto de ejemplo, que funciona, pero que puede/debe ser mejorado]:

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

#Si usas certificados Let's Encrypt
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem

# Si usas certificados autofirmados
smtpd_tls_cert_file = /etc/ssl/mail/cert.crt
smtpd_tls_key_file = /etc/ssl/mail/cert.key

smtpd_tls_dh1024_param_file = /etc/ssl/mail/dh_2048.pem
smtpd_tls_dh512_param_file = /etc/ssl/mail/dh_1024.pem

smtpd_sender_login_maps = pcre:/etc/postfix/rules/sender_login.pcre

smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains

myhostname = mail.example.com
myorigin = /etc/mailname
mydestination = localhost.$mydomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

Ahora crear el dominio:

echo "mail.example.com" > /etc/mailname

Añadiendo nuestro dominio:

nano /etc/postfix/virtual_mailbox_domains

Poner:

example.com    OK

Hacer db del dominio:

postmap /etc/postfix/virtual_mailbox_domains

El fichero para evitar la suplantación de identidad:

mkdir /etc/postfix/rules
nano /etc/postfix/rules/sender_login.pcre

Y el contenido:

/^(.*)@example\.com$/	$1

Permitir smtp y smtps

nano /etc/postfix/master.cf

Ajustamos de la siguiente manera:

smtp      inet  n       -       y       -       -       smtpd
  -o smtpd_discard_ehlo_keywords=silent-discard,auth,etrn,dsn
  -o smtpd_tls_security_level=may

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_tls_security_options=noanonymous
  -o smtpd_tls_auth_only=yes
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_dh1024_param_file=/etc/ssl/mail/dh_2048.pem
  # Si usas Let's Encrypt:
  -o smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
  -o smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
  # Si usar certificados autofirmados:
  -o smtpd_tls_cert_file=/etc/ssl/mail/cert.crt
  -o smtpd_tls_key_file=/etc/ssl/mail/cert.key
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_sender_login_maps=pcre:/etc/postfix/rules/sender_login.pcre
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=

Listo. Ahora a reiniciar Postfix, Dovecot y SASL:

/etc/init.d/saslauthd restart
/etc/init.d/dovecot restart
/etc/init.d/postfix restart

Si usas Let’s Encrypt añade lo siguiente al crontab, para renovar los certificados una vez al mes:

@monthly certbot renew --quiet && /etc/init.d/dovecot restart && /etc/init.d/postfix restart

Ya que estás de cara a internet o de cara a un ambiente hostil, pon firewall:

apt install -y iptables-persistent

Hacemos backup de las reglas por default y agregamos las nuestras personalizadas:

mv /etc/iptables/rules.v4{,.orig}

Y creamos nueva configuración

nano /etc/iptables/rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -s 192.168.0.3/32 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 200.55.100.2/29 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 25,80,443,465,993,995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m multiport --dports 25,80,443,465,993,995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
COMMIT

Para finalizar, añado un script mencionado anteriormente creado por mí para añadir/actualizar usuarios a este servidor:

nano /usr/local/bin/add-mail-user

Contenido:

#!/bin/bash

# AddMailUser, an interactive script for plain text file user creation on dovecot mailserver.
# Copyright (C) 2021 Leslie León <[email protected]>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see <http://www.gnu.org/licenses/>.

[ -z "$1" ] && { echo "Error: Username missing. Usage: add-mail-user [email protected]"; exit 1; }

password=`(doveadm pw -s SHA512-CRYPT)`
account="${1}:${password}::::::"

if grep -qF "$1" /etc/dovecot/users;then
   sed -i "/$1/d" /etc/dovecot/users && echo ${account} >> /etc/dovecot/users && echo "Password for user $1 updated successfully" 
else
   echo ${account} >> /etc/dovecot/users && echo "User $1 created successfully"
fi

Permisos de ejecución:

chmod +x /usr/local/bin/add-mail-user

¿Funcionamiento? Fácil, ejecutar en la consola del server:

add-mail-user [email protected]

Y la configuración en el cliente[Thunderbird]:

Configuración de POP3+SSL
Configuración de SMTP+SSL

Y ahora si acabé :D.

Adjunto link a repo de github con todos los archivos usados de ejemplo, para que se guíen en caso de dudas. Saludos y espero les sirva.

Agradecimientos:

A mi compañero de inventos @danny920825 y a @TicoAM_cu, que me pone a inventar.

Referencias:

[1] https://www.vultr.com/docs/how-to-install-postfix-dovecot-and-roundcube-on-ubuntu-20-04
[2] https://wiki.meurisse.org/wiki/Dovecot
[3] https://syslink.pl/cipherlist/

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 4

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*