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]:
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/
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…
La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…
Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…
Percona Monitoring and Management (PMM) es una herramienta de código abierto para la supervisión y…
Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…
Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…