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 admin@example.com --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: usuario@dominio.tld)
%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 <leslie84@nauta.cu>
#
# 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 username@domain.tld"; 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 user1@example.com

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?

Leslie León Sinclair

Share
Published by
Leslie León Sinclair

Recent Posts

SquidStat, analizador de logs de squid diferente y 100% cubano

Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…

3 días ago

n8n Transformando la Automatización de Flujos de Trabajo con Inteligencia Artificial

La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…

2 semanas ago

Alta disponibilidad de sus base de datos con Percona XtraDB Cluster en Kubernetes

Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…

2 años ago

Home automation (Parte 3) – ESPHome

Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…

2 años ago

Home automation (Parte 2) – Home Assistant

Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…

2 años ago