
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:
1 | apt update && apt dist-upgrade -y && apt clean |
Primero que nada, deshabilitemos:
1 2 3 | 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:
1 | nano /etc/resolv.conf |
Y dejamos de la siguiente manera:
1 2 3 4 | 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:
1 2 3 | 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:
1 | groupadd -g 5000 vmail |
Usuario del sistema:
1 | useradd -d /home/vmail -s /bin/false -m -u 5000 -g 5000 -c "Virtual Mailbox Storage" vmail |
Instalando el combo Postfix+Dovecot+SASL
1 2 3 | 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:
1 | adduser postfix sasl |
Así postfix trabajará con la autenticación sasl.
Habilitando sasl
Ahora, debemos editar /etc/default/saslauthd debemos editar y dejar así:
1 | START=yes |
Para lo cual ejecutaremos:
1 | 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:
1 | apt install -y certbot |
Generando los certificados:
1 | certbot certonly --standalone -d mail.example.com -m admin@example.com --agree-tos |
Si usas certificados autofirmados:
1 2 3 4 5 | 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:
1 | nano /etc/dovecot/conf.d/10-mail.conf |
cambiar:
1 | mail_location = maildir:/home/vmail/%d/%n:INDEX=/home/vmail/%d/%n |
Editar:
1 | nano /etc/dovecot/conf.d/10-master.conf |
Descomentar:
1 2 3 4 5 6 7 8 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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í:
1 2 3 4 5 6 7 | service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } |
La sección de autenticación dejarla así:
1 2 3 4 5 | unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } |
Editar:
1 | nano /etc/dovecot/conf.d/10-ssl.conf |
cambiar:
1 2 | ssl = required ssl_protocols = TLSv1.2 |
Si se usan los certificados de Let’s Encrypt:
1 2 | ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem ssl_key = </etc/letsencrypt/live/example.com/privkey.pem |
Si se usan certificados autofirmados:
1 2 3 | ssl_key = </etc/ssl/mail/cert.key ssl_cert = </etc/ssl/mail/cert.crt ssl_dh = </etc/ssl/mail/dhparam.pem |
Además:
1 2 | 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:
1 | nano /etc/dovecot/conf.d/10-auth.conf |
cambiar:
1 2 | disable_plaintext_auth = yes auth_mechanisms = plain login |
comentar:
1 | #!include auth-system.conf.ext |
descomentar:
1 | !include auth-passwdfile.conf.ext |
Editar:
1 | nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext |
cambiar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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:
1 2 3 | touch /etc/dovecot/users chmod 640 /etc/dovecot/users chown root:dovecot /etc/dovecot/users |
Para generar el password del usuario:
1 | 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:
1 | usuario@dominio:{SHA512-CRYPT}hash-del-password:::::: |
Y por último Postfix:
Primero generaremos los certificados:
1 2 | 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:
1 | mv /etc/postfix/main.cf{,.orig} |
Editamos:
1 | nano /etc/postfix/main.cf |
Y agregamos esto[OJO: esto es un extracto de ejemplo, que funciona, pero que puede/debe ser mejorado]:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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:
1 | echo "mail.example.com" > /etc/mailname |
Añadiendo nuestro dominio:
1 | nano /etc/postfix/virtual_mailbox_domains |
Poner:
1 | example.com OK |
Hacer db del dominio:
1 | postmap /etc/postfix/virtual_mailbox_domains |
El fichero para evitar la suplantación de identidad:
1 2 | mkdir /etc/postfix/rules nano /etc/postfix/rules/sender_login.pcre |
Y el contenido:
1 | /^(.*)@example\.com$/ $1 |
Permitir smtp y smtps
1 | nano /etc/postfix/master.cf |
Ajustamos de la siguiente manera:
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 | 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:
1 2 3 | /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:
1 | @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:
1 | apt install -y iptables-persistent |
Hacemos backup de las reglas por default y agregamos las nuestras personalizadas:
1 | mv /etc/iptables/rules.v4{,.orig} |
Y creamos nueva configuración
1 | nano /etc/iptables/rules.v4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | *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:
1 | nano /usr/local/bin/add-mail-user |
Contenido:
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 | #!/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:
1 | chmod +x /usr/local/bin/add-mail-user |
¿Funcionamiento? Fácil, ejecutar en la consola del server:
1 | add-mail-user user1@example.com |
Y la configuración en el cliente[Thunderbird]:


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/
Dejar una contestacion