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]:
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